在删除功能

时间:2017-06-26 16:30:58

标签: javascript html5 google-chrome iframe drag-and-drop

编辑:现在已经在Chrome 72中修复了这个问题!

JSFiddle:https://jsfiddle.net/r8wxpujg/1/

在每次完整的拖放操作中,我都希望在被拖动的元素上触发dragstartdragend事件。上面链接的演示通过计算dragstartdragend事件来演示此效果。通过拖放操作移动图像时,dragstartdragend事件会触发,计数器会按预期递增。单击按钮时,不是移动图像而是移动iframe,而dragend计数器会停止递增,表示dragend事件永远不会被触发。

在Chrome中,在DOM中移动iframe会取消dragend事件被触发。

我在Firefox和IE11中对此进行了测试,并且在移动iframe时都有预期的行为。

我已经研究了几天了,而且一直无法找到任何信息,所以我想询问是否有人之前遇到此问题,或者是否有人有解决方案。这可能是Chrome中的错误吗?或者我只是遗漏了一些东西。

编辑:这是Chrome中已确认的错误,可在此处找到错误报告:https://bugs.chromium.org/p/chromium/issues/detail?id=737691

在问题得到解决之前,请参阅下面的保罗答案以获得解决方法。

3 个答案:

答案 0 :(得分:5)

我同意这是Chrome bug,但我没有解决方法。但在某些情况下,您可以通过延迟iframe移动来解决错误,直到拖动事件完成。它适用于this fork of your fiddle。只需更换

即可
if(element.id === 'div1drag') {
    document.getElementById('div1').appendChild(item);
}
else if(element.id === 'div2drag') {
    document.getElementById('div2').appendChild(item);
}

用这个

if(element.id === 'div1drag') {
    window.setTimeout(function() {
        document.getElementById('div1').appendChild(item);
    }, 0)
}
else if(element.id === 'div2drag') {
    window.setTimeout(function() {
        document.getElementById('div2').appendChild(item);
    }, 0)
}

另外,感谢您报告该错误。今天它让我发疯了。

答案 1 :(得分:1)

现在已在Chrome 72中修复。

答案 2 :(得分:0)

我使用的解决方法是,而不是收听def getCast[U <: T](path: String)(implicit tag: ClassTag[U]): Option[U] = tag.unapply(get(path)) 事件,我听取了dragEnd事件,它充分满足了我的需求,尽管它可能并不适用于所有人。