#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');
поскольку переключение не будет объявлено к моменту выполнения отвязки.