我正在循环中的项目上创建JavaScript事件,但每次触发事件时它都会触发最后创建的事件。
JavaScript的:
var dirLinks = document.getElementsByClassName("dirLink"),
iframe = document.getElementById("tmpImg");
showDir.addEventListener('click', showDirContent, false);
showImgs.addEventListener('click', showImgsContent, false);
for (var i = 0; i < dirLinks.length; i++) {
var link = dirLinks[i];
link.onclick = function () {
updateIframeSource(link.getAttribute("imgSrc"));
}
}
function updateIframeSource(source) {
iframe.src = source;
}
HTML:
<a class="dirLink" imgSrc="img1.jpg" href="#">img1.jpg</a><br />
<a class="dirLink" imgSrc="img2.jpg" href="#">img2.jpg</a><br />
<a class="dirLink" imgSrc="img3.jpg" href="#">img3.jpg</a><br />
<a class="dirLink" imgSrc="img4.jpg" href="#">img4.jpg</a><br />
<a class="dirLink" imgSrc="img5.jpg" href="#">img5.jpg</a>
<iframe id="tmpImg"></iframe>
无论我点击哪个链接,它都会一直点击updateIframeSource
函数并传递img5.jpg
。
答案 0 :(得分:5)
这是因为在javascript for循环中不要在每次迭代中创建新范围(只有函数),所以你引用一个变量link
,它在循环结束时执行的函数中所以它总是5,解决这个问题只是将整个事情包装在这样的匿名函数中:
for(var i = 0; i < dirLinks.length; i++) {
(function(link) {
link.onclick = function () {
updateIframeSource(link.getAttribute("imgSrc"));
};
})(dirLinks[i]);
}
答案 1 :(得分:2)
这是因为循环不会创建新范围。因为javascript有函数范围:
var bindEvent = function(intId){
var link = dirLinks[intId];
link.onclick = function () {
updateIframeSource(link.getAttribute("imgSrc"));
}
}
for(var i = 0; i < dirLinks.length; i++) {
bindEvent(i);
}
参见 jsfiddle
答案 2 :(得分:0)
也使用这个
for(var i = 0; i < dirLinks.length; i++) {
var link = dirLinks[i];
link.addEventListener("click", updateIframeSource());
}
function updateIframeSource() {
return (function(event){
iframe.src = event.target.getAttribute("imgSrc");
alert(iframe.src);
});
}
答案 3 :(得分:0)
分配事件处理程序的操作很昂贵,它可以更好地包装所有锚链接并使用事件委派:
这里如何:
<div id="container">
<a class="dirLink" imgSrc="img1.jpg" href="#">img1.jpg</a><br />
<a class="dirLink" imgSrc="img2.jpg" href="#">img2.jpg</a><br />
<a class="dirLink" imgSrc="img3.jpg" href="#">img3.jpg</a><br />
<a class="dirLink" imgSrc="img4.jpg" href="#">img4.jpg</a><br />
<a class="dirLink" imgSrc="img5.jpg" href="#">img5.jpg</a>
</div>
<script>
var dirLinks = document.getElementsByClassName("dirLink");
var iframe = document.getElementById("tmpImg");
// Get the container
var container = document.getElementById("container");
//showDir.addEventListener('click', showDirContent, false);
//showImgs.addEventListener('click', showImgsContent, false);
container.addEventListener('click', function(evt){
// You can send the event or extract like this the value of "imgsrc"
updateIframeSource(evt.target.attributes.imgsrc.value);
});
function updateIframeSource(source) {
iframe.src = source;
}
</script>
答案 4 :(得分:0)
以下是forEach
循环
HTML:
<a class="dirLink" imgSrc="img1.jpg" href="#">img1.jpg</a>
<br />
<a class="dirLink" imgSrc="img2.jpg" href="#">img2.jpg</a>
<br />
<a class="dirLink" imgSrc="img3.jpg" href="#">img3.jpg</a>
<br />
<a class="dirLink" imgSrc="img4.jpg" href="#">img4.jpg</a>
<br />
<a class="dirLink" imgSrc="img5.jpg" href="#">img5.jpg</a>
<iframe id="tmpImg"></iframe>
JS:
var dirLinks = document.getElementsByClassName("dirLink");
var iframe = document.getElementById("tmpImg");
[].forEach.call(dirLinks, (l) => {
l.addEventListener('click', function() {
updateIframeSource(l.getAttribute("imgSrc"));
})
})
function updateIframeSource(source) {
iframe.src = source;
}