0

在 IE 中使用 JavaScript 时,我使用了反射属性,但问题是我有 12 个项目并且全部为 alert 12

我用setAttribute的时候没问题。

到目前为止我所拥有的:

    var items = [1,2,3,4,5,6,7,8,9,10,11,12];
    for (i in items)    {
        newdiv = document.createElement("div");

        //newdiv.setAttribute("class","box");
        //newdiv.setAttribute("id",items[i]);
        //newdiv.setAttribute("ondblclick","chkItem("+items[i]+");");

        newdiv.className = "box";
        newdiv.id = items[i];
        newdiv.ondblclick = function() {alert(items[i])}
        newdiv.innerHTML = " " + items[i];
        document.getElementById("items").appendChild(newdiv);
    }
4

2 回答 2

2

改变:

newdiv.ondblclick = function() {alert(items[i])}

对此:

newdiv.ondblclick = (function(item) { return function() {alert(item)} })(items[i])

查找Closures,这就是在这种情况下搞砸你的原因。当您使用创建匿名函数function() { }时,您正在创建一个绑定在它创建的范围内的闭包。因此,在您的闭包中,您的变量i与您在循环中使用的变量相同。因此,当您双击一个项目时,循环已经完成并且i == 12. 这就像你在循环alert(i);之后直接放一个一样。for(i in items) { }

那么,考虑到这一点,我的第二个示例如何解决这个问题?

嗯,它使用一个接受一个变量的自执行匿名函数,item. 此函数返回一个闭包,该闭包绑定在范围内。外部闭包立即执行,传入items[i],这为您想要居住的变量创建了一个稳定的范围。

如果您不习惯闭包,可能会有点费解,但理解它们是使用 JavaScript 进行函数式编程的重要部分。

SetAttribute 之所以有效,是因为您正在创建一个新字符串,该字符串每次通过循环进行评估,而不是后期引用变量i

附言

for( in ) {}在数组上使用 a 可能是个坏主意。您可能会得到意想不到的结果,它应该循环遍历对象的所有属性,而不仅仅是数组中的项目。使用常规可能更安全for(var i=0;i<items.length;i++) {}

于 2011-09-07T18:08:31.930 回答
1

因为在双击的函数调用中,您正在引用您已经为其定义了 ID 值的元素......为什么不直接使用。

newdiv.ondblclick = function() {alert(this.id)}

thisnewdiv 元素在哪里。

示例在这里

于 2011-09-07T18:21:51.163 回答