Javascript 循环中的addEventHandler()具有意外结果
我不知道该找什么,所以我找不到以前关于这个话题的任何问题,谷歌也帮不了什么忙Javascript 循环中的addEventHandler()具有意外结果,javascript,javascript-events,Javascript,Javascript Events,我不知道该找什么,所以我找不到以前关于这个话题的任何问题,谷歌也帮不了什么忙 (function() { var element = function(str) { return document.getElementById(str); }, parent = document.getElementsByTagName('ul')[0].getElementsByTagName('li'), len = parent.l
(function() {
var element = function(str) {
return document.getElementById(str);
},
parent = document.getElementsByTagName('ul')[0].getElementsByTagName('li'),
len = parent.length,
slides = slides || [];
for (var i=0; i<len; i++) {
var link = parent[i].getElementsByTagName('a')[0],
slide = element(parent[i].getElementsByTagName('a')[0].getAttribute('href').substr(1));
if (addEventListener) {
link.addEventListener('click', function(event){
event.preventDefault();
alert(slide.getAttribute('id'));
});
} else if (attachEvent) {
}
}
})();
(函数(){
变量元素=函数(str){
返回文档.getElementById(str);
},
parent=document.getElementsByTagName('ul')[0]。getElementsByTagName('li'),
len=父项长度,
幻灯片=幻灯片| |[];
javascript中的for(var i=0;i变量是函数范围,即使在块内声明它们也是如此。此循环围绕变量循环创建一个闭包,但每次迭代都会重新分配循环。循环完成时,所有闭包都指向数组中的最后一个元素
要解决此问题,请以不同方式确定变量的范围:
(function() {
var element = function(str) {
return document.getElementById(str);
},
parent = document.getElementsByTagName('ul')[0].getElementsByTagName('li'),
len = parent.length;
for (var i=0; i<len; i++) {
var link = parent[i].getElementsByTagName('a')[0],
slide = element(parent[i].getElementsByTagName('a')[0].getAttribute('href').substr(1));
if (addEventListener) {
link.addEventListener('click', (function(slide){
return function(event) {
event.preventDefault();
alert(slide.getAttribute('id'))
}
})(slide));
} else if (attachEvent) {
}
}
})();
(函数(){
变量元素=函数(str){
返回文档.getElementById(str);
},
parent=document.getElementsByTagName('ul')[0]。getElementsByTagName('li'),
len=父项长度;
对于(var i=0;i我以前遇到过这个错误,它与幻灯片的绑定有关,这很难解释。下面是一个修复方法
link.addEventListener('click',
(function(x) {
return function(event){
event.preventDefault();
alert(x.getAttribute('id'));
}
})(slide));
呃,幻灯片[]是我之前试图解决同一问题时留下的,您可以忽略它。我认为您的代码中有一个错误,但感谢您的回复。文本部分帮助很大!可能是…我没有仔细看,我编辑了它,但显然在它通过之前必须有人检查它。