Store and Restore event handler

events, handler, javascript, jquery

Solution

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.

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

Problem

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 } } ```

Original source