2012-10-04 68 views
26

有沒有辦法用jQuery手動觸發委託事件處理程序?如何使用jQuery手動觸發委託事件?

採取以下示例代碼:

<div class="container"> 
    <input type="button" value="Hello"> 
    <span class="output"></span> 
</div> 
​ 
<script> 
    $('.container') 
    .on('click', '[type=button]', function(e) { 
     $(e.delegateTarget).find('.output').text($(this).val()); 
    }) 
    .find('[type=button]').triggerHandler('click');​ 
</script> 

(在線:http://jsfiddle.net/TcHBE/

我期待這會工作,並文本「Hello」將出現在跨度沒有實際點擊的按鈕,但它沒有。

我在處理程序中使用e.delegateTarget,因爲.ouput元素不會與按鈕有一個已知的關係,除了.container中的某個地方。這就是我首先使用委託事件處理程序的原因。

更新:

而且我使用triggerHandler,因爲該事件已在真實代碼,我不希望觸發默認行爲。 (在真實的代碼中,事件是Bootstrap Modal plugin的自定義事件hide,但我實際上並不想在頁面加載時觸發事件處理程序時隱藏模式)。

我可以將處理程序提取到一個命名函數中並直接調用它,但由於使用了e.delegateTarget,這會使得構造更復雜。

+0

更新您的代碼以顯示實際問題。目前還不清楚是否要阻止其他事件處理程序或默認操作發生。 – Prinzhorn

回答

46

您可以手動創建一個Event對象,並相應地設置target屬性來誘使jQuery思考事件冒泡。

var c = $('#container'); 

c.on('click', '[type=button]', function(e) { 
    $(e.delegateTarget).find('span').text($(this).val()); 
}); 

var event = jQuery.Event('click'); 
event.target = c.find('[type=button]')[0]; 

c.trigger(event); 

http://jsfiddle.net/PCLFx/

+20

幾個月後,我回來,實際上需要這個自己;-) – Prinzhorn

+0

比使用skeezy無證API來檢索事件處理函數更好。 – wberry

+0

'Event.target只讀' 來源:https://developer.mozilla.org/en-US/docs/Web/API/Event –

0

選擇器在.on()方法是可選的。
當你寫:

$('.container') 
    .on('click', '[type=button]', function(e) { 
     $(e.delegateTarget).find('.output').text($(this).val()); 
    }) 
    .find('[type=button]').triggerHandler('click');​ 

你告訴事件處理程序只聽容器內的按鈕點擊。
$(e.delegateTarget)只是對外部容器的引用。我已更新your fiddle to echo this

這是報價from the API:

當提供一個選擇器,該事件處理程序被稱爲 委派。當事件直接發生在綁定元素的 上時,不會調用處理函數,但僅對於 與選擇器匹配的後代(內部元素)。 jQuery將事件從事件目標 中的事件冒泡到處理程序所附的元素(即,最內層到最外層元素 ),併爲匹配選擇器的路徑上的任何元素運行處理程序。

+2

此編輯可能會改變他的代碼的意圖/目的。在這段代碼中包含選擇器'[type = button]'會將事件附加到加載**頁面後添加到DOM **的按鈕中。如果他刪除選擇器,動態添加的按鈕在點擊時不會觸發該功能。 –

+0

@NoahWhitmore謝謝。這是一個重要的提及。我曾經忘記了關於第四維的一切。 :) – bldoron