简体   繁体   English

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

[英]Where to add an event handler in javascript?

I have a javascript code that creates a random 5 images, assigns it to a div node and later clones that node and populates another div node. 我有一个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();

};

When I run this code I get onclick = null, and the code not work as expected, I'm new to javascript and don't know where to put my event handler. 当我运行此代码时,我得到onclick = null,并且该代码无法按预期工作,这是javascript新手,也不知道将事件处理程序放在哪里。 What I need to do is, whenever I click on the last child node of the div I trigger the onclick event. 我需要做的是,每当我单击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. 它不会复制使用addEventListener()添加的事件侦听器或分配给元素属性的事件侦听器。 (eg node.onclick = fn) [ Ref ] (例如,node.onclick = fn) [ 参考 ]

Either use onclick inline handle( attribute ) or use onclick every time element is appended. 每次添加元素时都可以使用onclick内联handle( 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(); 

As suggested by adeneo , Event Delegation will be helpful! 正如adeneo所建议的那样Event Delegation将是有帮助的! Event delegation allows you to avoid adding event listeners to specific nodes; 事件委托使您可以避免将事件侦听器添加到特定节点; instead, the event listener is added to one parent. 而是将事件侦听器添加到一个父对象。 That event listener analyzes bubbled events to find a match on child elements. 该事件侦听器分析冒泡事件以找到子元素的匹配项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM