JavaScript addEventListener 无法与 onDrop、onDragOver 或 onDragStart 一起使用

标签 javascript html addeventlistener html5-draggable

我正在用 JavaScript 创建一个简单的图片拼图游戏,并尝试实现 HTML5 拖放 API。如果我向元素添加 ondragstart、ondragover 或 ondrop 事件(即作为属性),它就会起作用。

但是,由于同一类别中有相当多的不同元素,我需要添加事件监听器(如果我尝试用更多 block 制作拼图,事件监听器只会增加),所以我使用 addEventListener 来添加事件。但是,如果我这样做,它就不起作用。我已经在 Chrome 和 Firefox 中进行了测试。根据记录,我真的很想看看是否可以使用 HTML5 拖放 API 而不是使用 jQuery 来实现此功能。

这是相关的 JavaScript:

var piecesOnPage = document.querySelectorAll("#pieces img");
var puzzleSlots = document.getElementsByTagName("td");

function enableDrop(ev) {
    ev.preventDefault();
}

function dragPiece(ev) {
    ev.dataTransfer.setData("text", ev.target.id);
}

function dropPiece(ev) {
    ev.preventDefault();
    var data = ev.dataTransfer.getData("text");
    ev.target.appendChild(document.getElementById(data));
}

function createEventListeners() {
    if (piecesOnPage[0].addEventListener) {
       for (i = 0; i < piecesOnPage.length; i++) {
        piecesOnPage[i].addEventListener("dragStart", dragPiece, false);
      }
    } else if (piecesOnPage[0].attachEvent) {
        for (i = 0; i < piecesOnPage.length; i++) {
        piecesOnPage[i].attachEvent("onDragStart", dragPiece);
       }
    }

   if (puzzleSlots[0].addEventListener) {
       for (i = 0; i < puzzleSlots.length; i++) {
        puzzleSlots[i].addEventListener("drop", dropPiece, false);
   }
    } else if (puzzleSlots[0].attachEvent) {
       for (i = 0; i < puzzleSlots.length; i++) {
       puzzleSlots[i].attachEvent("onDrop", dropPiece);
      }
    }

    if (puzzleSlots[0].addEventListener) {
       for (i = 0; i < puzzleSlots.length; i++) {
        puzzleSlots[i].addEventListener("dragOver", enableDrop, false);
       }
    } else if (puzzleSlots[0].attachEvent) {
        for (i = 0; i < puzzleSlots.length; i++) {
        puzzleSlots[i].attachEvent("onDragOver", enableDrop);
       }
    }
}

if (window.addEventListener) {
   window.addEventListener("load", createEventListeners, false);
} else if (window.attachEvent) {
   window.attachEvent("onload", createEventListeners);
}

这是随附的 HTML。请注意,为了演示正常事件有效但 addEventListener 无效这一事实,我已将正常事件添加到第一个拼图 block 和第一个拼图槽中。这些工作正常,但其余的则不然。

<!DOCTYPE html>
<html lang="en">
<meta charset="utf-8">
<head>
<title>Puzzles</title>
<style>
    table {
    border:1px #000000 solid;
    border-collapse:collapse;
    float:right;
    margin:10px;
}

td {
    padding:0;
    line-height:0;
    height:96px;
    width:157px;
}
</style>
</head>

<body>
    <table class="puzzleboard">
        <thead></thead>
        <tbody>
            <tr><td id="space1" ondrop="dropPiece(event)" ondragover="enableDrop(event)"></td><td id="space2"></td><td id="space3"></td></tr>
            <tr><td id="space4"></td><td id="space5"></td><td id="space6"></td></tr>
            <tr><td id="space7"></td><td id="space8"></td><td id="space9"></td></tr>
        </tbody>
    </table>
    <div id="pieces">
        <img id="img1" draggable="true" ondragstart="dragPiece(event)" src="2-2.jpeg"><img id="img2" draggable="true" src="1-2.jpeg"><img id="img3" draggable="true" src="2-1.jpeg"><br>
        <img id="img4" draggable="true" src="0-2.jpeg"><img id="img5" draggable="true" src="1-0.jpeg"><img id="img6" draggable="true" src="0-1.jpeg"><br>
        <img id="img7" draggable="true" src="1-1.jpeg"><img id="img8" draggable="true" src="2-0.jpeg"><img id="img9" draggable="true" src="0-0.jpeg"><br>
    </div>
<script src="final-so.js"></script>
</body>
</html>

有史以来第一个堆栈溢出问题,希望我没有做任何太愚蠢的事情;)

最佳答案

为 img 元素添加一些高度和宽度。

<img id="img1" draggable="true" ondragstart="dragPiece(event)" src="2-2.jpeg" height="100" width="100">

这解决了问题

关于JavaScript addEventListener 无法与 onDrop、onDragOver 或 onDragStart 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42359555/

相关文章:

javascript - Elasticsearch 相当于 WHERE x = 1 AND (y = 2 OR y = 3)

javascript - HTML5 音频标签无法为 Chrome 和 Safari 中第一个未聚焦的选项卡播放声音?

javascript - 页面预加载器加载较晚

html - Safari 阅读器忽略 H1 标签

javascript - 管理在多个 div 上使用 IntersectionObserver 的问题

javascript - 一段时间后终止被调用的函数

javascript - 如何在没有 webpack、node、nvm 等的情况下使用 React

javascript - 如何监听 Javascript 中的键盘类型文本?

javascript - 为多个元素添加事件监听器

javascript - jQuery 每个在监听错误元素时都会阻塞代码