JavaScript 事件在 for 循环中被覆盖
JavaScript event being overwritten in for loop
我正在循环中的项目上创建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>
无论我单击哪个链接,它都会点击传入img5.jpg
的updateIframeSource
函数。
这是因为在 javascript for loop 中不要在每次迭代中创建新作用域(只有函数会这样做),所以你在循环完成时执行的函数中引用一个变量link
,所以它总是 5,要解决这个问题,只需将整个事情包装在匿名函数中,如下所示:
for(var i = 0; i < dirLinks.length; i++) {
(function(link) {
link.onclick = function () {
updateIframeSource(link.getAttribute("imgSrc"));
};
})(dirLinks[i]);
}
这是因为循环不会创建新作用域。因为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
也使用这个
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);
});
}
分配事件处理程序的操作很昂贵,最好包装所有锚链接并使用事件委托:
具体方法如下:
<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>
这是循环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;
}
相关文章:
- 在循环中分配json值时,值被覆盖
- 如何覆盖requestAnimationFrame循环
- 如何在循环中使用jQuery.on()方法,而不覆盖我循环的对象
- 当我'm试图覆盖循环中的元素
- 在 forEach 循环中覆盖的变量
- 为什么我的 JS 循环会覆盖对象中以前的条目
- Javascript 循环和数组通过给定的最后一个值覆盖元素
- for 循环中的覆盖函数
- JavaScript 事件在 for 循环中被覆盖
- 如何在循环中更新html标记的值而不覆盖前几轮
- javascript覆盖循环
- JQuery变量在循环中覆盖,希望保留不同的值
- for循环生成的二维JavaScript数组正在被上一个循环结果覆盖
- 如何循环遍历新生成的数组而不覆盖它?
- 每次循环覆盖变量
- 变量在异步函数中被async覆盖.forEach循环
- 当使用循环添加标记时,Leafletjs地图覆盖停止工作
- 如何在单个for循环中覆盖网格中的每个正方形
- $.getJSON,并在foreach循环中覆盖所有输入字段
- 甜蜜警报覆盖循环中的前一个警报