Bind / Unbind внутри обратного вызова - PullRequest
2 голосов
/ 20 мая 2011

У меня возникают всевозможные проблемы из браузера дерьма, которые я не могу решить ни с чем, что прочитал. Вот ситуация ... Я использую сторонний плагин для создания галереи. Этот плагин поставляется с обратным вызовом при изменении изображения, которое срабатывает при каждом изменении изображения.

То, что я пытаюсь сделать, это добавить CSS для двух div-ов ... один, который является div-оберткой, который будет выдвигаться при нажатии на дочерний div и вставляться обратно при повторном нажатии на дочерний элемент.

Вот обратный звонок:

        changepicturecallback: function(){
                    $('.sxpp_commentsImage').unbind(toggle);
    oldWidth = $('.pp_pic_holder').width() - 20,
    newWidth = $('.pp_pic_holder').width() + (200),
    newHeight = $('.pp_hoverContainer').height(),
    cImageAlign = newWidth - 20;

                var toggle = function() {
                   if(newWidth == $('.sxpp_comments').width()){
                        $('.sxpp_comments').animate({width: oldWidth});
                            }else{
                        $('.sxpp_comments').animate({width: newWidth});
                    }
                }

            $('.sxpp_comments').width(oldWidth).css('background-color','red'); 
      $('.sxpp_commentsImage').css({'float':'right','background-color':'green','width':'20px','height':newHeight});     
            $('.sxpp_commentsImage').bind('click',toggle);      
  }

Это прекрасно работает в FF4 и Chrome ... однако, это как если бы "связывание" не происходило в Internet Explorer. Я читал о методах ".live" и ".delegate", но (A) я не знаком с тем, как они работают (B) Если возможно очистить этот ".live" на изменениях, добавьте его назад, как я делаю с привязкой.

Любое понимание или вещи, которые я мог бы упускать из виду ??

Редактировать *** ... Div создаются динамически (отображается лайтбокс) при нажатии на ссылку. Таким образом, из всего, что я читаю ... событие связывания - неправильный путь, чтобы пойти так или иначе.

Ответы [ 3 ]

3 голосов
/ 24 декабря 2015

Если вы хотите отменить привязку события внутри его обратного вызова, просто используйте это:

$('body').bind('click', function(evt){
    console.log('I will be written only once');
    $(this).unbind(evt);
})
1 голос
/ 20 мая 2011

try

$('.sxpp_commentsImage').unbind("click", toggle);

вместо

$('.sxpp_commentsImage').unbind(toggle);

Редактировать:

Или использовать:

$('.sxpp_commentsImage').bind('click.myEvent', toggle);

, а затем

$('.sxpp_commentsImage').unbind('click.myEvent');

как тумблер не будет объявлен к тому моменту, когда вы выполните развязку.

1 голос
/ 20 мая 2011
  • bind() для элементов, которые присутствуют при загрузке страницы. Хорошо для статики.
  • live() - единственное решение для динамически генерируемых элементов. Единственный выбор для динамики.

Вы должны отменить привязку событий, таких как click или toggle, а не фактических имен функций, которые могут быть вашей проблемой.

...