zoukankan      html  css  js  c++  java
  • HTML5 拖动

    触发的事件有:dragstart事件、drag事件和dragend事件。

    按下鼠标键并开始移动鼠标的时候,会在被拖拽的元素上触发dragstart事件。这时候光标变成”不能放”符号(圆环中有一条反斜线),表示不能把元素放在自己上门。拖拽开始时,可以通过ondragstart事件处理程序运行JavaScript代码。

      触发dragstart事件后,随即会触发drag事件,而在元素被拖动期间会持续触发drag事件。这个事件与mousemove和touchmove事件类似。当拖动停止时(无论把元素放到了有效的放置目标,还是放到了无效的放置目标上),都会发生dragend事件。

      上面说的三个事件的目标都是被拖动的元素触发。默认情况下,浏览器不会再拖动期间改变被拖动元素的外观。但是可以自行修改。不过,大多数浏览器会为正被拖动的元素创建一个半透明的副本,这个副本始终跟随光标移动。当某个元素被拖动到一个有效的放置目标的时候,会触发的事件有:dragenter事件、dragover事件和dragleave或者drop事件。

      只要有元素被拖动到放置目标上,就会触发dragenter事件(类似于mouseover事件)。紧随其后的是dragover事件,而且在被拖动的元素还在放置目标的范围内移动是,会连续触发dragover事件。如果元素被拖出放置目标,dragover事件不再发生,但是会触发dragleave事件(类似于mouseout事件)。如果元素被放到了放置目标中会触发drop事件而不是dragleave事件。dragenter事件、dragover事件和dragleave或者drop事件的目标都是作为放置目标的元素。

      自定义放置目标

      在拖动元素经过某些无效放置目标的时候,可以看到一种特殊鼠标手势(圆环中一条反斜线),表示不能放置。虽然所有元素都支持放置目标事件,但是这些元素默认是不允许放置的。如果拖动元素经过不允许放置的元素,无论用户如何操作,都不会发生drop事件。不过,你可以把任何元素变成有效的放置目标,方法是重写dragenter和dragover事件的默认行为。

      重写了默认行为之后,就会发现当拖动着元素移动到放置目标上的时候,光标变成允许放置的符号。在Firefox 3.5+中,放置事件的默认行为是打开被放到放置目标上的url。如果是把图像拖到放置目标上,页面就会转向图像文件。如果是把文本拖放到放置目标上,则会导致无效url错误。所以为了让Firefox支持政正常的拖放,还要取消drop事件的默认行为,阻止打开拖拽元素的URL。

    <!DOCTYPE HTML>
    <html>
    <head>
    <meta charset="utf-8" />
    <title>HTML5 拖动</title>
    <style type="text/css">
    .box { width: 500px; padding: 10px; border: 1px solid #aaaaaa; height: 70px; }
    #drag { background-color: #090; height: 70px; width: 150px; font-family: Arial; font-size: 14px; color: #FFF; text-align: center; line-height: 70px; }
    </style>
    <script type="text/javascript">
    Object.prototype.startDrag=function(drop,callback){
    this.draggable=true;
    this.addEventListener('dragstart',function(e){
    e.dataTransfer.setData('Text',e.target.id);
    });
    drop.addEventListener('dragover',function(e){
    e.preventDefault();
    });
    drop.addEventListener('drop',function(e){
    e.preventDefault();
    this.dataTransfer={
    target:document.getElementById(e.dataTransfer.getData('Text'))
    };
    callback(this);
    });}
    
    window.onload = function() {
    var drop = document.getElementById('box');
    var drag = document.getElementById('drag');
    drag.startDrag(drop, function(e){
    e.appendChild(e.dataTransfer.target);
    });
    
    drag.startDrag(document.getElementById('boxrr'), function(e){
    e.appendChild(e.dataTransfer.target);
    });
    
    }
    </script>
    </head>
    <body>
    <div id="box" class="box"></div>
    <p>&nbsp;</p>
    <div id="boxrr" class="box"></div>
    <br />
    <div id="drag">Drag it</div>
    </body>
    </html>

    FQ出去问了下谷歌找到了DataTransfer的API,下面就介绍一下:

    DataTransfer

    拖拽数据传递对象,一般使用方式event.dataTransfer。

    dataTransfer . dropEffect [ = value ]

    拖拽效果,可选值:“none”, “copy”, “copyLink”, “copyMove”, “link”, “linkMove”, “move”, “all”, and “uninitialized”。

    dataTransfer . items

    拖拽的数据集合,是一个数组。

    dataTransfer . setDragImage (element, x, y)

    Uses the given element to update the drag feedback, replacing any previously specified feedback.

    英文有点拗口,就是拖拽过程中定义一个元素替换原有的,可以看到拖拽元素跟随的效果。

    dataTransfer . addElement (element)

    Adds the given element to the list of elements used to render the drag feedback.

    dataTransfer . types

    Returns a DOMStringList listing the formats that were set in the dragstart event. In addition, if any files are being dragged, then one of the types will be the string “Files”.

    data = dataTransfer . getData (format)

    Returns the specified data. If there is no such data, returns the empty string.

    获取自定义的数据格式,如ev.dataTransfer.getData("text");通常是配合ev.dataTransfer.setData使用。

    dataTransfer . setData (format, data)

    Adds the specified data.

    添加自定义数据格式,如ev.dataTransfer.setData("text", ev.target.innerHTML);有点像jquery里面的data

    dataTransfer . clearData ( [ format ] )

    Removes the data of the specified formats. Removes all data if the argument is omitted.

    清除自定义的数据格式及其数据。

    dataTransfer . files

    Returns a FileList of the files being dragged, if any.

    拖拽的文件列表对象。

    可参考,里面讲解很细:http://www.cnblogs.com/fsjohnhuang/p/3961066.html  

  • 相关阅读:
    C#中|(位或)和||(逻辑或)
    VS快捷键(转)
    C# 3.0 新特性 学习(二):匿名类型、扩展方法
    Highcharts 如何添加基准线
    怎样用Diskpart进行分区
    命名空间别名限定符 (::)
    NDK下 将Platinum SDK 编译成so库 (android upnp)
    在native线程利用JNI 反射自定义类
    GithubClient(ANDROID)开源之旅(一) 初探GitHub
    基于Platinum库的DMR实现(android)
  • 原文地址:https://www.cnblogs.com/steamedCray/p/5053309.html
Copyright © 2011-2022 走看看