当调用.of()然后调用.on()时,Jquery是否可能将事件推迟
Is it possible from an event to be postponed by Jquery when .off() then .on() are called?
如果这个问题已经得到回答,我很抱歉,但尽管我已经积极搜索,但在Stackoverflow上没有找到任何相关内容。
我目前在我的一个剧本中遇到了一种非常奇怪的行为,这种行为在我看来并不自然,但可能有其原因(但我没有找到):
事实上,我的作品是这样的:通过更改表单输入(select和radio),然后调用一个程序来计算特定的数据(重量、价格等)。在这段时间里,最终产品不应该添加到购物车中,这就是为什么当我们更改表单输入时,这个提交按钮是"disabled"
(由于回调,他需要一些额外的处理),并且它的on('click')
监听器被off()
禁用。
计算完成后,程序通过添加回调函数,告诉按钮现在可以再次点击。
实际行为是,当按钮被禁用时(在off()
之后),点击按钮不会触发任何事情,但当计算结束,on()
侦听器被添加回该按钮时,链接到该按钮的回调将被调用,而不需要任何操作。这对我来说非常奇怪,因为在on()
侦听器返回后,它应该需要再次点击才能触发回调,但这可能是我不知道的内部复活节彩蛋或功能。
function callback () {
// >>
// ...
// <<
}
function start() {
$(".button").off("click");
}
function finish() {
$(".button").on("click", callback);
}
function process() {
start();
// >>
// some inner ajax calls
// <<
finish();
}
$(".button").on("click", callback);
你知道发生了什么事吗?
非常感谢您的关注,如果您需要更多信息,请随时询问。
编辑:正如所问,这是我为介绍我的案例而设置的一个Fiddle,但不幸的是,即使上下文几乎相同,我还是设法复制了上面的案例:https://jsfiddle.net/Cr3aHal0/nfon051x/21/
请参阅http://javascript.info/tutorial/events-and-timing-depth
总结:
大多数浏览器对UI和JavaScript使用单线程,这会被同步调用阻止。(您在off
和on
之间的代码是同步呼叫)
因此,JavaScript执行会阻止渲染。事件是异步处理的,DOM事件除外。
当异步事件发生时,它会进入事件队列。
浏览器有一个内部循环,称为事件循环,用于检查队列、处理事件、执行功能等。
例如,如果浏览器正忙于处理您的onclick,而后台发生了另一个事件(如另一次单击),则它会附加到队列中。onclick处理程序完成后,将检查队列并执行脚本。(在您的情况下,在您重新打开事件处理程序之后)
你如何在你的场景中解决这个问题?
不要关闭/打开事件处理程序,而是尝试禁用该按钮。禁用的按钮将不会获得点击事件。
或者,使用setTimeout来启用处理程序,这将在清除点击队列后发生,例如:
setTimeout(function() { $(".button").on("click", callback); }, 10);
- angularjs调用事件中控制器的一个函数
- CSS + jQ插件阻止AJAX调用/事件侦听器工作
- 如何使用webbrower对象中的脚本调用C#事件
- API Google Maps Javascript在上下文菜单中调用事件侦听器
- 调用事件处理程序oop内部的函数
- 砖石事件:在图像加载和布局完成后调用事件
- jwplayer在80%的视频上调用事件
- 显示和隐藏上下文菜单时的 Jstree 调用事件
- 如何只调用一次事件处理程序,而不是每次单击项目时调用事件处理程序
- 调用事件侦听器 - 两种方式之一起作用,有什么区别
- 在页面加载时调用函数,而不是在单击时调用事件
- jQuery 动态调用事件侦听器
- 在模块化 JavaScript 中调用事件
- 在Bootstrap面板展开中调用事件
- 如何根据变量指定是否可以调用事件侦听器
- 调用事件中带有参数的函数
- SelectAll不调用事件处理程序
- 可以以编程方式调用事件处理程序吗?
- JS中的函数调用事件
- Ionic 2:调用事件同时订阅和取消订阅