我想知道是否有可能在調用任意函數時使用jQuery的bind()來觸發自定義事件。類似的,如何觸發使用jQuery的任意函數調用事件
/* when cmsPlugin.func() is called, fire myCustom.func() too */
$.bind(cmsPlugin.func, myCustom.func);
我們在網站上使用Drupal的Lightbox2插件。
當燈箱顯示時,我想激發一些自定義代碼,這些代碼將附加到點擊燈箱中的「下載」鏈接上。
的Lightbox2插件似乎並沒有調用$ .trigger(),所以我有幾個選擇 -
- 查找綁定到JavaScript函數調用的方式。 (在這種情況下,Lightbox.end我相信)。
- 使用現有的事件,例如$(document).ready,它可能會作爲燈箱顯示的一部分被激發。
- 擴展現有函數以添加$ .trigger()調用。
- 在檢測到單擊了lightbox-triggering元素後,重複一次錘擊myCustom.func()一段時間。 (EWWW)
- __ _ __ _ __?
解決方案
我試圖通過使用cmsPlugin.func/myPlugin.func簡化我的問題,但我想我可能這樣做混淆了自己。但是,我希望所發佈的解決方案對於未來的讀者來說是足夠通用的。
感謝Adam和Lucho。我沒有與Lucho的建議有任何運氣,但我懷疑這是我自己的錯,而不是Lucho的:)
起初我試過Lucho的示例代碼,修改它以激發Drupal.zipcart.init()時Lightbox .updateNav被執行。這對我不起作用。
我決定對Lightbox.updateNav()進行擴展,因爲它是一個簡單的函數,在Lightbox2的顯示方法中稱爲late。
我在修改盧喬的代碼看起來像這樣,但沒有成功嘗試 -
// NOT THE RIGHT SOLUTION (for me)
Lightbox.updateNav = function(_dz, _lb) { return function() {
_lb.updateNav();
_dz.init();
};
}(Drupal.zipcart, Lightbox);
這是我結束了使用基於亞當的答案,它允許Drupal的ZipCart和Lightbox2模塊,很好地一起玩的代碼,在Lightbox中使用類=「zipcart」的鏈接將文件正確添加到下載購物車。
(function(){
var _updateNav = Lightbox.updateNav;
Lightbox.updateNav = function() {
$(document).bind('lightbox.updateNav', function() {
Drupal.zipcart.init();
});
$("#lightbox").trigger('lightbox.updateNav');
_updateNav.apply(this, arguments);
}
})();
$(document).bind('lightbox.updateNav', function() { Drupal.zipcart.init(); });
綁定調用應該移到其他地方,以分隔updateNav函數和監聽器之間的關注。我還建議使用'委託'代替,因爲在頁面加載時,lightbox標記不存在。 '$(document).delegate('#lightbox','lightbox.updateNav',function(){})'無論有多少次創建或銷燬燈箱標記都可以工作。再一次,我對這個插件不夠了解,告訴你如何選擇它的標記。 – 2010-10-27 21:25:58
謝謝,我也會研究'delegate',儘管我發現它是jQuery的最新成員。我發現綁定在錯誤的地方。可以嘗試'活着',而不是。 – 2010-10-27 21:40:56
我不需要綁定到特定的#lightbox元素,所以我只是將自定義事件與'document'關聯起來。上述代碼已更新;最初我在重寫的'Lightbox.updateNav'函數中有一個'$()。bind()'。 – 2010-10-27 21:47:26