Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML5 Dragend事件没有';不要在firefox中开火_Javascript_Jquery_Html_Drag And Drop - Fatal编程技术网

Javascript HTML5 Dragend事件没有';不要在firefox中开火

Javascript HTML5 Dragend事件没有';不要在firefox中开火,javascript,jquery,html,drag-and-drop,Javascript,Jquery,Html,Drag And Drop,我在drag start上做了一些更改,如果drop失败,我想恢复这些更改。我在一个由dragend触发的函数中编写了这个逻辑。这在Chrome中非常有效,但在firefox中不会触发“Dragend”事件 有人能告诉我一些关于这种行为的情况吗?我在乌班图上使用firefox 22.0 代码如下 $(".view-controller").on("dragover", that.dragOverMain); $(".view-controller").on("dragenter"

我在drag start上做了一些更改,如果drop失败,我想恢复这些更改。我在一个由dragend触发的函数中编写了这个逻辑。这在Chrome中非常有效,但在firefox中不会触发“Dragend”事件

有人能告诉我一些关于这种行为的情况吗?我在乌班图上使用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(); },
试试这个

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

基本上是用html本身绑定javascript事件。

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

:

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

  • 在要使其可拖动的元素上,将draggable属性设置为true
  • 为dragstart事件添加侦听器
  • 在上面定义的侦听器中设置拖动数据
  • 示例:

    <div draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'This text may be dragged')">
      This text <strong>may</strong> be dragged.
    </div>
    
    
    此文本可以拖动。
    
    值得在此补充的是,Firefox有一个bug,如果您在拖放功能中移动或删除DOM元素,就会导致dragend无法启动


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

    也许:顺便说一句,为什么不提供相关代码?一个JSFIDLE会很好…谢谢,但我已经应用了prevent Default,它没有调用,可能是其他的东西,我在这里编辑了代码。我还注意到esc键在mozila中取消了拖动,但在chromeAt中至少不能更改你的
    ev.preventDefault()
    e.preventDefault()
    因为您命名了事件变量
    e
    。这是一个psuedo代码,正如在常规函数中一样,我使用了一个不同的变量ev,它保存了mozila中的事件和其他函数中的e.orignalevent中的事件