Javascript 遍历一个对象数组并添加 eventListener 有一个奇怪的行为
Javascript Looping over an array of object and adding eventListener has a weird behavior
我不理解 Javascript 中的概念。首先,我创建了一个箭头函数 init(),它遍历一个对象数组并初始化一个附加了 eventListener 的图像标签。
init: () => {
let catsContainer = document.getElementById('catsContainer')
for (let cat of data.cats) {
let element = `<img src="img/${cat.image}" catName="${cat.name}" alt="catImage" id="catOneImage" width="50" height="50">`;
element = octopus.htmlToElement(element)
catsContainer.appendChild(element)
element.addEventListener('click', ((elementCopy) => {
return () => {
view.loadImage(elementCopy)
}
})(element));
}
}
单击该图像时,将通过 loadImage() 函数加载新的大图像(更改 src 属性)。
loadImage: function (el) {
let catBigImage = document.getElementById('catBigImage');
let catName = document.getElementById('catName');
catBigImage.setAttribute('src', el.getAttribute('src'))
catName.innerHTML = el.getAttribute('catName')
catBigImage.addEventListener('click', () => {
let obj = data.cats.find(o => o.name === el.getAttribute('catName'));
console.log(`obj:: ${obj}`)
octopus.incrementCounter(obj)
console.log(obj)
});
}
而且通常当您单击该大图像时,所选对象的计数 属性 必须递增。问题是当加载新图像时,我的代码保留了最后加载的对象并增加了它的计数器。直到现在我还不太理解这种行为。
您可以在上传的屏幕截图中看到,在第三次单击新加载的图像 (cat4) 时,我的代码还会递增最后加载的图像 (cat2),从而产生 4 console.log 行。
发生这种情况是因为此代码:
catBigImage.addEventListener('click', () => {
let obj = data.cats.find(o => o.name === el.getAttribute('catName'));
console.log(`obj:: ${obj}`)
octopus.incrementCounter(obj)
console.log(obj)
});
...每次执行时添加一个事件处理程序。它不会替换之前绑定的事件处理程序。
您应该将此代码移出 loadImage
函数,并且只执行一次。
根据经验,在处理事件的函数中添加事件侦听器时会产生代码味道。
我不理解 Javascript 中的概念。首先,我创建了一个箭头函数 init(),它遍历一个对象数组并初始化一个附加了 eventListener 的图像标签。
init: () => {
let catsContainer = document.getElementById('catsContainer')
for (let cat of data.cats) {
let element = `<img src="img/${cat.image}" catName="${cat.name}" alt="catImage" id="catOneImage" width="50" height="50">`;
element = octopus.htmlToElement(element)
catsContainer.appendChild(element)
element.addEventListener('click', ((elementCopy) => {
return () => {
view.loadImage(elementCopy)
}
})(element));
}
}
单击该图像时,将通过 loadImage() 函数加载新的大图像(更改 src 属性)。
loadImage: function (el) {
let catBigImage = document.getElementById('catBigImage');
let catName = document.getElementById('catName');
catBigImage.setAttribute('src', el.getAttribute('src'))
catName.innerHTML = el.getAttribute('catName')
catBigImage.addEventListener('click', () => {
let obj = data.cats.find(o => o.name === el.getAttribute('catName'));
console.log(`obj:: ${obj}`)
octopus.incrementCounter(obj)
console.log(obj)
});
}
而且通常当您单击该大图像时,所选对象的计数 属性 必须递增。问题是当加载新图像时,我的代码保留了最后加载的对象并增加了它的计数器。直到现在我还不太理解这种行为。
您可以在上传的屏幕截图中看到,在第三次单击新加载的图像 (cat4) 时,我的代码还会递增最后加载的图像 (cat2),从而产生 4 console.log 行。
发生这种情况是因为此代码:
catBigImage.addEventListener('click', () => {
let obj = data.cats.find(o => o.name === el.getAttribute('catName'));
console.log(`obj:: ${obj}`)
octopus.incrementCounter(obj)
console.log(obj)
});
...每次执行时添加一个事件处理程序。它不会替换之前绑定的事件处理程序。
您应该将此代码移出 loadImage
函数,并且只执行一次。
根据经验,在处理事件的函数中添加事件侦听器时会产生代码味道。