HTML5 拖放无法正常工作

Posted

技术标签:

【中文标题】HTML5 拖放无法正常工作【英文标题】:HTML5 drag and drop not working correctly 【发布时间】:2013-05-28 20:07:45 【问题描述】:

我在这里做了一个例子:

http://jsfiddle.net/NQQL6/

当我开始拖动链接时,购物车应该变成绿色。当物品被拖到购物车上时,购物车应该变成红色。

这有效,但前提是购物车是空的:|

如果其中有任何其他元素,当我将项目拖到这些元素上时,leave 似乎会被触发。我怎样才能防止这种情况发生?

我尝试将事件侦听器移动到 document 元素并检查 event.targetcart 的子代还是孙代,但随后 leave 似乎在 body 上随机触发,即使该项目在购物车区域内,所以我的班级在不应该的时候被删除:(

编辑:在这里找到了一些 hacky 解决方案: 'dragleave' of parent element fires when dragging over children elements

所以你可以删除这个 Q :)

【问题讨论】:

【参考方案1】:

您需要将以下 css 应用到列表中:

ul pointer-events: none; 

查看这个更新的小提琴:

http://jsfiddle.net/NQQL6/1/

编辑: 试试这个,http://jsfiddle.net/NQQL6/6/

更多的 js 逻辑,但它现在应该可以工作了。

【讨论】:

如果我这样做,购物车中的链接将无法点击 ul * pointer-events: all; ul 中的所有子元素重新启用指针事件【参考方案2】:

游戏有点晚了,你可能解决了这个问题,但你需要保留一个引用计数器来计算 dragleave/dragenter 事件:

var counter = 0;

cart.addEventListener('dragenter', function(event)  
    counter++;
    cart.classList.add('ontop', 'activate');
    console.log('enter');
);

cart.addEventListener('dragleave', function(event)
  counter--;
  if (counter === 0) 
    cart.classList.remove('ontop');
  
  console.log('leave');
);

See here

另见this answer。

【讨论】:

以上是关于HTML5 拖放无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

HTML5 拖放 getData() 仅适用于 Chrome 中的拖放事件?

HTML5 拖放 getData() 仅适用于 Chrome 中的拖放事件?

无法在 React 上为 HTML5 拖放获取 onDragStart 事件

Internet Explorer 中的 HTML5 拖放问题(无法访问数据传输属性)

HTML5 DnD - 为啥在拖放元素后重影图像只能按预期工作?

使用 javascript 进行 HTML5 拖放 DOM 操作