2012-12-31 1 views
4

Veuillez aider à réparer ma fonction, stocker l'événement d'un élément et les supprimer, puis réinstaller;Gestionnaire d'événements Store and Restore

Je ne sais pas où est le problème, la fonction va seulement supprimer l'événement de l'élément et ne restaurera pas.

S'il vous plaît aidez à résoudre.

HTML

<a href="#" id="a">a</a> 
<a href="#" id="b">b</a>​ 

JS

$("#a").hover(function(){alert("test")}); 

$("#b").click(function(){ 
    Test_Handle('#a'); 
} 

function Test_Handle(id) { 
     target = $(id); 
     if($.hasData(target.get(0))){ // if the elment has event || target = element 
      target[0].event_name = []; 
      target[0].event_handler = []; 

      events = $._data(target.get(0), 'events'); // take all events of the element 

      $.each(events, function(event_name, event_handler){ 
       target[0].event_name.push(event_name); 
       target[0].event_handler.push(event_handler); 
      }); //store the events 

      target.off(); // delete the events 
     }else{ // has the elment no event 
      for(var i=0; i < target[0].event_handler.length; i++){ 
       target.on(target[0].event_name[i], target[0].event_handler[i]); 
      } // re-store the events 

      target[0].event_name = []; 
      target[0].event_handler = []; //reset 
     } 
    } 
+0

ce qui est 'option'? –

+0

Je suis désolé, corrigé. – Till

Répondre

3

Vous presque avez, quand vous itérer à travers les événements event_handler est en fait un tableau des gestionnaires de cet événement (un événement peut avoir plusieurs gestionnaires attachés). Vous devez donc enregistrer ces gestionnaires dans un tableau pour chacun des événements, afin de pouvoir les rattacher ultérieurement.

Try this:

function Test_Handle(id) { 
    target = $(id); 
    events = $._data(target[0], 'events'); 
    if(events!=undefined){ 
     target[0].event_name = []; 
     target[0].event_handler = [];   
     $.each(events, function(event_name, event_handler){ 
      target[0].event_name.push(event_name); 
      var _handlers=[]; 
      for(var i=0;i<event_handler.length;i++){ 
       _handlers.push(event_handler[i].handler); 
      } 
      target[0].event_handler.push(_handlers);   
     }); //store the events 
     target.off(); // delete the events 
    }else{ // has the elment no event 
     for(var i=0; i < target[0].event_handler.length; i++){ 
      for(var ii=0;ii<target[0].event_handler[i].length;ii++){ 
       target.on(target[0].event_name[i], target[0].event_handler[i][ii]); 
      }   
     } // re-store the events 
     target[0].event_name = []; 
     target[0].event_handler = []; //reset 
    } 
} 

$("#a").hover(function(){alert("test")}); 

$("#b").click(function(){ 
    Test_Handle('#a'); 
}); 

JSFiddle example

+0

Merci beaucoup !! c'est cool !!! merci pour toute votre aide! – Till

+0

J'ai une question supplémentaire, pensez-vous que cette fonction prendra beaucoup de performance et va évidemment ralentir le temps de traitement de chargement? J'ai trouvé une autre façon de faire avec. Like, if ($ this.data ('exécutant')) retourne; then $ this.data ('executing', true). Dans quel sens pensez-vous que c'est mieux? – Till

+0

Je ne pense pas que cette fonction puisse avoir un impact sur les performances de votre application, mais il serait peut-être préférable de remplacer le premier "if" (if ($. HasData (target.get (0))) {) pour ceci: "if ($ ._ data (target [0], 'events')! = non défini) {". Jetez un oeil à cet exemple: http://jsfiddle.net/JELsT/4/ – Josep