0

IEでJavaScriptを使用して、reflectedプロパティを使用しましたが、問題は12個のアイテムとすべてのアラートがあること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])

この場合あなたを台無しにしているものであるクロージャを調べてください。を使用して無名関数を作成すると、function() { }作成されたスコープにバインドされたクロージャが作成されます。したがって、クロージャー内では、変数iはループで使用していたものと同じ変数です。したがって、アイテムをダブルクリックすると、ループはすでに終了していi == 12ます。ループのalert(i);直後に置くのと同じです。for(i in items) { }

それで、それを念頭に置いて、私の2番目の例はどのようにそれを修正しますか?

まあ、それは1つの変数を受け入れる自己実行無名関数を使用しますitemこの関数は、スコープ内にバインドされているクロージャを返します。外側のクロージャはすぐに実行され、渡されitems[i]ます。これにより、住みたい変数の安定したスコープが作成されます。

クロージャに慣れていない場合、クロージャは少し気が遠くなるかもしれませんが、JavaScriptを使用して関数型プログラミングを行うには、クロージャを理解することが重要です。

SetAttributeが機能するのは、変数を遅延参照するのではなく、ループを通過するたびに評価する新しい文字列を作成しているためですi

PS

for( in ) {}配列でを使用するのはおそらく悪い考えです。予期しない結果が生じる可能性があります。配列内のアイテムだけでなく、オブジェクトのすべてのプロパティをループする必要があります。通常のを使用する方がおそらく安全です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 に答える