20.6.3dataTransfer对象
除非数据受影响,否则简单的拖放并没有实际意义。为实现拖动操作中的数据传输,IE5 在 event
对象上暴露了 dataTransfer
对象,用于从被拖动元素向放置目标传递字符串数据。因为这个对象是
event
的属性,所以在拖放事件的事件处理程序外部无法访问 dataTransfer
。在事件处理程序内部,
可以使用这个对象的属性和方法实现拖放功能。dataTransfer
对象现在已经纳入了 HTML5 工作草案。
dataTransfer
对象有两个主要方法:getData()
和 setData()
。顾名思义,getData()用于获
取 setData()
存储的值。setData()
的第一个参数以及 getData()
的唯一参数是一个字符串,表示要
设置的数据类型:"text"或"URL",如下所示:
// 传递文本
event.dataTransfer.setData("text", "some text");
let text = event.dataTransfer.getData("text");
// 传递 URL
event.dataTransfer.setData("URL", "http://www.wrox.com/");
let url = event.dataTransfer.getData("URL");
dataTransfer 对象实际上可以包含每种 MIME 类型的一个值,也就是说可以同时 保存文本
和
URL
,两者不会相互覆盖。存储在 dataTransfer 对象中的数据只能在放置事件中读取。如果没有在
ondrop
事件处理程序中取得这些数据,dataTransfer 对象就会被销毁,数据也会丢失。
在从文本框拖动文本时,浏览器会调用 setData()并将拖动的文本以"text"格式存储起来。类似 地,在拖动链接或图片时,浏览器会调用 setData()并把 URL 存储起来。当数据被放置在目标上时, 可以使用 getData()获取这些数据。当然,可以在 dragstart 事件中手动调用 setData()存储自定 义数据,以便将来使用。
作为文本的数据和作为 URL 的数据有一个区别。当把数据作为文本存储时,数据不会被特殊对待。 而当把数据作为 URL 存储时,数据会被作为网页中的一个链接,意味着如果把它放到另一个浏览器窗 口,浏览器会导航到该 URL。
直到版本 5,Firefox 都不能正确地把"url"映射为"text/uri-list"或把"text"映射为"text/plain"。 不过,它可以把"Text"(第一个字母大写)正确映射为"text/plain"。在通过 dataTransfer 获取 数据时,为保持最大兼容性,需要对 URL 检测两个值并对文本使用"Text":
let dataTransfer = event.dataTransfer;
// 读取 URL
let url = dataTransfer.getData("url") || dataTransfer.getData("text/uri-list");
// 读取文本
let text = dataTransfer.getData("Text");
这里要注意,首先应该尝试短数据名。这是因为直到版本 10,IE 都不支持扩展的类型名,而且会 在遇到无法识别的类型名时抛出错误。