以下更新
我想我在OS X Lion上的Safari 5.1中发现了一个非常奇怪的错误。我无法确定这个错误是否存在于早期版本的Safari中,但我怀疑不是(考虑到我的网站中引用此问题的部分曾经在前Lion Safari中工作)。我没有看到Chrome,Firefox 6,IE7或IE9中的错误。我还能够确认在Windows 7上的Safari 5.0.2中没有发生该错误,这可能意味着这是Safari 5.1的新功能。
所以这就是错误:如果javascript confirm()函数在另一个函数内部,那么在 confirm()之前调用之前的任何内容都不会执行,直到“OK”单击“或”取消“按钮。对我来说,这肯定是一个巨大而且非常奇怪的错误。这是我的示例代码:
<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
function myexit () {
console.log(0);
if ( confirm('Are you sure?') ) {
window.close();
}
}
</script>
</head>
<body>
<a href="#" onclick="myexit();">close window</a>
</body>
</html>
在我提到的所有其他浏览器中,0出现在控制台中,同时出现模态确认框。在Safari中,在单击“确定”或“取消”后,0仅显示。
另外,如果我将confirm()函数放在子函数中,如下所示:
function confirmwrapper() {
if ( confirm('Are you sure?') ) {
console.log(1);
}
}
function myexit () {
console.log(0);
confirmwrapper();
}
......它仍然破裂。
我错过了一些基本的东西吗?恭敬地,像“只使用JQuery / Mootools /其他一些很酷的JS库”这样的答案可能并没有帮助我这么多,因为这段代码是遗留系统的一部分,我现在不能完全撕裂,就像我想要。
更新:我刚测试了一个简单的AJAX请求(Mootools Request(),对于那些保持得分的人,虽然我认为这不重要),我能够确认请求不执行直到确认对话框关闭 - 通过“确定”或“取消”。那将是一个错误。螺母。
提前致谢
答案 0 :(得分:1)
此时我正在和自己说话,但我有“解决方案”(当我说“解决方案”时,我的意思是“看似工作的黑客”),因为我无法使用来自JS库的模态对话。如果我将confirm()调用放在另一个函数中,并使用setTimeout调用调用它,这似乎给Safari足够的喘息空间,允许在confirm()执行之前执行代码。这是一个例子:
function doconfirm() {
if ( confirm('Are you sure you want to logout?') ) {
window.top.close();
}
}
function logout () {
doCourseSave();
window.setTimeout('doconfirm();', 500);
}
要清楚,“logout()”是在用户操作(按钮点击)上调用的函数。