gpt4 book ai didi

javascript - 在 JavaScript 中哪里添加事件处理程序?

转载 作者:行者123 更新时间:2023-12-03 07:09:27 25 4
gpt4 key购买 nike

我有一个 JavaScript 代码,它创建随机 5 个图像,将其分配给一个 div 节点,然后克隆该节点并填充另一个 div 节点。

var numberOffaces = 5;
var theLeftSide = document.getElementById("leftSide");
var theRightSide = document.getElementById("rightSide");
var theBody = document.getElementsByTagName("body")[0];


function generateFaces() {
for (var i = 0; i < numberOffaces; i++) {
var imgNode = document.createElement("IMG");
imgNode.src = "http://home.cse.ust.hk/~rossiter/mooc/matching_game/smile.png";
imgNode.style.top = Math.floor(Math.random() * 400) + "px";
imgNode.style.left = Math.floor(Math.random() * 400) + "px";
theLeftSide.appendChild(imgNode);
}
var leftSideImages = theLeftSide.cloneNode(true);
leftSideImages.removeChild(leftSideImages.lastChild);
theRightSide.appendChild(leftSideImages);
}

//add event handler
theLeftSide.lastChild.onclick =
function nextLevel(event) {

event.stopPropagation();

numberOfFaces += 5;

generateFaces();

};

当我运行此代码时,我得到 onclick = null,并且代码无法按预期工作,我是 JavaScript 新手,不知道将事件处理程序放在哪里。我需要做的是,每当我点击 div 的最后一个子节点时,我都会触发 onclick 事件。

最佳答案

Cloning a node copies all of its attributes and their values, including intrinsic (in–line) listeners. It does not copy event listeners added using addEventListener() or those assigned to element properties. (e.g. node.onclick = fn) [Ref]

要么使用 onclick 内联句柄(attribute),要么在每次附加元素时使用 onclick

var numberOffaces = 5;
var theLeftSide = document.getElementById("leftSide");
var theRightSide = document.getElementById("rightSide");
var theBody = document.getElementsByTagName("body")[0];


function generateFaces() {
for (var i = 0; i < numberOffaces; i++) {
var imgNode = document.createElement("IMG");
imgNode.src = "http://home.cse.ust.hk/~rossiter/mooc/matching_game/smile.png";
imgNode.style.top = Math.floor(Math.random() * 400) + "px";
imgNode.style.left = Math.floor(Math.random() * 400) + "px";
theLeftSide.appendChild(imgNode);
}
var leftSideImages = theLeftSide.cloneNode(true);
leftSideImages.removeChild(leftSideImages.lastChild);
theRightSide.appendChild(leftSideImages);
doAddEvent();
}

//add event handler
function doAddEvent() {
theLeftSide.lastChild.onclick =
function nextLevel(event) {
event.stopPropagation();
numberOfFaces += 5;
generateFaces();
};
}
doAddEvent();

根据adeneo的建议, Event Delegation会有帮助的! 事件委托(delegate)允许您避免向特定节点添加事件监听器;相反,事件监听器被添加到一个父级。该事件监听器分析冒泡事件以查找子元素的匹配项。

关于javascript - 在 JavaScript 中哪里添加事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36668292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com