当选择器不满足时调用jQuery操作?

当选择器不满足时调用jQuery操作?,jquery,lightbox,fancybox,Jquery,Lightbox,Fancybox,我一直在为一个客户的网站做一个原型,我遇到了一个相当大的障碍 如您所见,它的工作方式是您可以水平滚动一组幻灯片,然后单击一个,打开包含更多幻灯片的堆栈。然后,如果再次单击该堆栈中的图像,将打开一个灯箱。单击另一个堆栈或“关闭”按钮将关闭该堆栈并打开另一个堆栈(视情况而定) 这一切都很好。但是,如果您执行以下操作,就会出现一些奇怪的行为: 单击以打开任何堆栈。 单击打开图像的灯箱如果单击与主列表处于同一级别的图像,效果最佳。 通过单击关闭按钮或单击另一个堆栈关闭灯箱和堆栈。 单击返回到第一个堆栈。

我一直在为一个客户的网站做一个原型,我遇到了一个相当大的障碍

如您所见,它的工作方式是您可以水平滚动一组幻灯片,然后单击一个,打开包含更多幻灯片的堆栈。然后,如果再次单击该堆栈中的图像,将打开一个灯箱。单击另一个堆栈或“关闭”按钮将关闭该堆栈并打开另一个堆栈(视情况而定)

这一切都很好。但是,如果您执行以下操作,就会出现一些奇怪的行为:

单击以打开任何堆栈。 单击打开图像的灯箱如果单击与主列表处于同一级别的图像,效果最佳。 通过单击关闭按钮或单击另一个堆栈关闭灯箱和堆栈。 单击返回到第一个堆栈。你得到的不是重新打开堆栈,而是灯箱。 这让我感到困惑,因为只有在包含UL的服务器上有一个类并且该类在lightbox关闭时被移除时,才应该调用lightbox。我检查了又检查了一遍,它肯定不见了

以下是各自的功能:

$("ul.hide a.lightbox").live("click",function(){
    $("ul.show").removeClass("show").addClass("hide");
    $(this).parent().parent().removeClass("hide").addClass("show");
    $("ul.hide").animate({opacity: 0.2});
    $("ul.show").animate({opacity: 1});
    $("#next").animate({opacity: 0.2});
    $("#prev").animate({opacity: 0.2});
    return false;
});

$("ul.show a.lightbox").live("click",function(){
    $(this).fancybox().trigger("click");
    return false;
});
如您所见,为了使灯箱被称为包含UL的,必须具有show类。然而,如果你用Firebug检查它,它不会

对于那些好奇的人,添加了.triggerclick;是因为lightbox需要双击才能启动,否则

知道如何解决这个问题吗?

我认为问题在于,添加show类后,click事件会立即附加,但一旦删除它,它就不会解除绑定

我认为最好是这样做:

$("ul a.lightbox").click(function(){
  if( $(this).parent().is(".show") ){
    $(this).fancybox().trigger("click");
  }
  return false;
});
$("ul.show a.lightbox").live("click",function(){
  $(this).fancybox().trigger('click').unbind('click');
  return false;
});

啊,我明白了。特别感谢Seb为我指明了正确的方向。我添加了一个unbind函数,每当您单击关闭一个堆栈或单击另一个堆栈时都会调用该函数。它可能有点脏,但每次打开和关闭堆栈时,事件都会被绑定和解除绑定

我将更新原型以反映我的更改。谢谢你的帮助

最好的选择是在触发器之后使用,因为.fancybox在链接上附加了一个直接单击事件处理程序,如下所示:

$("ul a.lightbox").click(function(){
  if( $(this).parent().is(".show") ){
    $(this).fancybox().trigger("click");
  }
  return false;
});
$("ul.show a.lightbox").live("click",function(){
  $(this).fancybox().trigger('click').unbind('click');
  return false;
});

在这两种情况下都不起作用。嗯。我仔细检查了路径。有趣的是,它正在开火。我猜这与触发器功能无关。我想说的是,它正在发射,因为当你把show类拿出来的时候,你并没有解除方法的绑定。使用此解决方案并不重要,它会在每次检查家长是否有show类时进行检查,这正是我所做的。我会给你正确答案的分数,因为,嘿,为什么不呢?