2012-04-29 62 views
0

我是JavaScript新手。 我需要添加一個EventListener到Node.on('click',foo);我的第一次嘗試是 - 當然 - 一個失敗:來自「The Good Parts」的EventListener示例

var i = 0; 
Y.one('#btnDel' + i).on('click', function() { 
    Y.one('#part' + i).remove(true); 
}); 

比我rememberred是類似的東西是在「JavaScript的:好零件」的書,我發現它(第39頁):

var add_the_handlers = function (nodes) { 
    var i; 
    for (i = 0; i < nodes.length; i += 1) { 
     nodes[i].onclick = function (i) { 
      return function (e) { 
       alert(e); 
      }; 
     }(i); 
    } 
}; 

但這也行不通。通過第二次(更多第21次)的觀察,我發現有一些問題:你返回一個需要參數'e'的內部函數,但是'i'沒有被調用到內部函數 - 僅僅是外部函數。 我「固定」這個,現在它在我的情況可與YUI:

Y.one('#btnDel' + i).on('click', function (i) { 
    return function() { 
     Y.one('#part' + i).remove(true); 
    } 
}(i)); 

on the errata pakge,有人寫了這個「修復」了。但作者(Crockford!)仍堅持書本版本。是否有我管理的內容 - 這只是我的版本適用於我的情況的巧合?

ps:當我將i綁定到我的匿名返回函數this.i時,那麼這將是全局對象嗎?

pps:對不起,我的英語很棒。 :|

回答

0

嘗試使用類選擇器收集所有按鈕。然後,你可以簡單地使用「每個」功能:

Y.all(".buttonClassName").each(function (oneButtonNode) { 
    oneButtonNode.on("click", function (event) { 
     //do something 
     alert(this.get("id")); 
    }) 
}); 

YUI3實況:http://yuilibrary.com/yui/docs/node/#nodelist

2

...或使用事件委派:http://yuilibrary.com/yui/docs/node/node-evt-delegation.html

1)你最終將只有一個事件監聽器將委託給所需的元素(在你的情況下按鈕), 2)它會更好的動態內容。如果稍後添加另一個元素(例如,按鈕),則不必爲其添加另一個偵聽器。它已經由代表團處理。

......你提到的例子(第39頁)是一個典型的閉包,對大多數新人來說都是一個問題。所以不用擔心。你已經想出了自己的解決方案,這是令人印象深刻的。

相關問題