2013-01-04 97 views
3

我在处理另一个问题时发现了这个错误。 JavaScript命令列出的顺序是比他们执行的Safari中的顺序不同:在Safari中没有执行JavaScript命令

例子:

alert('here'); 
document.write('This is the hidden message.'); 
alert('You should be seeing the hidden message by now.'); 

在我的浏览器alertsdocument.write()声明之前执行。我在两个不同的Mac OS X上使用Safari 5.17,6.0和6.0.2版本看过这个错误,但是我还没有证实其他人看过这个。

这里的小提琴:

http://jsfiddle.net/akJD7/

任何人都可以证实,他们看到这一点,如果是的话,告诉我为什么发生这种情况?

+1

我的猜测是在document.write返回之后但在文本呈现之前触发的第二个警报。第二次提醒会冻结浏览器执行,因此直到您解除第二次提醒后才会完成呈现。 – Madbreaks

+0

尝试用'console.log'替换'document.write',看看你是否看到相同的东西。呃,就是说如果Safari有一个可用的控制台。 – Madbreaks

+0

我实际上使用document.write来创建一个无jQuery的示例,但也许应用相同的原则。这里有一个jQuery的例子:http://jsfiddle.net/VqzzU/ –

回答

3

严格来说,我认为这不是一个错误。只是它全部是同步的,并且在第二次警报之前没有重新绘制。重新绘图通常不会发生在浏览器事件循环的同一个“勾号”内(尽管document.write似乎在其他浏览器中强制重绘,例如Chrome)。

这(丑陋的)解决方法应该修复它:

alert('here'); 
document.write('This is the hidden message.'); 
setTimeout(function() { 
    alert('You should be seeing the hidden message by now.'); 
}, 0); 

+0

他们都是很好的答案,我只是选择了这一个,因为这是我最终的结果。我的实际用例根本没有任何提醒......它只是一个表单提交处理程序中的$ .show()调用。像冠军一样工作。谢谢! –

2

试试这个,如果你有jQuery的:http://jsfiddle.net/2Kcuz/

每我的意见,我的猜测是你添加文本document.write根本还没有渲染(但它仍然在那里)。

+0

是的,这就是我想要回答的问题。它在那里,只是还没有呈现。 – bfavaretto

+0

@bfvaretto那么,我的评论击败了你的答案,而这又反过来打败了我的答案。 :)但我认为我发布的小提琴有点儿有趣。 – Madbreaks

+0

它是。不要误会我的意思,我不是在这里竞争。我其实提高了你的答案! :) – bfavaretto