javascript - 如何使用 jQuery 在任意函数调用上触发事件

标签 javascript jquery lightbox2

我想知道是否可以使用 jQuery 的 bind() 在调用任意函数时触发自定义事件。类似这样的东西,

/* when cmsPlugin.func() is called, fire myCustom.func() too */
$.bind( cmsPlugin.func, myCustom.func );

我们正在网站上使用适用于 Drupal 的 Lightbox2 插件。

当显示灯箱时,我想触发一些自定义代码,这些代码将附加到灯箱中“下载”链接的点击。

Lightbox2 插件似乎没有调用 $.trigger(),所以我有几个选项 -

  • 找到一种绑定(bind) JavaScript 函数调用的方法。 (在这种情况下,我相信是 Lightbox.end。)
  • 使用现有事件,例如 $(document).ready,它可能(?)作为灯箱显示的一部分被触发。
  • 扩展现有函数以添加 $.trigger() 调用。
  • 检测到灯箱触发元素被点击后,只需重复敲击 myCustom.func() 一段时间即可。 (呃www。)
  • ________ ?

解决方案

我试图通过使用 cmsPlugin.func/myPlugin.func 来简化我的问题,但我认为这样做可能会让自己感到困惑。不过,我希望发布的解决方案足够通用,供 future 的读者自己使用。

谢谢亚当和卢乔。我对 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 的 ZipCartLightbox2模块可以很好地协同工作,使灯箱中带有 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(); });

最佳答案

您无法将事件监听器绑定(bind)到函数。事件是从 DOM 节点绑定(bind)和触发的,因此您需要知道如何选择灯箱的标记。 jQuery 现在允许这样做,但您仍然需要一个包装器来触发事件。

我能想到的实现此目的的最简洁方法是包装 Lightbox.updateNav 函数并触发自定义事件。

(function(){
  var _updateNav = Lightbox.updateNav;

  Lightbox.updateNav = function () {
    $("#lightbox").trigger('lightbox.updateNav');
    _updateNav.apply(this, arguments);
  }
})();

#lightbox 需要指向您可以绑定(bind)事件监听器的灯箱标记。我对 LightBox2 的 API 不太了解,无法告诉您具体如何执行此操作。

这比简单的包装函数更好,因为您可以连接任意数量的监听器。

$("#lightbox").bind('lightbox.updateNav', function() {})

由于灯箱标记可能是动态创建和销毁的,因此您最好使用 delegate 代替(前提是您可以访问 jQuery 1.4.2)。如果您可以识别插入标记的位置,请将委托(delegate)附加到父元素:

$('#lightbox-parent').delegate('#lightbox', 'lightbox.updateNav', function() {})

这比 .live() 的性能要好得多,所以如果可以的话,我建议您这样做。

关于javascript - 如何使用 jQuery 在任意函数调用上触发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4037120/

相关文章:

javascript - 鼠标滚轮水平滚动时抖动

javascript - 如何从不带引号的变量中推送 Firebase 中的数字?

javascript - 网站的不同安全措施(HTTP header 等)

javascript - html <输入需要包含特定文本

javascript - jquery 灯箱保存图像

jquery - 如何在页面中心对齐 Lightbox 2?

javascript - 气体/Javascript : How do I set values to only empty rows at the bottom of the sheet

jquery - 如果所有对象都具有相同的 css 值,则

javascript - 删除隐藏图像的 'white-space'

jquery - 使用 javascript 触发灯箱