jQuery действие вызывается, когда селектор не встречается? - PullRequest
0 голосов
/ 21 мая 2010

Я работал над прототипом для веб-сайта клиента и столкнулся с довольно серьезной проблемой. Вы можете посмотреть прототип здесь .

Как вы можете видеть, как это работает, вы можете прокрутить набор слайдов по горизонтали и, щелкнув по одному, открыть стек, содержащий еще больше слайдов. Если затем снова щелкнуть изображение в этом стеке, оно откроет лайтбокс. Нажатие на другой стек или кнопка закрытия закроет этот стек (и откроет другой, в зависимости от обстоятельств).

Это все прекрасно работает. Однако вы получите странное поведение, если сделаете следующее:

  1. Нажмите, чтобы открыть любой стек.
  2. Нажмите, чтобы открыть световую коробку изображения (это лучше всего работает, если щелкнуть изображение, которое находится на уровне основного списка).
  3. Закройте световую коробку и стопку, нажав кнопку закрытия или щелкнув другую стопку.
  4. Нажмите обратно на первый стек. Вместо того, чтобы снова открывать стек, вы получаете лайтбокс.

Это смущает меня, так как лайтбокс должен вызываться только в том случае, если есть класс, содержащий UL, и этот класс удаляется, когда лайтбокс закрывается. Я проверил и дважды проверил это, оно определенно отсутствует.

Вот соответствующие функции:

$("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, он не будет.

Для любопытных добавлен .trigger("click");, потому что для запуска лайтбокса потребуется двойной щелчок.

Есть идеи, как это исправить?

Ответы [ 3 ]

0 голосов
/ 21 мая 2010

Ах, я понял. Отдельное спасибо Seb за то, что направили меня в правильном направлении. Я добавил функцию unbind(), которая вызывалась всякий раз, когда вы щелкали, чтобы закрыть стек или нажимали на другой стек. Возможно, это немного грязно, но событие связывается и не связывается каждый раз, когда вы открываете и закрываете стек.

Я обновлю прототип, чтобы отразить мои изменения. Спасибо за помощь!

0 голосов
/ 21 мая 2010

Наилучшим вариантом является .unbind('click') после используемого вами триггера (поскольку .fancybox() присоединяет к ссылке прямой обработчик click события, см. Строку 771 здесь ), вот так:

$("ul.show a.lightbox").live("click",function(){
  $(this).fancybox().trigger('click').unbind('click');
  return false;
});
0 голосов
/ 21 мая 2010

I думаю проблема в том, что событие click присоединяется, как только вы добавляете класс show, но оно не освобождается после удаления.

Я бы сказал, что было бы лучше сделать что-то вроде этого:

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