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

1 回答 1

3

您几乎明白了,当您遍历事件时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');
});

​</p>

JSFiddle 示例

于 2012-12-31T10:54:40.617 回答