开发者问题收集

将事件处理程序附加到 DOM 元素

2012-09-30
2987

我正在开发一款井字游戏,目前已经接近完成。我唯一想知道的是,是否可以从我的 .js 文件中添加 onclick 事件处理程序,而不是直接从 HTML 属性调用它。以下是使用 onclick 的 HTML 部分:

<div id="left">
        <div id="board">
            <div id="one" onclick="playerMove(this)">

            </div>
            <div id="two" onclick="playerMove(this)">

            </div>
            <div id="three" onclick="playerMove(this)">

            </div>
            <div id="four" onclick="playerMove(this)">

            </div>
            <div id="five" onclick="playerMove(this)">

            </div>
            <div id="six" onclick="playerMove(this)">

            </div>
            <div id="seven" onclick="playerMove(this)">

            </div>
            <div id="eight" onclick="playerMove(this)">

            </div>
            <div id="nine" onclick="playerMove(this)">

            </div>
        </div>
    </div>

如有任何想法,我们将不胜感激。

3个回答

如果您使用 jQuery,类似下面的方法应该可以工作:

$(document).ready(function() {
  $('#board div').click(playerMove);
});
lanan
2012-09-30

在纯 JavaScript(无跨平台库)中,可以使用 addEventListener (现代浏览器)或 attachEvent (旧版 IE)通过 JavaScript 代码添加事件处理程序。

这是一个以跨浏览器方式添加事件处理程序的简单函数:

// add event cross browser
function addEvent(elem, event, fn) {
    if (elem.addEventListener) {
        elem.addEventListener(event, fn, false);
    } else {
        elem.attachEvent("on" + event, function() {
            // set the this pointer same as addEventListener when fn is called
            return(fn.call(elem, window.event));   
        });
    }
}

示例用法(页面 DOM 加载后调用):

addEvent(document.getElementById("one"), 'click', playerMove);

或者,要为所有板 div 安装事件处理程序,您可以执行以下操作:

var divs = document.getElementById("board").children;
for (var i = 0, len = divs.length; i < len; i++) {
    // element nodes only
    if (divs[i].nodeType === 1) {
        addEvent(divs[i], 'click', playerMove);
    }
}
jfriend00
2012-09-30

您确实应该考虑使用 jQuery。如果您使用 jQuery,那么这将非常简单:

$('#board > div').click(playerMove);

如果您想继续使用 vanilla JS,您可以执行以下操作:

var items = document.getElementById('board').children;
for(x in items) {
    items[x].onclick = function() {
        playerMove(items[x]);
    };
}
techfoobar
2012-09-30