如果这个问题已经得到答复,我很抱歉,但尽管我积极搜索,但在 Stackoverflow 上没有找到任何相关内容。
我目前在我的一个脚本中遇到了一种非常奇怪的行为,这种行为对我来说似乎不自然,但可能有其原因(但我没有找到):
实际上,我的作品是这样的:通过改变表单输入(选择和单选),然后调用一个程序来计算具体数据(重量、价格等)。在此期间,最终产品不应添加到购物车,这就是为什么当我们更改表单输入时,此提交按钮为“禁用”(由于回调,他进行了一些额外的处理)及其 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 处理程序完成时,将检查队列并执行脚本。 (在您的情况下,在您重新打开事件处理程序之后)
<小时/>How do you fix this in your scenario?
不要关闭/打开事件处理程序,而是尝试禁用该按钮。禁用的按钮不会获得点击事件。
或者,使用 setTimeout 来启用处理程序,这将在清除点击队列后发生,例如:
setTimeout(function() { $(".button").on("click", callback); }, 10);
关于javascript - 当调用 .off() 然后调用 .on() 时,Jquery 是否可以推迟事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36912199/