В 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