2011-12-19 79 views
1

擁有這片HTML的:MooTools事件委託:如何引用回調中的子元素?

<div id="modal"> 
    <select class="country"> 
     <option value=""></option> 
     <option value="opt">Opt</option> 
    </select> 
</div> 

這一塊的JS:

$('modal').addEvent('change:relay(.country)', function(){ 
    console.log(this); // "this" refers to #modal. 
}).fireEvent('change:relay(.country)'); 

日誌顯示,this關鍵字指#modal元素。我想爲每個.country選擇一個事件並在回調中引用每個。我怎麼能擁有它? 這是小提琴:http://jsfiddle.net/EWUCG/5/ 非常感謝!

+0

我有同樣的問題。這是要走的路,即使這個線程可能已經死了... http://stackoverflow.com/questions/2689010/mootools-programmatically-fired-events-not-working-with-event-delegation?rq=1 – zhealot 2012-09-10 20:58:24

回答

0

這可能是你所追求的......我在IRC在就撿起一年前,不能告訴你誰提供了它。

http://jsfiddle.net/prbNK/7/

和元方法更好的代碼重用 - http://jsfiddle.net/prbNK/12/

+0

非常感謝,這就是我一直在尋找的! – 2012-01-23 18:20:56

+0

沒問題。這是一個方便的代碼片段);) – 2012-01-23 19:07:09

0
$$('.country').addEvent('change', function(){ 

    console.log(this); 
    // "this" refers to select 

    console.log(this.getElement(':selected')); 
    // this.getElement(':selected') refers to selected option 

}).fireEvent('change'); 
+0

這不是我需要的。我瞭解MooTools的基本事件。我正在談論新的事件授權系統和中繼事件。 – 2011-12-19 18:39:14

1

從聊天的IRC頻道:

  • 事件委託是基於關閉事件冒泡的。
  • 因此,父項中的元素將觸發事件。然後它會觸發父節點中的事件...
  • 它一直這樣做,直到沒有父母(窗口)
  • 所以,你真的只是設置回調發生時,其中一個父母收到該事件從它的孩子傳出。

我留下唯一的解決辦法是「eaching」:

$('modal').addEvent('change:relay(.country)', function(event, target){ 
    console.log(this, event, target); // Then "this" refers to each .country select. 
}); 
$$('.country').each(function(el){ 
    $('modal').fireEvent('change', [null, el]); 
}); 

小提琴:http://jsfiddle.net/EWUCG/12/

+0

當** select **中的**選項**手動更改時**這個**內部處理程序函數引用** select **元素。 – Diode 2011-12-19 19:47:44

+0

@Diode,是的,但我不是在談論點擊選擇並用鼠標選擇選項。我正在談論通過JS解僱事件。不管怎麼說,還是要謝謝你。 – 2011-12-20 18:07:36