Javascript jQuery将元素上的所有事件侦听器持久化以备将来设置
使用jQuery,我需要:Javascript jQuery将元素上的所有事件侦听器持久化以备将来设置,javascript,jquery,jquery-events,Javascript,Jquery,Jquery Events,使用jQuery,我需要: 持久化添加到元素的所有事件处理程序的列表 将它们全部移除几秒钟,然后 将事物返回到初始状态(重新分配相同的事件处理程序) 我发现使用(一些jQuery内部机制)获取当前侦听器的列表: 然后,我可以使用删除所有事件侦听器 submitButton.off(); 但最后一个阀杆似乎不起作用 setTimeout(function () { $._data(submitButton[0], "events", eventsSubmitBtn); }
submitButton.off();
但最后一个阀杆似乎不起作用
setTimeout(function () {
$._data(submitButton[0], "events", eventsSubmitBtn);
}, 5000);
eventsSubmitBtn
是一个空数组
这是初始设置时应该采用的方式吗?我需要对这些对象进行深度克隆之类的操作,还是不能使用$。\u data
?
N.B.我可以在所有其他系统js代码之后添加我的cistom代码,因此我不能将分配给
$.fn.的代码放在任何代码之前。我编写的代码将在最后一次启动时运行,并在脚本运行之前附加其他事件侦听器。
当您获得对$返回的对象的引用时。\u data()
,对该对象的任何更改都不会不被注意,即在调用.off()
之后,该对象将发生更改,以反映不再附加任何处理程序
您可以通过获取对象的浅层副本来解决此问题(例如,使用object.assign
)
但这并不是一个真正值得推荐的方法。根据一份报告,“jQuery.\u数据(元素,“事件”)
…是一种内部数据结构,未记录,不应修改。”。当您在恢复处理程序时修改它时,这不能被视为最佳实践。但是,即使只读取它,也应该只用于调试,而不是用于生产代码
在事件处理代码中添加一个条件更为谨慎:
var ignoreEventsFor = $(); // empty list
$("#button").on('click', function () {
if (ignoreEventsFor.is(this)) return;
// ...
});
然后,在需要时,将的ignoreevents设置为要忽略事件的元素。当您想要恢复正常时,再次将其设置为$()
现在,将其添加到所有事件处理程序中可能会成为一个负担。如果您坚持使用on()
来附加事件处理程序,那么您可以改为扩展$.fn.on
以便它将此逻辑添加到您传递给它的处理程序中
下面的演示有一个按钮,可以通过更改背景颜色来响应单击。通过复选框,您可以禁用此操作:
/*在jQuery加载后立即放置此部件,但在任何
其他图书馆也包括在内
*/
var ignoreevents for=$(),//空列表
originalOn=$.fn.on;
$.fn.on=函数(…参数){
变量f=args[args.length-1];
如果(f的类型==‘函数’){
args[args.length-1]=函数(…args2){
如果(忽略事件)是(本))返回;
f、 调用(此,…args2);
};
}
调用(此,…args);
}
/*下一部分属于演示,可以放在任何地方*/
$(函数(){
$(“#colorButton”)。在('单击',函数(){
//只是一些改变背景的处理程序
var random=('00'+(Math.random()*16*16*16).toString(16)).substr(-3);
$('body').css({backgroundColor:#“+random});
});
$(“#切换器”).on('change',function(){
//切换颜色按钮事件的进一步处理:
ignoreEventsFor=$(this).is(':checked')?$(“#colorButton”):$();
});
});代码>
改变颜色
禁用事件
当您获得对由$.u data()
返回的对象的引用时,对该对象的任何更改都不会被忽略,即,在调用.off()
后,该对象将发生更改,以反映不再附加任何处理程序
您可以通过获取对象的浅层副本来解决此问题(例如,使用object.assign
)
但这并不是一个真正值得推荐的方法。根据一份报告,“jQuery.\u数据(元素,“事件”)
…是一种内部数据结构,未记录,不应修改。”。当您在恢复处理程序时修改它时,这不能被视为最佳实践。但是,即使只读取它,也应该只用于调试,而不是用于生产代码
在事件处理代码中添加一个条件更为谨慎:
var ignoreEventsFor = $(); // empty list
$("#button").on('click', function () {
if (ignoreEventsFor.is(this)) return;
// ...
});
然后,在需要时,将
的ignoreevents设置为要忽略事件的元素。当您想要恢复正常时,再次将其设置为$()
现在,将其添加到所有事件处理程序中可能会成为一个负担。如果您坚持使用on()
来附加事件处理程序,那么您可以改为扩展$.fn.on
以便它将此逻辑添加到您传递给它的处理程序中
下面的演示有一个按钮,可以通过更改背景颜色来响应单击。通过复选框,您可以禁用此操作:
/*在jQuery加载后立即放置此部件,但在任何
其他图书馆也包括在内
*/
var ignoreevents for=$(),//空列表
originalOn=$.fn.on;
$.fn.on=函数(…参数){
变量f=args[args.length-1];
如果(f的类型==‘函数’){
args[args.length-1]=函数(…args2){
如果(忽略事件)是(本))返回;
f、 调用(此,…args2);
};
}
调用(此,…args);
}
/*下一部分属于演示,可以放在任何地方*/
$(函数(){
$(“#colorButton”)。在('单击',函数(){
//只是一些改变背景的处理程序
var random=('00'+(Math.random()*16*16*16).toString(16)).substr(-3);
$('body').css({backgroundColor:#“+random});
});
$(“#切换器”).on('change',function(){
//切换颜色按钮事件的进一步处理:
ignoreEventsFor=$(this).is(':checked')?$(“#colorButton”):$();
});
});代码>
改变颜色
禁用电动汽车