最早在网页中引入JavaScript拖放功能是IE4。当时,网页中只有两种对象可以拖放:图像和某些文本。在IE4中,唯一有效的放置目标是文本框。到了IE5,拖放功能得到拓展,添加了新的事件,而且几乎网页中的任何元素都可以作为放置目标。IE5.5更进一步让网页中的任何元素都可以拖放。HTML5以IE的实例为基础指定了拖放规范。

拖放事件

拖动某些元素时,将一次触发下列事件(被拖放元素上的事件):

  • dragstart

  • drag

  • dragend

拖动开始时,可以通过ondragstart事件处理程序来运行JavaScript代码。触发dragstart事件后,随即会触发drag事件,而且在元素被拖动期间会持续发送该事件。这个事件与mousemove事件相似,在鼠标移动过程中,mousemove事件也会持续发生。当拖动停止时(无论是把元素放到了有效的放置目标,还是放到了无效的放置目标上),会触发dragend事件。

浏览器不会在拖动期间改变被拖动元素的外观,但你可以自己修改。

当元素被拖放到一个有效的放置目标上时,下列事件会依次发生(放置目标元素上的事件):

  • dragenter

  • dragover

  • dragleavedrop

只要元素被拖动到放置目标上,就会触发dragenter事件(类似于mouseover事件)。

紧随其后的是dragover事件,而且被拖动的元素还在放置目标的范围内移动时,就会持续触发该事件。

如果元素被拖出了放置目标,dragover事件不再发生,但会触发dragleave事件(类似于mouseout事件)。

如果元素被放到了放置目标中,则会触发drop事件而不是dragleave事件。

自定义放置目标

可以把任何元素变成有效的放置目标,方法是重写dragenter和dragover事件的默认行为。

var droptarget = document.getElementById("droptarget");
droptarget.ondragover = function() {event.preventDefault();
};
droptarget.ondragenter = function () {event.preventDefault();
};

在Firefox 3.5+中,放置事件的默认行为是打开被放到放置目标上的URL。因此,为了让Firefox支持正常的拖放,还要取消drop事件的默认行为,阻止它打开URL:

var droptarget = document.getElementById("droptarget");
droptarget.ondragover = function() {event.preventDefault();
};
droptarget.ondragenter = function () {event.preventDefault();
};
droptarget.ondrop = function () {event.preventDefault();
};

dataTransfer对象

为了在拖放操作时实现数据交换,IE 5引入了

  • dataTransfer对象

它是事件对象的一个属性,用于从被拖动元素向放置目标传递字符串格式的数据。因为它是事件对象的属性,所以只能在拖放事件的事件处理程序中访问dataTransfer对象。

dataTransfer对象有两个主要方法:

  • getData()

  • setData()

getData()可以取得由setData()保存的值。setData()方法的第一个参数,也是getDAta()方法唯一的一个参数,是一个字符串,表示保存的数据类型,取值为”text”或“URL”,如下所示:

//设置和接收文本数据
event.dataTransfer.setDAta("text", "some text");
var text = event.dataTransfer.getData("text");//设置和接收URL
event.dataTransfer.setData("URL", "HTML://www.w3cmm.com/");

IE只定义了“text”和“URL”两种有效的数据类型,而HTML5则对此加以扩展,允许指定各种MIME类型。HTML5也支持“text”和“URL”,但这两种类型会被映射为“text/plain”“text/uri-list”

保存在dataTransfer对象中的数据只能在drop事件处理程序中读取。在拖动文本框中的文本时,浏览器会调用setData()方法,将拖动的文本以“text”格式保存在dataTransfer对象中。类似地,在拖放链接或图像时,会调用setData()方法并保存URL。也可以在dragstart事件处理程序中调用setData(),手工保存自己要传输的数据,以便将来使用。

Firefox在其第5个版本之前不能正确地将“URL”和“text”映射为“text/uri-list”和“text/plain”。但是却能把“Text”映射为“text/plain”。为了更好地在跨浏览器的情况下从dataTransfer对象取得数据,最好在取得URL数据时检测两个值,而在取得文本数据时使用“text”。

var dataTransfer = event.dataTransfer;
//读取URL
var url = dataTransfer.getData("url") || dataTransfer.getData("text/uri-list");
//读取文本
var text = dataTransfer.getData("Text");

dropEffect与effectAllowed

利用dataTransfer对象,可不光是能够传输数据,还能通过它来确定被拖动的元素以及作为放置目标的元素能够接受什么操作。为此,需要访问dataTransfer对象的两个属性:

  • dropEffect

  • effectAllowed

通过dropEffect属性可以知道被拖动的元素能够执行哪种放置行为。这个属性有下列4个可能的值:

  • none:不能把拖动的元素放在这里。这是除文本框之外所有元素的默认值。

  • move:应该把拖动的元素移动到放置目标。

  • copy:应该把拖动的元素复制到放置目标。

  • link:表示放置目标会打开拖动的元素(但拖动的元素必须是一个链接,有URL)。

要使用dropEfect属性,必须在ondraggenter事件处理程序中针对放置目标来设置它。

dropEffect属性只有搭配effectAllowed属性才有用。effectAllowed属性表示允许拖放元素的哪种dropEffect,effectAllowed属性可能的值如下:

  • uninitialized:没有该被拖动元素放置行为。

  • none:被拖动的元素不能有任何行为。

  • copy:只允许值为copy的dropEffect。

  • link:只允许值为link的dropEffect。

  • move:只允许值为move的dropEffect。

  • copyLink:允许值为copy和link的dropEffect。

  • copyMove:允许值为copy和link的dropEffect。

  • linkMove:允许职位link和move的dropEffect。

  • all:允许任意dropEffect。

必须在ondraggstart事件处理程序中设置effectAllowed属性。

可拖动

让其它元素可以拖动也是可能的。HTML5为所有HTML元素规定了一个draggable属性,表示元素是否可以拖动。

<!-- 让这个图像不可以拖动 -->
<img src="smile.gif" draggable="false" alt+"Smiley face">
<!-- 让这个元素可以拖动 -->
<div draggable="true">...</div>

其他成员

HTML5规范规定dataTransfer对象还应该包含下列方法和属性。

  • addElement(element):为拖动操作添加一个元素。添加这个元素只影响数据(即增加作为拖动源而影响回调的对象),不会影响拖动操作时页面元素的外观。在写作文本时,只有Firefox 3.5+实现了这个方法。

  • clearData(format):清除以特定格式保存的数据。实现这个方法的浏览器有IE、Firefox 3.5、Chrome和Safari 4+。

  • setDragImage(element, x, y):指定一副图像,当拖动发生时,显示在光标下方。这个方法接受的三个参数分别是要显示的HTML元素和光标在图像中的x、y坐标。其中,HTML元素可以是一副图像,也可以是其它元素。是图像则显示图像,是其它元素则显示渲染后的元素。实现这个方法的浏览器有Firefox 3.5+、Safari 4+ 和 Chorme。

  • types:当前保存的数据类型。这是一个类似数组的集合,以“text”这样的字符串形式保存着数据类型。实现这个属性的浏览器有IE10+、Firefox 3.5+和Chrome。

JavaScript HTML5脚本编程——“原生拖放”的注意要点相关推荐

  1. JavaScript HTML5脚本编程——“跨文档消息传递”的注意要点

    跨文档消息传送(cross-document messaging),有时候也简称为XDM,指的是来自不同域的页面间传递消息.例如,www.wrox.com域中的一个页面与一个位于内嵌框架中的p2p.w ...

  2. JavaScript——基于原型编程、多范式的动态脚本语言

    目录 JavaScript 01 关于JavaScript 1.1 JS的发展历史 1.2 JS的特性 1.3 JS的组成 1.4 JSP和JS的区别 02 在HTML中嵌入JS代码的三种方式 2.1 ...

  3. 深入理解javascript原生拖放

    前面的话 拖放(drag-and-drop,DnD)其实是两个动作--拖和放.所以,它涉及到两个元素.一个是被拖的元素,称为拖放源:另一个是要放的目标,称为拖放目标.本文将通过拆分这两个概念来详细介绍 ...

  4. html5异步编程,一位前端菜鸟对于JavaScript同步异步编程的了解

    来自一个前端菜鸟的对于JavaScript同步异步编程的了解,以下内容,仅供参考.大家知道,JavaScript的执行环境是单线程的,单线程的好处是执行环境简单,不用去考虑诸如资源同步,死锁等多线程阻 ...

  5. html5 跳转参数不显示_TeeChart for PHP教程(十二):Javascript / HTML5图表

    TeeChart for PHP包含100%的PHP源代码.它支持PHP5及更高的版本.它可作为一个调色板组件整合到针对PHP的Delphi编程环境中,从而让其他人在运行时以创建组件的方式来引用.第一 ...

  6. 《Unity3d脚本编程 使用C#语言开发跨平台游戏》读书笔记1

    1.4脚本编程的优势 ·易于学习,代码维护方便,适合快速开发 ·开发成本低(因易于学习,所以可以启用新人,同时开发速度快,这些都是降低成本的方法) 2.2.1以速度作为衡量语言级别的标准,那么语言从低 ...

  7. 翻译连载 | 第 9 章:递归(下)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...

    为什么80%的码农都做不了架构师?>>>    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS> ...

  8. JavaScript / HTML5中的音效

    本文翻译自:Sound effects in JavaScript / HTML5 I'm using HTML5 to program games; 我正在使用HTML5来编写游戏; the obs ...

  9. SVG脚本编程简介(转)

    SVG脚本编程简介 本文主要介绍SVG的脚本编程,并分别给出放大.缩小,查询,鼠标事件等实例. 一.            SVG简介 SVG,全称为Scalable Vector Graphics( ...

  10. 《JavaScript高效图形编程(修订版)》——第2章 DHTML基础 2.1创建DHTML sprite

    本节书摘来自异步社区<JavaScript高效图形编程(修订版)>一书中的第2章,第2.1节,作者:[美]Raffaele Cecco著,更多章节内容可以访问云栖社区"异步社区& ...

最新文章

  1. rgb和yuv的区别
  2. python项目2019_2019 年 11 月精选 GitHub 上 几个牛逼 Python 的项目
  3. 【特征匹配】BRISK原文内容翻译
  4. Android进阶笔记:AIDL内部实现详解 (二)
  5. LeetCode 之 JavaScript 解答第141题 —— 环形链表 I(Linked List Cycle I)
  6. 前端小插件之手写js循环滚动特效
  7. 大厂十年:我的三段职业经历和八条建议!
  8. 网易云音乐刷听歌量_「PC端」解锁网易云音乐灰色歌曲,让你听歌不用东跑西跑...
  9. 【Java】使用MapReduce程序统计UV数量
  10. PyQT5-QProgressBar
  11. java与c++比较
  12. 如何解决Mac上隐藏红色通知标记?技巧来啦
  13. JSON 与JAVA对象之间的转换(转)
  14. 10慕课网《进击Node.js基础(一)》初识promise
  15. Introduction to SAP CPI
  16. mac air 2019安装双系统
  17. 是计算机系男神女神用英语怎么说,生日快乐我的男神英文怎么写
  18. 安全性测试(一)--网页安全检查
  19. linux查看历史命令history
  20. javalang 生成抽象语法树AST ----python源码分析

热门文章

  1. 鸡啄米vc++2010系列25(滚动条控件Scroll Bar)
  2. Syndication
  3. 中兴V889D刷机变砖不用怕 V889D救砖教程发布【转载】
  4. vue.js学习02之vue-cli脚手架创建项目环境搭建
  5. ActiveMQ的消息存储方式
  6. 数据结构之队列java版
  7. 01-Quartz2D
  8. 判断对象是否是某个类的实例
  9. CentOS7查看开放端口命令及开放端口号
  10. P5459 [BJOI2016]回转寿司