我想知道是否有可能在调用任意函数时使用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