2012-12-31 39 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