HTML5 Dragend事件在firefox中没有触发

时间:2013-08-06 09:56:58

标签: javascript jquery html5 drag-and-drop

我正在对拖动开始进行一些更改,并希望在drop失败时还原它们。我在由 dragend 触发的函数中编写了这个逻辑。这在 Chrome 中非常有效,但在 firefox 中,“Dragend”事件不会被触发。

有谁可以告诉我一些关于这种行为的事情?我在ubantu上使用firefox 22.0。

代码如下

    $(".view-controller").on("dragover", that.dragOverMain);
    $(".view-controller").on("dragenter", that.dragEnterMain); 
    $(".view-controller").on("dragexit dragleave", that.dragExitMain);
    $(".view-controller").on("dragend", that.dragEndMain);       
    $(".view-controller").on("drop", that.dropMain);

    $(".view-controller").children().on("dragstart", function(e) {
        that.dragStartChild(e);
    });
    $(".view-controller").children().on("dragend", function(e) {
        that.dragEndMain(e);
    }); 

    dragStartChild: function(e) { console.log('dragStartChild'); },
    dragEndMain: function(e) { console.log('dragEndMain'); e.preventDefault(); },
    dropMain: function(e) { console.log('dropMain'); e.preventDefault(); },
    dragExitMain: function(e) { console.log('dragExitMain'); e.preventDefault(); },
    dragEnterMain: function(e) { console.log('dragEnterMain'); e.preventDefault(); },
    dragOverMain: function(e) { console.log('dragOverMain'); e.preventDefault(); },

3 个答案:

答案 0 :(得分:7)

Firefox要求在event.dataTransfer.setData(...)事件中设置拖动数据dragstart)。如果不设置此数据,dragstart事件将会触发,但dragend事件不会被激活。

https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API/Drag_operations#dragstart

  

要使另一个HTML元素可拖动,必须完成三件事:

     
      
  1. 在要进行可拖动的元素上将draggable属性设置为true。
  2.   
  3. 为dragstart事件添加侦听器
  4.   
  5. 在上面定义的侦听器中设置拖动数据。
  6.   

示例:

<div draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'This text may be dragged')">
  This text <strong>may</strong> be dragged.
</div>

答案 1 :(得分:5)

试试这个。

<div ondragend="dragEndMain(event)" class="viewcontroller">
<!-- some html -->
</div>

基本上绑定html本身的javascript事件。

答案 2 :(得分:2)

值得补充的是,Firefox有一个错误,如果你移动或删除DOM元素作为拖放功能的一部分,导致dragend不会触发。

https://bugzilla.mozilla.org/show_bug.cgi?id=460801

将DOM操作移动到我在dragend上调用的方法为我解决了这个问题。