Reputation: 4560
Please help to fix my function, store event of one element and delete them, then re-install;
I don't know where is the problem, the function will only delete the event of element and will not restore.
Please help to fix.
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
}
}
Upvotes: 4
Views: 4437
Reputation: 13071
You almost got it, when you iterate through the events event_handler
is actually an array of the handlers of that event (an event can have many handlers attached). So you need to save those handlers in one array for each of the events, so you can re-attach them later.
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');
});
Upvotes: 3