【问题标题】:Javascript drag and drop exhibiting strange behaviorJavascript拖放表现出奇怪的行为
【发布时间】:2016-06-28 19:26:01
【问题描述】:

我正在尝试创建拖放表单构建器,但我的基本拖动事件处理程序遇到了一些奇怪的问题。

具体来说,可拖动元素的行为就像它们具有来自放置目标的事件监听器,但是当我检查元素时,它们只有来自拖动元素的事件监听器。

这是继承问题吗?我可以做些什么来防止可拖动项目像放置目标一样?

谢谢!

HTML:

<!DOCTYPE html>
<html>
    <head>
        <title>Test Page</title>
        <style>
            .drag 
            {
                border: solid;
                margin: auto;
                width: 80px;
            }
            .drop
            {
                border: solid;
                margin: auto;
                min-height: 100px;
                width: 100px;
            }
            .over 
            {
                border: 2px dashed #000;
            }
            .palette
            {
                position: absolute;
                top: 10px;
                left: 10px;
            }
        </style>
    </head>
    <body>
        <script src="test.js"></script>

        <div id="palette" class="palette">
            <div id="1" draggable="true" class="drag">Test 1</div>
            <div id="2" draggable="true" class="drag">Test 2</div>
            <div id="3" draggable="true" class="drag">Test 3</div>
            <div id="4" draggable="true" class="drag">Test 4</div>
            <div id="5" draggable="true" class="drag">Test 5</div>
        </div>
        <div id="target" class="drop">


        </div>

    </body>
</html>

Javascript:

window.onload = initall;    

function initall() 
{   
    var allDivs = document.getElementsByTagName('DIV');
    for (var i = 0; i < allDivs.length; i++) 
    {
        if(allDivs[i].className == "drag") 
        {
            allDivs[i].addEventListener('dragstart', handleDragStart);
            allDivs[i].addEventListener('dragend', handleDragEnd);

        }

        if(allDivs[i].className == "drop") 
        {
            allDivs[i].addEventListener('dragenter', handleDragEnter,true);
            allDivs[i].addEventListener('dragover', handleDragOver,true);
            allDivs[i].addEventListener('dragleave', handleDragLeave,true);
            allDivs[i].addEventListener('drop', handleDrop,true);


        }
    }
}


/*
 * Functions for element being dragged
 */

function handleDragEnd(ev)
{
    ev.target.style.opacity = '1';
}
function handleDragStart(ev) 
{
    ev.target.style.opacity = '0.4';
    ev.dataTransfer.effectAllowed = 'move';
    ev.dataTransfer.setData("text", ev.target.id);
} 

/*
 * Functions for drop target
 */

function handleDragEnter(ev) 
{

    ev.target.classList.add('over');

}
function handleDragLeave(ev) 
{
    ev.target.classList.remove('over');
}

function handleDragOver(ev) 
{
    if (ev.preventDefault) {
        ev.preventDefault();
    }
    ev.dataTransfer.dropEffect = "move";

}
function handleDrop(ev) 
{
    if (ev.preventDefault) {
        ev.preventDefault();
    }

    if(ev.target.className.indexOf("drop") > -1)
    {
        var data = ev.dataTransfer.getData("text");
        ev.target.appendChild(document.getElementById(data));
        ev.target.classList.remove('over');
    }
    return false;
}

【问题讨论】:

    标签: javascript drag-and-drop


    【解决方案1】:

    尝试使用 false 而不是 true 作为附加到 drop div 的 addeventlisteners 中的第三个参数。

    【讨论】:

    • 我实际上添加了 true 来尝试解决这个问题(默认为 false),但继续明确表示 false 并试一试。行为完全相同。
    • 我尝试了您的代码,可拖动的 div 的行为不像具有放置侦听器的元素。你能更准确地描述他们的行为吗?
    • 当一个 dragenter 事件被捕获时,“over”类被应用到目标......在这种情况下,这意味着当我将 test1 拖到目标时,它会按预期工作,但是如果我将其他元素之一拖到测试 1 上,将类应用于该元素。确实,它不会成为一个放置目标,这是我困惑的一部分。我相信这只是因为我在实际执行 drop 之前检查目标是否具有 drop 类。
    • 我的 FF 和 chromium 版本没有看到这种行为。边框保持实心而不是虚线。
    • 嗯。这真的很奇怪。我在 Chrome、FF 和 IE 中看到了这种行为。 Chrome 版本 51.0.2704.103 m FF 版本 47.0.1 IE 11.0.9600.17843 我可能得在别人的电脑上试试这个,看看能不能重现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多