私はメッセージのマップを持っています:
var Mapping = {
"notnow": 2,
"expensive": 3,
"not_worth_it": 4
}
私はたくさんのhtml要素を持っています(同じ名前のdivとしましょう)
<div id="notnow"></div>
、等
次に、それぞれにクリック ハンドラーをアタッチしたいので、以下に示すようにループを実行します。
function setThemUp(){
for(var item in Mapping)
{
$("#" + item).bind('click', function () {
Apply(Mapping[item]); });
}
}
しかし、何らかの理由で、それらすべてが「not_worth_it」にバインドされているようです:4. それぞれの値ではありません。
Jquery 1.5 を使用しています。
誰かがなぜこれが起こっているのか説明できますか?
私の推測では、Mapping[item] が値に解決されるのではなく、参照などとして渡されていると思います。そのため、 item の値は最終的に「価値がない」ことを指すため、すべてがその値で関数を呼び出します自体。私がそれらを克服できる方法。
それぞれを次のようにハードコーディングします
$("#notnow").bind('click', function () {
Apply(Mapping["notnow"]); });
$("#expensive").bind('click', function () {
Apply(Mapping["expensive"]); });
$("#not_worth_it").bind('click', function () {
Apply(Mapping["not_worth_it"]); });
動作しますが、ループを使用したエレガントなソリューションをお勧めします。
答え
私は閉鎖ソリューションに行きました
function setThemUp(){
for(var item in Mapping)
{
$("#" + item).bind('click', (function () {
return function(temp) {
Apply(Mapping[temp]); };
})(item));
}
}
理由は、これは jquery の最適化ではなく、ループが機能しなかった理由でした.