html5拖拽属性

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<style>
    li{
        width: 100px;
        height: 30px;
        background: #333;
        margin: 10px;
        color: #fff;
        list-style: none;
    }
    #d1{
        width: 100px;
        height: 100px;
        background: #FF0066;
        margin: 300px;
    }
</style>
<script>
    window.onload = function () {
        var aLi = document.getElementsByTagName('li');
        var oDiv = document.getElementById('d1');
        var num = 0;
        var oLi = null;
        for(var i =0;i<aLi.length;i++){
            aLi[i].index = i ;

            aLi[i].ondragstart = function (ev) {
                var ev = ev||event;
                ev.dataTransfer.setData('name',this.index);
                //this.style.background = 'green';
            }
            aLi[i].ondrag = function (e) {
                var e = e||event;
                num++;
                document.title = e.clientX;
            }
            aLi[i].ondragend = function () {
                this.style.background = '#333';
                num = 0;
            }
        }

        oDiv.ondragenter = function () {
            this.style.background = 'orange';
        }
        oDiv.ondragover = function (e) {
            //相对于dragenter 和dragleave的连续触发
//            document.title = num++;
//            要想触发drop事件,必须在dragover中阻止默认事件
            e.preventDefault();
        }
        oDiv.ondragleave = function () {
            this.style.background = 'red';
        }
        oDiv.ondrop = function (ev) {
            oDiv.appendChild(aLi[ev.dataTransfer.getData('name')]);
            for(var i = 0 ; i<aLi.length;i++){
                aLi[i].index = i ;
            }
        }
    }
</script>
<body>
<ul>
    <li draggable="true">a</li>
    <li draggable="true">b</li>
    <li draggable="true">c</li>
    <li draggable="true">d</li>
</ul>
<div id="d1"></div>
</body>
</html>

 

虽然通过dragstart、drag和dragend事件实现了原生拖拽。但是这仅仅是拖拽,在IE6和IE7中还是有些拖拽问题,并且也没有实现数据的交换。为了实现数据的交换,IE5引入了dataTransfer对象。dataTransfer对象是事件对象的一个属性,用于从被拖拽元素相放置目标传递字符串格式的数据。因为它是事件对象的属性,所以只能在拖放事件的事件处理程序中访问dataTransfer对象。在事件处理程序中,可以使用这个对象的属性和方法来完善拖放功能。

  dataTransfer对象有两个主要的方法:getData()方法和setData()方法。从这两个方法的英文字面意思上就能大概猜出来其用途。getData()方法可以取得由setData()方法保存的值。setData()方法的第一个参数,也是getData()方法唯一的一个参数,是用来保存数据类型的字符串,取值是”text”或”URL”。

 

在拖动目标上触发事件 (源元素)

ondragstart 事件在用户开始拖动元素或选择的文本时触发。

ondrag 元素正在拖动时触发

ondargend 用户完成元素拖动后触发

释放目标时触发的事件:

ondragenter 当被鼠标拖动的对象进入其容器范围内时触发此事件

ondragover 当某被拖动的对象在另一对象容器范围内拖动时触发此事件

ondragleave 当被鼠标拖动的对象离开其容器范围内时触发此事件

ondrop 在一个拖动过程中,释放鼠标键时触发此事件

dataTransfer,

dataTransfer.setData(key , value);//设置指定格式的数据赋值给dataTransfer

dataTransfer.setData(key)//取得dataTransfer传过来的值

dataTransfer.setDataImage(obj,x,y)//设置拖拽时更随鼠标显示的内容,并设定鼠标在更随显示内容上的X、Y坐标

 

模拟拖拽购物车:

 

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<style>
    *{
        margin: 0;
        padding: 0;
    }
    #shoplist{
        height: 370px;
    }
    #shoplist li{
        float: left;
        padding: 10px;
        border: 1px solid #E7E7E7;
        width: 200px;
        background: #FFF;
        margin: 10px;
        color: #333;
        list-style: none;
    }
    #shoplist img{ width: 200px; height: 285px}
    #shoplist p{
        line-height: 28px;
        border-bottom: 1px dashed #DCDCDC;
        font-size: 14px;
    }
    #d1{
        padding: 15px;
        width: 400px;
        height: 400px;
        background: #fff;
        border: 1px solid #999;
        margin: 30px;
        font-size: 14px;
    }
    #d1 p{
        height: 40px;
        line-height: 40px;
        border-bottom: 1px dashed #999;
    }
    #d1 span{
        float: left;
        display: block;
    }
    #d1 .n{
        width: 10%;
    }
    #d1 .t{
        width: 60%;
    }
    #d1 .money{
        width: 30%;
        text-align: right;
    }
    #d1 .m{
        text-align: right;
        line-height: 40px;
    }
</style>
<script>
    window.onload = function () {
        var oUl = document.getElementById('shoplist');
        var aLi = oUl.getElementsByTagName('li');
        var oDiv = document.getElementById('d1');
        var oAllmoney = null;
        var iNum = 0;
        var oData = {};

        for(var i =0;i<aLi.length;i++){
            aLi[i].index = i ;

            aLi[i].ondragstart = function (ev) {//拖拽开始
                var ev = ev||event;
                var aP = this.getElementsByTagName('p');
                //设置拖拽需要传过去的值
                ev.dataTransfer.setData('title',aP[0].innerHTML);
                ev.dataTransfer.setData('money',aP[1].innerHTML);
                //设置拖拽时鼠标的样式
                ev.dataTransfer.setDragImage(this,0,0);
            }
        }


        oDiv.ondragover = function (ev) {
            ev.preventDefault();//阻止默认事件ondrop才会起作用
        }

        oDiv.ondrop = function (ev) {
            ev.preventDefault();//阻止默认事件,防止图片在新窗口打开

            //接收ondragstart里  ev.dataTransfer.setData传过来的值并存在变量里
            var t = ev.dataTransfer.getData('title');
            var money = ev.dataTransfer.getData('money');

            if(!oData[t]){
                //如果之前这本书不存在,就创建dom元素,并把数据填入
                var oP = document.createElement('p');
                oData[t] = t;

                var oSpan = document.createElement('span');
                oSpan.className = 'n';
                oSpan.innerHTML = 1;
                oP.appendChild(oSpan);

                var oSpan = document.createElement('span');
                oSpan.className = 't';
                oSpan.innerHTML = t;
                oP.appendChild(oSpan);

                var oSpan = document.createElement('span');
                oSpan.className = 'money';
                oSpan.innerHTML = money;
                oP.appendChild(oSpan);

                oDiv.appendChild(oP);


            }else{
                //如果该书已在购物车,就不再添加,而只是修改书的数量
                var aN = d1.getElementsByClassName('n');
                var aT = d1.getElementsByClassName('t');

                for(var i = 0; i < aN.length; i++){
                    if(aT[i].innerHTML == t){//判断是增加哪一本书的数量
                        aN[i].innerHTML = parseInt(aN[i].innerHTML) + 1
                    }
                }
            }
            //创建总价统计dom元素,并添加到页面
            if(!oAllmoney){//如果之前没有就创建总价统计dom元素
                oAllmoney = document.createElement('div');
                oAllmoney.className = 'm';
            }

            iNum +=  parseFloat(money); //计算价格
            oAllmoney.innerHTML = iNum + '元';
            oDiv.appendChild(oAllmoney);
        }
    }
</script>
<body>
<ul id="shoplist">
    <li draggable="true">
        <img src="../img/9.jpg" alt=""/>
        <p>这是一个图片1</p>
        <p>30.5元</p>
    </li>
    <li draggable="true">
        <img src="../img/5.jpg" alt=""/>
        <p>这是一个图片2</p>
        <p>20.5元</p>
    </li>
    <li draggable="true">
        <img src="../img/6.jpg" alt=""/>
        <p>这是一个图片3</p>
        <p>50.5元</p>
    </li>
    <li draggable="true"> <img src="../img/8.jpg" alt=""/>
        <p>这是一个图片4</p>
        <p>40.5元</p>
    </li>
</ul>
<div id="d1">
    <!--<p>
        <span class="n">1</span><span class="t">2</span><span class="money"3></span>
    </p>
    <div class="m">000</div>-->
</div>
</body>
</html>

 

posted @ 2015-12-25 15:18  一直傻笑  阅读(825)  评论(0编辑  收藏  举报