Safari 5.1和Javascript confirm()函数存在Bug问题

3

以下是更新内容

我认为我在Safari 5.1(Mac OS X Lion系统下)中发现了一个非常奇怪的bug。我无法确定这个bug是否存在于早期版本的Safari中,但我有点怀疑不会(因为我的网站与此问题相关的部分在Lion之前的Safari中仍能正常工作)。在Chrome、Firefox 6、IE7和IE9中,我没有看到这个bug。我还确认了在Windows 7上的Safari 5.0.2中没有出现这个bug,这可能意味着这是Safari 5.1的新bug。

所以,这就是这个bug:如果javascript confirm()函数位于另一个函数内部,则在单击“OK”或“Cancel”按钮之前调用confirm()函数之前的所有内容都不会被执行。这对我来说似乎是一个巨大而又非常奇怪的bug。以下是我的示例代码:

<!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()),并且我能够确认请求直到确认对话框关闭(无论是“确定”还是“取消”)之前被执行。这肯定是一个bug。

提前感谢你的帮助。


如果运行非控制台语句,是否也是如此?(例如,可能是线程问题,其中写入控制台,但UI没有机会更新?为了测试,请将您的代码更改为类似“var x = 0; if(confirm((x+2)+' Are you sure?")) { window.close(); }"的内容--“x+2”是否被评估? - groundh0g
嗯...这很有趣。我尝试了你的测试,Safari 5.1正确地评估了x+2。这很困惑,因为在确认语句之前放置的“真实”代码明显没有被评估,这就是我首次发现错误的原因。我会再做些调整。 - hairbo
为了确保,将“x+2”设置在确认框之外。(因此,它应该是“var x=0; x += 2; if(confirm(x+' Are you sure?')) { ... }”。应该是一样的,但是... :) - groundh0g
我听到了。它似乎正确执行了"x+2",并立即在确认框中显示结果。另外,在确认行之前,我添加了以下内容:var res = document.getElementById('result'); res.innerHTML = 'hello there!';... 然后Safari 5.1在确认框消失后才显示结果。现在我需要尝试一个AJAX测试,因为这是整个问题的起因。烦人...也许我应该看看能否插入一个基于Mootools的对话框。 - hairbo
我刚刚在帖子正文中添加了有关AJAX测试的更新。 - hairbo
1个回答

2

我现在有一个“解决方案”(当我说“解决方案”时,实际上是指“看起来可行的黑科技”),因为我不能使用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()” 是在用户操作(按钮点击)时被调用的函数。

没有什么是绝对的,只有解决方案。 - bobsoap
只有权宜之计,没有完美的解决方案。 - bobsoap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接