我有一个对象数组(特别是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}
答案 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);
};
祝你好运!