7

我正在对拖动开始进行一些更改,并希望在放置失败时恢复它们。我在一个由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(); },
4

3 回答 3

8

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. 为 dragstart 事件添加监听器
  3. 在上面定义的侦听器中设置拖动数据。

例子:

<div draggable="true" ondragstart="event.dataTransfer.setData('text/plain', 'This text may be dragged')">
  This text <strong>may</strong> be dragged.
</div>
于 2017-05-20T02:26:45.347 回答
5

试试这个。

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

基本上将javascript事件绑定在html本身中。

于 2014-08-22T09:57:36.537 回答
2

值得在这里补充的是,如果您在拖放功能中移动或删除 DOM 元素,Firefox 有一个错误会导致 dragend 不会触发。

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

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

于 2018-01-23T18:18:21.227 回答