Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当通过dom元素循环时,何时使用;这";什么时候使用循环变量?_Javascript_Dom_This - Fatal编程技术网

Javascript 当通过dom元素循环时,何时使用;这";什么时候使用循环变量?

Javascript 当通过dom元素循环时,何时使用;这";什么时候使用循环变量?,javascript,dom,this,Javascript,Dom,This,我是一个javascript/DOMNoob,主要来自Python和Clojure,在dom中引用事物的语义让我很困惑 从我刚刚编写到chrome扩展中的一些代码中提取以下内容,以识别与testdownloadpage中定义的条件相匹配的页面子集,然后在pdf下载链接上挂起eventlisteners以截取和刮取它们: function hanglisteners() { if (testdownloadpage(url)) { var links = document.

我是一个javascript/DOMNoob,主要来自Python和Clojure,在dom中引用事物的语义让我很困惑

从我刚刚编写到chrome扩展中的一些代码中提取以下内容,以识别与
testdownloadpage
中定义的条件相匹配的页面子集,然后在pdf下载链接上挂起eventlisteners以截取和刮取它们:

function hanglisteners() {
    if (testdownloadpage(url)) {
        var links = document.getElementsByTagName("a");
        for (i = 0, len = links.length; i < len; i++) {
            var l = links[i];
            if (testpdf(l.href)) {
                l.addEventListener("click", function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    e.stopImmediatePropagation();
                    getlink(this.href);
                }, false);
            };
        };
    };
};

愚蠢的测试


当您使用事件监听器时,
绑定到事件监听器所针对的DOM元素。想象一下下面的代码:

var links = document.getElementsByTagName("a");
for (i = 0, len = links.length; i < len; i++) {
  let a = links[i];
  a.addEventListener("click", function(e) {
    console.log(this === a); // => true
  })
}
var links=document.getElementsByTagName(“a”);
对于(i=0,len=links.length;itrue
})
}

这两个变量是相同的,因此无论何时出现问题,都可以使用这两个变量,因为在侦听器实际启动时循环变量已经发生了更改。您应该能够通过下面的示例看到这一点

函数设置(){
var root=document.getElementById('root');
var info=document.createElement('div');
对于(变量i=0;i<5;i++){
//创建一个按钮
var btn=document.createElement('button');
//设置参数
btn.innerHTML=i
btn.addEventListener('click',函数(事件){
info.innerHTML=('i='+i+',但按钮名称为'+event.target.innerHTML);
})
//将按钮添加到dom中
root.appendChild(btn)
}
var info=document.createElement('div');
info.innerHTML='i的值为'+i'
root.appendChild(信息)
}
//运行我们的设置功能
设置()


看起来像一个重复的函数,当一个函数被用作事件处理程序时,它的
this
被设置为触发事件的元素(对于使用addEventListener以外的方法动态添加的侦听器,某些浏览器不遵循此约定)。嗯@elclans你是说这个问题与循环无关吗,但是与作用域泄漏到内部函数有关的东西?。。。思考。。。为了确保我理解上面链接的答案,另一种解决方案是将
addEventListener
封装在某种2-算术函数中,然后在循环的每次迭代中关闭
l.href
的当前值?阅读
var
let
之间的差异,获得行为的完整答案。嗯。。。我只是测试了一下,以验证它是否有效,但现在我非常困惑,为什么我在问题中的代码会与
这个
一起工作,而与循环变量一起失败。。。(我想我可能有其他错误!可能必须开始挖掘提交历史以确保…@PaulGowder,请参阅我在上面的评论中链接的问题,这就是问题所在:循环+闭包。@elclanrs我甚至还没有找到闭包的方法。)@PaulGowder你应该用
这个
然后