Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jQuery在任意函数调用时触发事件_Javascript_Jquery_Lightbox2 - Fatal编程技术网

Javascript 如何使用jQuery在任意函数调用时触发事件

Javascript 如何使用jQuery在任意函数调用时触发事件,javascript,jquery,lightbox2,Javascript,Jquery,Lightbox2,我想知道在调用任意函数时是否可以使用jQuery的bind()来触发自定义事件。大概 /* when cmsPlugin.func() is called, fire myCustom.func() too */ $.bind( cmsPlugin.func, myCustom.func ); 我们正在一个站点上使用Drupal的Lightbox2插件 当灯箱显示时,我想触发一些自定义代码,这些代码将附加到点击灯箱中的“下载”链接上 Lightbox2插件似乎没有调用$.trigger(),因

我想知道在调用任意函数时是否可以使用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()调用
  • 在检测到已单击lightbox触发元素后,只需反复敲击myCustom.func()一段时间。(www
  • \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

解决方案

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

谢谢亚当和卢乔。我对卢乔的建议没有任何把握,但我怀疑这是我自己的错,而不是卢乔的错:)

首先,我尝试了Lucho的示例代码,将其修改为在执行Lightbox.updateNav时激发Drupal.zipcart.init()。这对我不起作用

我决定对Lightbox.updateNav()进行扩展,因为它是Lightbox2的display方法中后期调用的一个简单函数

我试图修改Lucho的代码,看起来像这样,但没有成功-

// NOT THE RIGHT SOLUTION (for me)
Lightbox.updateNav = function(_dz, _lb) { return function() {
        _lb.updateNav();
        _dz.init();
    };
}(Drupal.zipcart, Lightbox);
下面是我最后使用的基于Adam答案的代码,它允许Drupal和模块很好地协同工作,在lightbox中创建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(); });
不能将事件侦听器绑定到函数。事件是从DOM节点绑定和触发的,因此您需要知道如何选择lightbox的标记。jQuery现在允许这样做,但仍然需要一个包装器来触发事件

我能想到的最干净的方法是包装Lightbox.updateNav函数并触发一个自定义事件

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

  Lightbox.updateNav = function () {
    $("#lightbox").trigger('lightbox.updateNav');
    _updateNav.apply(this, arguments);
  }
})();
#lightbox
需要指向可以将事件侦听器绑定到的lightbox标记。我对LightBox2的API了解不够,无法确切地告诉您如何做到这一点

这比简单的包装函数要好,因为您可以连接任意多的侦听器

$("#lightbox").bind('lightbox.updateNav', function() {})
由于lightbox标记可能是动态创建和销毁的,因此最好改用
delegate
(前提是您可以访问jQuery 1.4.2)。如果可以标识标记插入的位置,请将委托附加到父元素:

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

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

谢谢,我现在就来试试:)我刚刚在第一个anon func中添加了第二个参数,我想可能需要它。我不太幸运。这是我正在尝试的修改版本-我可能因为试图让我的问题变得普通而把事情弄糊涂了。谢谢亚当。我尝试了这两个和卢乔的修改后的答案如下。你的工作很成功,非常感谢。现在我将用我的最终代码更新这个问题。绑定调用应该移到别处,以分离updateNav函数和侦听器之间的关注点。我还建议使用
delegate
,因为lightbox标记在页面加载时不存在<代码>$(document).delegate(“#lightbox”,“lightbox.updateNav”,function(){})将工作,无论创建或销毁lightbox标记多少次。同样,我对插件的了解还不够,无法告诉您如何选择它的标记。谢谢,我也将研究
delegate
,尽管我看到它是jQuery最近添加的一个插件。我发现带子放错地方了。可能会尝试
live
。我不需要绑定到特定的#lightbox元素,因此我只将自定义事件与
文档
关联。上述代码已更新;最初,我在重写的
Lightbox.updateNav
函数中有一个
$().bind()
。如果Lightbox标记添加到页面的特定部分,最好将委托附加到该对象上--附加到
文档
将起作用,但事件必须在触发之前一直冒泡到DOM的顶部,因此速度会较慢。
$('#lightbox-parent').delegate('#lightbox', 'lightbox.updateNav', function() {})