javascript - 由于 dragover 事件中的 DOM 操作,HTML5 draggable 的 drop 事件不会间歇性触发

标签 javascript html svg draggable

我正在使用 html5 的“可拖动”属性在容器中拖动 2 个元素,并使用 svg 线来连接这两个元素。 连接后,拖动第一个 Div 应该重绘连接的 svg 线(我通过调用“handleDragOver”函数在 dragover 事件上执行此操作)。但是,如果您更快地拖动第一个 div,则不会触发 drop 事件,并且 div 会在绘制线条时保持其原始位置。

function handleDragOver(e) {
    if (e.preventDefault) {
        e.preventDefault();
    }
    //Some code doing DOM computation and manipulation
    }
    return false;
    //e.dataTransfer.dropEffect = 'move';
}

如何确保每次都触发放置事件。

请注意:

  1. 我不会使用任何框架,只能使用普通的 javascript
  2. 我不能在拖动时不重画线。
  3. 当我不在“handleDragOver”中进行任何计算/重绘时,拖动功能工作正常

这是代码:http://jsfiddle.net/bhuwanbhasker/3yx9ds4m/1/

最佳答案

请查看更新后的 fiddle :http://jsfiddle.net/sejoker/d4vs9fgs/1/ 以下更改:

  • 线操作从 dragover 的处理程序移至 handleDrop,在拖放操作期间重画线一次
  • 在 setTimeout 中调用 moveLine 似乎可以提高可用性(可选)
  • moveLine 函数的微小变化以正确连接可拖动元素(可选)

    function handleDrop(e) {
    console.log('enter Drop');
    if (e.stopPropagation) {
        e.stopPropagation(); // stops the browser from redirecting.
    }
    var offset = e.dataTransfer.getData('Text').split(',');
     dragSrcEl.style.left = (e.clientX + parseInt(offset[0], 10)) + 'px';
     dragSrcEl.style.top = (e.clientY + parseInt(offset[1], 10)) + 'px';
    
     setTimeout(function(){
        var elem = svgLine.aLine;
        if (elem !== null) {
            var x = e.clientX - svgLine.left,
                y = e.clientY - svgLine.top;
            moveLine(x, y, elem, offset[2]);
        }            
     }, 50)
    

关于javascript - 由于 dragover 事件中的 DOM 操作,HTML5 draggable 的 drop 事件不会间歇性触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25542930/

相关文章:

javascript - 如何获取元素:hover background with javascript and CORS

javascript - Internet Explorer 中的removeAllRanges()

javascript - 如何在 Three.js 中将相机自动聚焦在一个点上?

html - 一种仅在非移动设备上使用 CSS 类的方法

javascript - 仅当用户在输入框中键入大于 0 的值时才显示元素

javascript - 如何在 css 样式上添加 SVG 行

html - svg 不清晰,但模糊

svg - ffmpeg 支持 svg 光栅化

javascript - meteor :导入目录 - 所需方法的模块化导入

html - 当 child / child 漂浮时 parent 崩溃是一个错误,还是故意的?