2012-12-31 37 views
4

請幫助修復我的功能,存儲一個元素的事件並刪除它們,然後重新安裝;存儲和恢復事件處理程序

我不知道問題出在哪裏,函數只會刪除元素的事件而不會恢復。

請幫助解決。

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

是什麼'option'? –

+0

我很抱歉,修正。 – Till

回答

3

你幾乎得到了它,當你通過事件event_handler迭代實際上是該事件的處理程序數組(一個事件可以附加很多處理)。因此,您需要將這些處理程序保存在每個事件的一個數組中,以便稍後重新添加它們。

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

非常感謝你!這很酷!!!謝謝你的幫助! – Till

+0

我還有一個問題,你認爲這個函數會佔用很多性能,並且會明顯減慢加載處理時間嗎?我找到了另一種方式來處理它。就像($ this.data('execution'))return);然後$ this.data('執行',true)。你認爲哪種方式更好? – Till

+0

我不認爲這個函數會影響應用程序的性能,但是也許最好替換第一個「if」(if($。hasData(target.get(0))){)爲: 「if($ ._ data(target [0],'events')!=未定義){」。看看這個例子:http://jsfiddle.net/JELsT/4/ – Josep