javascript - 存储和恢复事件处理程序

标签 javascript jquery events handler

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

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

请帮助修复。

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 实际上是该事件的处理程序数组(一个事件可以附加许多处理程序)。因此,您需要为每个事件将这些处理程序保存在一个数组中,以便稍后重新附加它们。

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

关于javascript - 存储和恢复事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14098673/

相关文章:

c# - 在 C# 中实现生产者/消费者模式

javascript - 事件触发的数量是否与 Jquery 中事件绑定(bind)的数量相关?

javascript - 如何使用javascript获取时间差?

javascript - 谷歌应用脚​​本: Cannot find function insertText in object Document

jquery - 是否有可能在 <option> 标签内使用 <span> 标签

javascript - 为什么我的过渡动画在关闭 div 时出现故障?

javascript - 在 php 中从 Ajax/Jquery 获取表单 $_POST 数据

c# - 一个事件是否需要至少有一个处理程序?

javascript - 开始输入内容时更改文本框的颜色而不是单击

javascript - array.slice(-1)[0] -- 有人可以解释一下吗?