存储和恢复事件处理程序

Store and Restore event handler

本文关键字:程序 事件处理 恢复 存储      更新时间:2023-09-26

请帮忙修复我的功能,存储一个元素的事件并删除它们,然后重新安装;

我不知道哪里出了问题,函数只会删除元素的事件,不会恢复。

请帮忙修复

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

您几乎得到了它,当您遍历事件时,event_handler实际上是该事件的处理程序的数组(一个事件可以附加许多处理程序)。因此,您需要为每个事件将这些处理程序保存在一个数组中,以便以后可以重新附加它们。

试试这个:

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示例