Safari 5.1和Javascript confirm()函数的错误

时间:2011-09-16 16:10:30

标签: javascript safari confirm

以下更新

我想我在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(),对于那些保持得分的人,虽然我认为这不重要),我能够确认请求执行直到确认对话框关闭 - 通过“确定”或“取消”。那将是一个错误。螺母。

提前致谢

1 个答案:

答案 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()”是在用户操作(按钮点击)上调用的函数。