【问题标题】:how to trigger Live() click in jquery如何在jquery中触发Live()点击
【发布时间】:2010-06-30 13:48:03
【问题描述】:

我有一个有趣的情况。我需要触发实时点击,因为简单的点击不起作用。

这就是我所拥有的:

$('.text').trigger('click');

但我需要这样的东西:

$('.text').trigger(live('click' ...));

或者解决这个问题的东西。

这是我的代码:

$(".Sets a.largeImage").fancybox({

  'onComplete': function(){
    return errorimage(myurl);
  } 

});

function errorimage(url) {

  $("#fancybox-img").live('click', function(){
   $('.lightbox:first').trigger('click');
  });

  $('#fancybox-img').trigger('click');

}   

想法是我想触发$('.lightbox:first').trigger('click');,但是在实时模式下,因为简单的点击不起作用!

谢谢!!!!

【问题讨论】:

  • 你能分享一下这个问题的背景吗?

标签: jquery triggers live


【解决方案1】:

最好的解决方案是将您的点击处理程序放在一个单独的函数中。

然后,您可以从实时点击处理程序以及想要手动触发点击时调用此函数。

【讨论】:

  • 我不能手动触发,因为这个函数我必须调用,当另一个函数是“onComplete”时
  • 什么意思?您可以在live 处理程序和其他地方(包括onComplete)调用该函数
  • 如果函数需要适当的上下文才能运行,则不能只调用该函数;这在使用.live 时可能很常见。对于简单的情况,尽管您可以简单地提供所说的上下文或通用上下文......但仅适用于简单的情况。
【解决方案2】:

我在使用使用 live() 绑定点击事件的 Lightbox2 时遇到了同样的问题。 在我的情况下,解决方案是触发这样的事件:

jQuery**('a[rel^="lightbox"]')**.ready(function () {
jQuery("#myimglink").trigger("click");
})

如您所见,我仅在使用灯箱的所有图像都准备好后才触发事件。希望它会对大家有所帮助 - 这是我对 stackoverflow 的第一个贡献:)。

【讨论】:

    【解决方案3】:

    我猜您面临的问题是,live()delegate() 不会将事件处理程序绑定到 DOM element / jQuery object 本身,但在某些 parent node 上。例如,live() 会将处理程序绑定到检查event.targetdocument.body。简单来说就是使用event bubbling,这就是live events的思路。

    换句话说,使用实时,可能会触发类似的事件

    $(document.body).trigger({ 
       type:   'click',
       target: $('.text')[0]
    });
    

    更新

    不幸的是,这似乎不起作用。我还尝试设置currentTargetrelatedTarget.live() 将处理程序绑定到哪里?有人吗?

    【讨论】:

      【解决方案4】:

      当我面临类似情况时,我发现 SLaks 的解决方案非常有用。但是,将 .live("click", handlerFn) 和 .bind("click", handlerFn) 附加到相同的元素似乎是冲突的(我不知道在这种情况下适用什么优先规则)。 但是,如果您使用自定义事件而不是“点击”作为触发器,它就可以正常工作。

      $(".elems").bind("customEvent", handlerFn);
      $(".elems").live("click", handlerFn);
      
      $(".elems").trigger("customEvent");
      
      function handlerFn() {
      }
      

      【讨论】:

        【解决方案5】:

        这是另一种适合我的方式。

        $('#test').live('click', function() {
            alert("It works!");            
        });
        
        $('#test')[0].click();
        

        这里的重要部分是:

        $('#test')[0].click();
        

        【讨论】:

          【解决方案6】:

          我相信您可以只使用您的第一个示例,因为触发器仅用于激活绑定元素,而不是绑定它..

          所以当你这样做时:

          $('#someElement').live('click',function(){./*..*/});
          

          这和

          一样
          $('#someElement').click(function(){./*..*/}); 
          

          除了第一个之外,还会在每个 ajax 请求上检查新的 html 并再次绑定。

          就这样吧:

          $('div.class').trigger('click');
          

          它应该触发实时元素

          【讨论】:

          • 错了。 livebind 非常不同。您将它与 livequery 混淆了,它确实像那样工作。
          • 是的,我知道 live 是不同的,但是一旦 ajax 内容返回并注入 DOM,live 就会到位并在任务完成之前绑定元素,一旦进入 dom 并绑定到点击,触发器也应该适用于“新内容”
          • 你错了。 Live 不绑定任何元素。调用live 将处理根元素上的事件,这将看到每个冒泡的事件。然后它检查e.target 并引发任何订阅该目标的处理程序。
          • @SLaks 是正确的,.live() 在 AJAX 事件发生、DOM 被修改等情况下不起作用。它是一个被动侦听器,等待事件发生气泡。
          • 好的,那么我为此道歉,我必须更详细地阅读有关 live 工作方式的信息。谢谢你。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-14
          • 2012-08-10
          • 1970-01-01
          • 1970-01-01
          • 2016-09-19
          • 2011-11-19
          • 2011-09-22
          相关资源
          最近更新 更多