Micah
Micah

Reputation: 4560

Store and Restore event handler

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

Answers (1)

Josep
Josep

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.

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

Upvotes: 3

Related Questions