HTML5拖动:事件 及 DataTransfer对象

拖放是 HTML5 中非常常见的功能。 

注意: 为了让元素可拖动,需要使用 HTML5 draggable 属性。

提示: 链接和图片默认是可拖动的,不需要 draggable 属性。

在拖放的过程中会触发以下事件:

  • 在拖动目标上触发事件 (源元素):
    •  ondragstart - 用户开始拖动元素时触发
    •  ondrag - 元素正在拖动时触发
    •  ondragend - 用户完成元素拖动后触发
  • 释放目标时触发的事件:
    •  ondragenter - 当被鼠标拖动的对象进入其容器范围内时触发此事件
    •  ondragover - 当某被拖动的对象在另一对象容器范围内拖动时触发此事件(可用用来清除浏览器默认行为,保证ondrop事件正常触发)
    •  ondragleave - 当被鼠标拖动的对象离开其容器范围内时触发此事件
    •  ondrop - 在一个拖动过程中,释放鼠标键时触发此事件

注意: 在拖动元素时,每隔 350 毫秒会触发 ondrag 事件。

代码片段: 

<ul>
  {
    listAry.map((item, index) => {
      return <li key={index} id={item.id} style={{ left: `${index * 40}px` }}

        draggable="true" // HTML5,draggable 属性使元素可被拖动(链接和图片默认是可拖动的,不需要 draggable 属性)
        /*
        拖拽事件产生时不会触发对应的鼠标事件
        */

        // 用户开始拖动元素时触发
        onDragStart={(ev) => {
          ev.dataTransfer.setData("Text", ev.target.id);
        }}
        // 元素正在拖动时触发
        onDrag={(ev) => {

        }}

        // 用户完成元素拖动后触发
        onDragEnd={(ev) => {

        }}
        // 当被鼠标拖动的对象进入其容器范围内时触发此事件
        onDragEnter={(ev) => {
          console.log("onDragEnter", ev.target.id)

        }}

        /*
        当某被拖动的对象在另一对象容器范围内拖动时(连续)触发此事件
        由于是连续触发,多少会影响性能,而其功能完全可被其它事件代替,
        它的作用:
            在html5中,遇到ondrop()事件无效,可能原因是浏览器的默认操作。
            可以在此事件中执行事件阻止系统的默认操作。
        */
        onDragOver={(ev) => {
          ev.preventDefault();
        }}
        // 当被鼠标拖动的对象离开其容器范围内时触发此事件
        onDragLeave={(ev) => {
          console.log("onDragLeave", ev.target.id)

        }}

        // 在一个拖动过程中,在其容器范围内释放鼠标键时触发此事件
        onDrop={(ev) => {
          console.log("onDrop", ev.target.id)
          const data = ev.dataTransfer.getData("Text");
          ev.target.appendChild(document.getElementById(data));
        }}

      >{item.name}</li>
    })
  }
</ul>

 

DataTransfer 对象

拖放触发的拖放事件有一个dataTransfer属性,该属性值是一个DataTransfer对象,该对象包含如下属性和方法:

dataTransfer.setData(format, data):方法设置被拖数据的数据类型和值:如果给定类型的数据不存在,将被增加在数据的后面,而且作为新的数据类型出现。如果数据给定的类型已经存在,现有的数据将会在相同的位置被取代。更换同类型的数据时,类型列表的顺序没有改变。
  dataTransfer.setData()参数:
    Format:表示要添加到 拖动对象的拖动数据类型。
    Data:表示添加到拖动对象的数据
  返回值无。

dataTransfer.getData(format):获取DataTransfer对象中设置format格式的数据。其中format代表数据格式,data代表数据。

dataTransfer.clearData([format]):清除DataTransfer对象中format格式的数据,如果省略format格式,则意味着清除DataTransfer对象中的全部数据。

dataTransfer.dropEffect:设置或返回拖放目标上允许发生的拖放行为。如果此设置的拖放行为不在effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性值只允许none、copy、link、move值之一。

dataTransfer.effectAllowed:设置或返回被拖动元素允许发生的拖动行为。该属性值可设置为none、copy、copyLink、copyMove、link、linkMove、move、all、uninitialized。
  • none : 此项表示不允许放下(禁止任何操作)
  • copy : 允许复制
  • copyLink : 允许 copy 或者 link 操作
  • copyMove : 允许 copy 或者 move 操作
  • link : 允许在新地方建立与源的链接
  • linkMove : 允许 link 或者 move 操作
  • move : 允许移动到新的位置
  • all : 允许所有操作
  • uninitialized: 缺省值(默认值), 相当于 all

dataTransfer.items:该属性返回DataTransferItems对象,该对象代表了拖动数据。

dataTransfer.setDragImage(element x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向的距离;y设置图标与鼠标在垂直方向的距离。

dataTransfer.addElement(element):添加自定义图标。

dataTransfer.types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。

 

posted @ 2020-10-23 16:00  真的想不出来  阅读(1107)  评论(0编辑  收藏  举报