我想知道是否可以在调用任意函数时使用 jQuery 的 bind() 来触发自定义事件。就像是,
/* when cmsPlugin.func() is called, fire myCustom.func() too */
$.bind( cmsPlugin.func, myCustom.func );
我们在一个站点上使用 Drupal 的 Lightbox2 插件。
当灯箱显示时,我想触发一些自定义代码,这些代码将附加到点击灯箱中的“下载”链接。
Lightbox2 插件似乎没有调用 $.trigger(),所以我有几个选择 -
- 找到一种绑定到 javascript 函数调用的方法。(在这种情况下,我相信 Lightbox.end。)
- 使用现有事件,例如 $(document).ready,它可能 (?) 作为灯箱显示的一部分被触发。
- 扩展现有函数以添加 $.trigger() 调用。
- 在检测到触发灯箱的元素已被单击后,只需反复敲击 myCustom.func() 一段时间。(万维网。)
- _ _ __ _ __ ?
解决方案
我试图通过使用 cmsPlugin.func / myPlugin.func 来简化我的问题,但我想我这样做可能会让自己感到困惑。但是,我希望发布的解决方案足够通用,以供未来的读者自己使用。
感谢亚当和卢乔。Lucho 的建议我没有任何运气,但我怀疑这是我自己的错,而不是 Lucho 的 :)
起初我尝试了 Lucho 的示例代码,修改它以在执行 Lightbox.updateNav 时触发 Drupal.zipcart.init()。这对我不起作用。
我决定对 Lightbox.updateNav() 进行扩展,因为它是 Lightbox2 显示方法后期调用的一个简单函数。
我修改 Lucho 代码的尝试看起来像这样,但没有奏效 -
// NOT THE RIGHT SOLUTION (for me)
Lightbox.updateNav = function(_dz, _lb) { return function() {
_lb.updateNav();
_dz.init();
};
}(Drupal.zipcart, Lightbox);
这是我根据 Adam 的回答最终使用的代码,它允许 Drupal 的ZipCart和Lightbox2模块很好地协同工作,使灯箱中带有 class="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(); });