考虑这个JSFiddle。它在 Firefox (14.0.1) 中运行良好,但在 Windows (7) 和 OS X (10.8) 上的 Chrome (21.0.1180.75)、Safari (?) 和 Opera(12.01?) 中失败。据我所知,问题出在对象上的setData()
orgetData()
方法上。dataTransfer
这是来自 JSFiddle 的相关代码。
var dragStartHandler = function (e) {
e.originalEvent.dataTransfer.effectAllowed = "move";
e.originalEvent.dataTransfer.setData("text/plain", this.id);
};
var dragEnterHandler = function (e) {
// dataTransferValue is a global variable declared higher up.
// No, I don't want to hear about why global variables are evil,
// that's not my issue.
dataTransferValue = e.originalEvent.dataTransfer.getData("text/plain");
console.log(dataTransferValue);
};
据我所知,这应该可以正常工作,如果您在拖动项目时查看控制台,您会看到写出的 id,这意味着它可以很好地找到元素并抓住它的 id 属性。问题是,是不设置数据还是不获取数据?
我会很感激建议,因为经过一周的尝试和大约 200 多个版本,我开始失去理智。我所知道的是它曾经在 60 版左右工作,并且特定代码根本没有改变......
实际上,6X 和 124 之间的主要区别之一是我将事件绑定从 更改这已被揭穿。事件绑定方法对问题没有影响。live()
为on()
. 我不认为这是问题所在,但在处理 DnD 时,我发现 Chrome 出现了一些失败。
更新
我创建了一个新的JSFiddle,它完全去除了所有内容,只留下了事件绑定和处理程序。我用 jQuery 1.7.2 和 1.8on()
和live()
. 问题仍然存在,所以我降低了一个级别并删除了所有框架并使用纯 JavaScript。问题仍然存在,因此根据我的测试,不是我的代码失败了。相反,Chrome、Safari 和 Opera 似乎都在实施setData()
或getData()
不符合规范,或者只是由于某种原因而失败。如果我错了,请纠正我。
无论如何,如果您查看新的 JSFiddle,您应该能够复制该问题,只需在拖动指定接受放置的元素时查看控制台。我已经开始使用Chromium开了一张票。最后我可能仍然做错了什么,但我现在根本不知道如何做 DnD。新的 JSFiddle 被尽可能地精简了......