Skip to main content

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 都不支持扩展的类型名,而且会 在遇到无法识别的类型名时抛出错误。