zoukankan      html  css  js  c++  java
  • HTML5 CSS3 专题 : 拖放 (Drag and Drop)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/31413767 

    本来准备写一个支持多图片拖拽上传的例子,但是为了更好的理解,先介绍一下HTML5的拖放。

    拖放(Drag 和 drop)是 HTML5 标准的组成部分。

    浏览器支持

    Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。

    被拖元素,dragElement : 

    1、添加事件:ondragstart

    2、添加属性:dragable

    放置元素,dropElement:

    1、添加事件:ondargenter , ondragover , ondragleave , ondragend ,ondrop

    和mouser划入划出一类的事件很类似,字面也很好理解,不赘述了,下面会用例子来说明。 

    1、页面上元素间的拖放

    下面用个小例子,div间的拖放来展示,各个事件如何被触发:

    <!DOCTYPE html>
    <html>
    <head>
        <title></title>
        <meta charset="utf-8"/>
    
        <style type="text/css">
    
            #dropEle
            div
            {
                float: left;
            }
    
        </style>
    
        <script src="../../jquery-1.8.3.js" type="text/javascript" charset="utf-8"></script>
    
    
        <script type="text/javascript">
    
            /**
             * 拖放(Drag 和 drop)是 HTML5 标准的组成部分。
             * 浏览器支持
             *Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。
             */
            $(function ()
            {
                $("#dragEle")[0].ondragstart = function (event)
                {
                    console.log("dragStart");
                    event.dataTransfer.setData("Text", event.target.id);
                };
    
                /**
                 * 当放置被拖数据时,会发生 drop 事件。
                 * 调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)
                 * @param event
                 */
                $("#dropEle")[0].ondrop = function (event)
                {
                 /*   for (var p in event.dataTransfer)
                    {
                        console.log(p + " = " + event.dataTransfer[p] + " @@");
                    }
                */
                    console.log("onDrop");
                    var id = event.dataTransfer.getData("Text");
                    $(this).append($("#" + id).clone().text($(this).find("div").length));
                    event.preventDefault();
                };
    
                /**
                 * ondragover 事件规定在何处放置被拖动的数据。
                 *默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。
                 */
                $("#dropEle")[0].ondragover = function (event)
                {
                    console.log("onDrop over");
                    event.preventDefault();
                }
    
                $("#dropEle")[0].ondragenter = function (event)
                {
                    console.log("onDrop enter");
                }
    
                $("#dropEle")[0].ondragleave = function (event)
                {
                    console.log("onDrop leave");
                }
    
                $("#dropEle")[0].ondragend = function (event)
                {
                    console.log("onDrop end");
                }
    
    
            });
    
        </script>
    
    </head>
    <body>
    
    <div style="border: 1px solid red ;  100px ; height: 100px ;text-align: center;line-height: 100px;"
         draggable="true" id="dragEle" >
    
    </div>
    
    
    <div style=" 330px;min-height: 202px;border: 1px solid #444;margin-top: 20px;overflow-y: scroll;"
         id="dropEle"></div>
    
    
    </body>
    </html>

    效果图:


    效果图注意看下console面板的输出:观察每个事件何时被触发。

    需要注意几点:

    a、ondragover中必须组织事件的默认行为,默认地,无法将数据/元素放置到其他元素中。

    b、drop 事件的默认行为是以链接形式打开,所以也需要阻止其默认行为。

    还有可能注意到:在拖放时,event中包含一个event.dataTransfer 对象,上例中我们使用了该对象的setData方法传递了拖动div的id,然后在drop中取得该id,并且复制了该元素添加到放置的div中。

    下面介绍下该对象的其他方法:

            event.dataTransfer :

    items = [object DataTransferItemList] @@drag_drop.html:44
    files = [object FileList] @@drag_drop.html:44
    types = text/plain @@drag_drop.html:44
    effectAllowed = all @@drag_drop.html:44
    dropEffect = none @@drag_drop.html:44
    clearData = function clearData() { [native code] } @@drag_drop.html:44
    getData = function getData() { [native code] } @@drag_drop.html:44
    setData = function setData() { [native code] } @@drag_drop.html:44
    setDragImage = function setDragImage() { [native code] } @@

    我使用了js打印出了它所有的属性:

    1、getData,setData上例已经使用了,clearData就是清除设置的数据。

    2、值得注意的是files,当把操作系统中选择的一个或多个文件拖入该div中,files中会存储拖入文件的信息,然后我们通过file可以得到文件的类型,长度,内容然后实现上传。

    3、setDragImage(image, x, y)用于设置鼠标移动过程中随鼠标一起移动的效果图。必须在dragstart中设置。

    4、types,effectAllowed和dropEffect分别是拖入元素的类型,拖拽过程中鼠标显示的样式,我觉得可以忽略了这几个属性,一般用不到。


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4924937.html
Copyright © 2011-2022 走看看