Javascript 对没有ID的div的引用

Javascript 对没有ID的div的引用,javascript,Javascript,我对addEvent(或其他我不知道的东西)有问题。这是我的代码。 HTML: JS: function addEvent(elm,ev,fun)//Cross-browser addEvent { if(elm.addEventListener)elm.addEventListener(ev,fun,false); else if(elm.attachEvent) { var r=elm.attachEvent("on"+ev,fun);

我对addEvent(或其他我不知道的东西)有问题。这是我的代码。
HTML:


JS:

function addEvent(elm,ev,fun)//Cross-browser addEvent
{
    if(elm.addEventListener)elm.addEventListener(ev,fun,false);
    else if(elm.attachEvent)
    {
        var r=elm.attachEvent("on"+ev,fun);
        return r;
    }
}

function myFun(x)
{
    alert(x.style.backgroundColor);
}

var allDiv=document.getElementsByTagName("div");
myFun(allDiv[0]);//Here it works
for(var i=0;i<allDiv.length;i++) {
      //But not here when you click the div
      addEvent(allDiv[i],
               "click",function(){
                          myFun(allDiv[i])
                       });
}
函数addEvent(elm、ev、fun)//跨浏览器addEvent
{
if(elm.addEventListener)elm.addEventListener(ev,fun,false);
else if(elm.attachEvent)
{
var r=elm.attachEvent(“on”+ev,乐趣);
返回r;
}
}
函数myFun(x)
{
警报(x.style.backgroundColor);
}
var allDiv=document.getElementsByTagName(“div”);
myFun(allDiv[0])//它在这里工作

对于(var i=0;i

而不是将其称为
allDiv[i]
,将
传递给回调函数。调用onclick回调时,
i
超出范围,无法由
allDiv[i]
解析。回调在调用
的上下文中调用,由
引用

for(var i=0; i<allDiv.length; i++) {
      addEvent(allDiv[i], "click", function() {
         // allDiv[i] is out of scope in the callback.  Use this instead.
         myFun(this);
      });
}

for(var i=0;i

不将其称为
allDiv[i]
,而是将此
传递给回调函数。在调用onclick回调时,
i
超出范围,无法由
allDiv[i]解析
。在调用
的上下文中调用回调,由
this
引用

for(var i=0; i<allDiv.length; i++) {
      addEvent(allDiv[i], "click", function() {
         // allDiv[i] is out of scope in the callback.  Use this instead.
         myFun(this);
      });
}
用于(变量i=0;i

更改

for(var i=0;i<allDiv.length;i++)addEvent(allDiv[i],"click",function(){myFun(allDiv[i])});
for(var i=0;i变化

for(var i=0;i<allDiv.length;i++)addEvent(allDiv[i],"click",function(){myFun(allDiv[i])});

for(var i=0;i在JavaScript中使用闭包时,您陷入了一个常见的陷阱。我被关闭了,但所有单击函数上的更改都使用
allDiv[allDiv.length-1]调用myFunc
您可以使用一个自执行函数来解决这个问题

for(var i=0;i<allDiv.length;i++) {
          addEvent(allDiv[i],
                   "click",(function(j) {
                              return function(){
                                       myFun(allDiv[j])
                                     }
                            }(i)));
}

在JavaScript中使用闭包时,您陷入了一个常见的陷阱。我被关闭了,但所有单击函数上的更改都是使用
allDiv[allDiv.length-1]
调用myFunc。您可以使用一个自执行函数来解决这个问题

for(var i=0;i<allDiv.length;i++) {
          addEvent(allDiv[i],
                   "click",(function(j) {
                              return function(){
                                       myFun(allDiv[j])
                                     }
                            }(i)));
}

@user1365010好的,找到了真正的问题。谢谢!但我仍然不明白为什么。这和allDiv[I]应该是相同的!@user1365010请参见我在上面添加的注释。
I
索引在调用回调时超出范围,并且回调函数在调用div的上下文中被调用,
this
@user1365010 I不在范围之外,它已关闭(请参见我的答案)。执行回调时i的值为therfor。如果回调是在大约一半的迭代后执行的,则i的值为allDiv.length/2。但是,回调直到i达到其最终值时才执行,因为它是相同的变量(i)在每个回调中,它们都有相同的值。这是在JSI中使用闭包时的设计。如果我想访问I onclick,我应该传递什么作为参数?@user1365010好的,找到了真正的问题。谢谢!但我仍然不明白为什么。这和allDiv[I]应该是相同的!@user1365010请参见我在上面添加的注释。
I
索引在调用回调时超出范围,并且回调函数在调用div的上下文中被调用,
this
@user1365010 I不在范围之外,它已关闭(请参见我的答案)。执行回调时i的值为therfor。如果回调是在大约一半的迭代后执行的,则i的值为allDiv.length/2。但是,回调直到i达到其最终值时才执行,因为它是相同的变量(i)在每个回调中,它们都有相同的值。这是在JSL中使用闭包时的设计。如果我想访问I onclick,我应该传递什么作为参数?如果我想访问I onclick,我应该传递什么作为参数?@user1365010在我提供的第一个示例中,如果我想访问I oncl,你应该使用jick,我应该传递什么作为参数?@user1365010在我提供的第一个示例中,如果我想访问I onclick,我应该传递什么作为参数?如果我想访问I onclick,我应该传递什么作为参数?
for(var i=0;i<allDiv.length;i++) {
              addEvent(allDiv[i],
                       "click",function(){myFun(this)});
}
var myFun function(x)
{
    alert(x.style.backgroundColor);
}

$("div").click(myFun);