【发布时间】:2012-08-09 06:28:04
【问题描述】:
考虑一下JSFiddle。它在 Firefox (14.0.1) 中运行良好,但在 Windows (7) 和 OS X (10.8) 上的 Chrome (21.0.1180.75)、Safari (?) 和 Opera(12.01?) 中失败。据我所知,问题出在setData() 或getData() 对象上的getData() 方法上。这是来自 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()。我不认为这是问题所在,但我发现 Chrome 在处理 DnD 时遇到了一些失败。
更新
我创建了一个新的JSFiddle,它完全去除了所有内容,只留下了事件绑定和处理程序。我使用 jQuery 1.7.2 和 1.8 对它进行了测试,同时使用了 on() 和 live()。问题仍然存在,所以我降低了一个级别并删除了所有框架并使用纯 JavaScript。问题仍然仍然存在,因此根据我的测试,不是我的代码失败了。相反,Chrome、Safari 和 Opera 似乎都在实施 setData() 或 getData() 不规范,或者只是由于某种原因而失败。如果我错了,请纠正我。
无论如何,如果您查看新的 JSFiddle,您应该能够复制该问题,只需在您拖动指定接受放置的元素时查看控制台。我已经用Chromium 开了一张票。最后我可能仍然做错了什么,但我现在根本不知道如何做 DnD。新的 JSFiddle 被尽可能地精简了......
【问题讨论】:
-
如下所述,这是 WHATWG 规范的问题。我在这里提交了一个错误 - w3.org/Bugs/Public/show_bug.cgi?id=23486
-
我必须同意 PPK(感谢您自己答案中的链接) - 只是不要使用“html5 native DnD”。去“复古香草”,只需使用鼠标向下/移动/向上,如本问题stackoverflow.com/questions/18425089/simple-drag-and-drop-code 中所述
-
FireFox 似乎确实存在其他浏览器没有的数据传输问题。见这里:bugzilla.mozilla.org/show_bug.cgi?id=580928
标签: javascript jquery html drag-and-drop