好的,我已将提交事件处理程序绑定(bind)到表单。该处理程序设置为验证数据,然后在验证通过后禁用进一步的表单提交,并显示“请稍候...处理”消息。
基本结构如下:
function handler() {
// Validation stuff goes here.
...
// Validation passes, show message and return true.
$('#processing-msg').show(); // Show the 'processing' message.
$form.bind('submit', function() { return false }); // Disable further form submits.
return true; // Proceed with form submittal.
}
直到最后一个return
语句,如果我在return true
之前中断,则会显示处理消息。但是,如果我允许它返回 true
,则该消息根本不会显示。此外,提交按钮不会显示为禁用(该过程的另一部分)。这几乎适用于除 Safari 之外的所有浏览器。我尝试注释掉提交禁用逻辑,但没有成功。
更新
我无法在 jsfiddle 上完全重现该问题。但在这里您可以看到 Safari 中调用的函数顺序有何不同(alerts()
在显示消息之前发生):http://jsfiddle.net/skttw/3/
最佳答案
提出这个问题得到了答案:JavaScript commands not executed in order in Safari
显然 Safari 根据其内部控制来呈现对 HTML 的更改。因此,所有调用的函数都按顺序执行,但不一定已渲染。
此外,在执行某些函数期间,渲染会停止,alert()
就是其中之一,在我的例子中,是 onsubmit
事件!这就是为什么我看到看起来无序的结果。
所以我最终使用了一些肮脏的东西:
var show = function() { $('#processing_msg').show() };
setTimeout(show,0);
关于javascript - 如果提交处理程序返回 true,则 jQuery show() 函数不会在 Safari 中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149038/