如何将事件侦听器添加到对象数组

时间:2013-07-31 21:36:52

标签: javascript extjs event-listener easeljs

我有一个对象数组(特别是easelJS个图像) - 就像这样:

var imageArray = new Array;
gShape  = new createjs.Shape();
// shape is something
imageArray.push(gShape);

我想要做的是拥有一个事件监听器,而不是:

gShape.addEventListener("click", function() {alert"stuff"});

我希望程序明确知道点击了哪个区域,以便我可以通过以下方式发送警告框:

imageArray[index].addEventListener("click", function(){
    alert " you clicked region number " + index}

5 个答案:

答案 0 :(得分:17)

不确定。您可以使用闭包来保存该迭代的索引。否则,由相同的函数作用域共享,并为您提供相同迭代的值。为每个函数创建一个单独的函数将保存函数内部的状态。

var imageArray = new Array;
gShape = new createjs.Shape();
 // shape is something
 imageArray.push(gShape); // Dumped all the objects

for (var i = 0; i < imageArray.length; i++) {
   (function(index) {
        imageArray[index].addEventListener("click", function() {
           console.log("you clicked region number " + index);
         })
   })(i);
}

或更好

 for(var i = 0; i < imageArray.length; i++) {
       imageArray[i].addEventListener("click", bindClick(i));
 }

 function bindClick(i) {
    return function() {
        console.log("you clicked region number " + i);
    };
 }

ES6救援

let imageArray = [];
gShape = new createjs.Shape();
// shape is something
imageArray.push(gShape); // Dumped all the objects

for (let i = 0; i < imageArray.length; i++) {
  imageArray[i].addEventListener("click", function() {
    console.log("you clicked region number " + i);
  });
}

使用let关键字在迭代中为变量创建块范围,并在调用事件处理程序时具有正确的索引。

答案 1 :(得分:7)

这样的事情应该有效:

for (var i = 0 ; i < imageArray.length ; ++i) {
    function(index) {
        imageArray[index].addEventListener("click", function() {
            alert ("You clicked region number: " + index");
        });
    } ( i);
}

它起作用的原因是因为它创建了一个闭包,其中包含将在警报消息中显示的index值。每次循环创建另一个闭包,保持另一个值index

答案 2 :(得分:2)

//gShape must be an array of HTMLElement
gShape.forEach(element => element.addEventListener("click", function () {
    // this, refers to the current element.
    alert ("You clicked region number: " + this.getAttribute('data-region'));
}));

答案 3 :(得分:1)

当然,闭包是解决方案,但是因为他有Ext加载,所以他也可以使用它并获得一些非常易读的代码。索引作为第二个参数传递给Ext.Array.each(别名为Ext.each)。

Ext.each(imageArray, function(gShape, index) {
    gShape.addEventListener("click", function() {
        alert("You clicked region number " + index);
    });
});

答案 4 :(得分:0)

这就是我用于div id的:

var array = ['all', 'what', 'you', 'want'];

function fName () {
    for (var i = 0; i < array.length; i++)
    document.getElementById(array[i]).addEventListener('click', eventFunction);
};

祝你好运!