Как я могу захватить, какие события были удалены с отменой привязки и повторно применить их позже? - PullRequest
4 голосов
/ 22 июля 2011

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

Предположим, у меня есть этот элемент:

<div id="thediv">The Div</div>

К какому событию onclick прикреплено различное количество функций. Я знаю, что могу использовать unbind для удаления всех функций onclick:

$("#thediv").unbind("click");  

Как я могу сохранить несвязанные функции, чтобы позже связать их?

Обратите внимание, что это должно работать с jQuery 1.5.


Я видел этот предыдущий ответ , но я кое-что не понял в этом:

  • Почему это сначала связывает, а потом связывает?
  • Что делает ary_handlers[idx]?

(Я на самом деле не ищу ответы на эти вопросы, если они не нужны, чтобы объяснить решение моего вопроса о захвате несвязанных функций.)

1 Ответ

3 голосов
/ 22 июля 2011

Я думаю, вы могли бы сделать что-то вроде этого: вы сохраняете события div, клонируя div и сохраняя данные ('events') в объекте.После слов вы перебираете объект и привязываете события назад.Вы должны клонировать, потому что при откреплении событий исходные данные («события») удаляются. (Надеюсь, я понял, что вы ищете)

<div id='my'>my</div>

var my = $('#my');
my.click(function(){
   alert('my');
});

my.hover(function(){
$(this).css('color', 'red');
    });

my.click(function(){
   alert('you');
});

var ev =my.clone(true).data('events');

my.unbind();

for (var e in ev){
    //you have to iterate on the property since is an array with all the handlers for the same event)
    for (i= 0; i < ev[e].length; i++){
       my.bind(e, ev[e][i]);   
    }
}

fidlle http://jsfiddle.net/pXAXW/

РЕДАКТИРОВАТЬ - Чтобы сделать это в 1.5.2, вам просто нужно изменить способ, которым вы прикрепляете события назад, потому что они сохраняются по-другому:

  $(document).ready(function(){

   var theDiv = $("#thediv");

   theDiv.click(function(){
     $(this).css("border-color", "blue");
     alert("Click!");
   });
       theDiv.click(function(){
     $(this).css("border-color", "blue");
     alert("clack!");
   });

   var theEvents = theDiv.clone(true).data("events");

   //  Unbind events from the target div
   theDiv.unbind("click");

   //  Put the saved events back on the target div
   for (var e in theEvents){
     //  must iterate through since it's an array full of event handlers
     for ( i=0; i<theEvents[e].length; i++ ){
       theDiv.bind(e, theEvents[e][i].handler);
     }
   }

 });

здесь: (так же, как Katiek) http://jsfiddle.net/nicolapeluchetti/CruMx/2/ (событие запускается дважды, если вы не нажмете точно на div!) Я также обновил свою скрипку, чтобы использовать jquery 1.5.2 http://jsfiddle.net/pXAXW/1/)

...