Привязка / отвязка внутри обратного вызова

#jquery #dynamic #callback #bind

#jquery #динамический #обратный вызов #привязка

Вопрос:

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

Что я пытаюсь сделать, так это добавить css для двух div… тот, который является оберткой 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», но (А) я не знаком с тем, как они работают (Б) Если возможно убрать это «.live» при изменении, затем добавьте его обратно, как я делаю с привязкой.

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

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

Ответ №1:

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

 $('body').bind('click', function(evt){
    console.log('I will be written only once');
    $(this).unbind(evt);
})
  

Комментарии:

1. это отвязка работает, но что, если я захочу снова привязать это событие сразу после отвязки?

2. затем используйте функции,

Ответ №2:

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

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

Комментарии:

1. Я согласен, что это должен быть live () … однако, когда изображение меняется… это привело бы к тому, что live () были бы наложены друг на друга. Есть ли способ очистить предыдущий live() перед добавлением следующего?

2. Почему это должно складываться? Разве у вас нет глобальной функции, которая заботится обо всех этих элементах?

3. Что ж… Я не думал о том, чтобы убрать «var toggle = » из обратного вызова и сделать его глобальным … моя n00bness просвечивает. Поэтому я убрал его из обратного вызова и добавил «$ (‘.sxpp_commentsImage’).live(‘click’, переключить);» однако, все еще имеет тот же эффект в IE.

4. Вы можете использовать $(this) в своих функциях для ссылки на элемент, который активировал событие. Это полезно.

5. что ж… Я переключил развязку / привязку на die / live. После попытки выяснить, что происходит… Я все еще застреваю, черт возьми. Я даже попытался сделать это более простым, чем это, и добавить событие click только с предупреждением, чтобы я мог видеть, что применяется событие live. Это не так. Таким образом, это как если бы событие live применялось при создании div или что-то в этомроде. Понятия не имею… Я ненавижу IE.

Ответ №3:

попробуйте

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

вместо

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

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

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

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

и затем

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

поскольку переключение не будет объявлено к моменту выполнения отвязки.