19

我有几个可拖动的元素

<div Class="question-item" draggable="true">Box 1: Milk was a bad choice.</div>
<div class="question-item" draggable="true">Box 2: I'm Ron Burgundy?</div>
<div class="question-item" draggable="true">Box 3: You ate the entire wheel of cheese?     </div>
<div class="question-item" draggable="true">Box 4: Scotch scotch scotch</div>

我有以下事件处理程序:

var $questionItems = $('.question-item');

$questionItems
  .on('dragstart', startDrag)
  .on('dragend', removeDropSpaces)
  .on('dragenter', toggleDropStyles)
  .on('dragleave', toggleDropStyles);


function startDrag(e){
  console.log('dragging...');
  addDropSpaces();
  e.stopPropagation();
}

function toggleDropStyles(){
  $(this).toggleClass('drag-over');
  console.log(this);
}


function addDropSpaces(){
  $questionItems.after('<div class="empty-drop-target"></div>');
}

function removeDropSpaces(){
  console.log("dragend");
  $('.empty-drop-target').remove()
}

为什么它只适用于第一个可拖动的。如果我拖动说最后一个可拖动的 - dragend 事件会立即触发。(我不想使用 jQuery UI 顺便说一句)

这对我来说毫无意义 - 它看起来像一个错误。

我在 OSX 上使用 Chrome v 30。

这是 JSFiddle 的链接:http: //jsfiddle.net/joergd/zGSpP/17/

(编辑:这是对以下问题的重复:当我拖动时,dragend、dragenter 和 dragleave 立即触发- 但我认为原始海报可以使用 jQuery UI,而我希望它是 HTML5 原生的)

4

4 回答 4

20

正如我在主题dragend、dragenter 和 dragleave 中提到的,当我拖动时立即触发,对我来说解决问题(看起来是 Chrome 错误)的方法是将 10 毫秒的 setTimeout 添加到处理程序中并在那个超时。

于 2013-12-22T21:18:17.430 回答
12

我没有直接的解决方案,但是在 dragStart 事件处理程序中更改 DOM 会导致此问题,并且任何更改 DOM 的代码都应该真正进入 dragEnter 事件处理程序 - 这样做,拖放事件会更可靠地触发。

不确定这是否是设计使然——不过感觉有点像错误。

于 2013-10-29T15:55:22.273 回答
6

这是一个已知的 chrome 问题。问题是,正如 Joerg 提到的那样,您在 dragstart 上操纵了 dom。

你可以这样做,但你需要在超时时这样做。

于 2016-04-14T08:33:51.400 回答
0

刚遇到同样的问题。我通过将元素位置更改为在 dragStart 中固定来操作 DOM。我使用 Ivan 的回答解决了我的问题,如下所示:

/* This function produced the issue */
function dragStart(ev) {
    /* some code */
    myElement.style.position="fixed";
}

/* This function corrected issue */
function dragStart(ev) {
    /*some code */
    setTimeout(function changePos() {
        myElement.style.position="fixed";
        }, 10);
}

您的问题的答案似乎是

function startDrag(e){
  console.log('dragging...');
  setTimeout(addDropSpaces(),10);
  e.stopPropagation();
}

于 2021-04-07T16:09:02.380 回答