В jQuery 1.8.3 я могу связать события с элементом с помощью var events = $._data($('#button')[0], 'events');
Если я отменю привязку этих событий, как я могу добавить их обратно к элементу позже?
$('#button').click(function () {
console.log('click triggered');
});
var events = $._data($('#button')[0], 'events'); // gets current events
$('#button').unbind();
$._data($('#button')[0], 'events', events); // doesnt work
$('#button').data('events', events); // doesnt work
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<button type="button" id="button">Change condition</button>
1
Wesley Smith
13 Май 2015 в 13:52
Почему вы хотите это сделать ....
– Arun P Johny
13 Май 2015 в 13:57
Представьте, что я добавляю некоторые функции к существующей странице. Я могу Добавить код, но мне не разрешено редактировать уже существующий код. Существующий код добавляет обработчики событий ко всем переключателям на странице (включая те, которые я буду добавлять). Я хотел бы отвязать эти обработчики от добавляемого мной элемента, однако мне может потребоваться отменить изменения позже.
– Wesley Smith
13 Май 2015 в 14:05
1 ответ
Лучший ответ
Я бы нигде не рекомендовал его, но все же, если вы хотите (или просто знать, почему он не работает)
$('#button').click(function() {
console.log('click triggered');
});
//this returns the events object, but the problem is when an handler is removed it is removed from this object so just keeping this reference is useless
var events = $._data($('#button')[0], 'events');
//here we create a deep copy of the events, so _e will be freezed even though events is modifed
var _e = $.extend(true, {}, events);
$('#button').unbind();
//the events object is empty here but _e is not
console.log('events', events);
console.log('_e', _e);
//now just adding the _e data won't be enough as it requires some native handlers to be added.
$.each(_e, function(key) {
//so we iterate over each available event type and add a noop function as the handler
$('#button').on(key, $.noop);
//calling the previous line will create a new events.<event-name> object
var events = $._data($('#button')[0], 'events');
//now override the events definition with the copy we have
events[key] = _e[key];
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<button type="button" id="button">Change condition</button>
2
Arun P Johny
13 Май 2015 в 14:10
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.