【问题标题】:JavaScript commands not executed in order in SafariJavaScript 命令未在 Safari 中按顺序执行
【发布时间】:2012-12-19 10:35:49
【问题描述】:

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

例子:

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

在我的浏览器中,alertsdocument.write() 语句之前执行。我在使用 Safari 版本 5.17、6.0 和 6.0.2 的两个不同的 Mac OS X 上看到了这个错误,但我还没有确认其他人看到过这个错误。

这是小提琴:

http://jsfiddle.net/akJD7/

谁能确认他们看到了这一点,如果看到了,请告诉我为什么会这样?

【问题讨论】:

  • 我的猜测是在 document.write 返回之后但在文本呈现之前触发第二个警报。第二个警报会冻结浏览器执行,因此在您关闭第二个警报之前渲染不会完成。
  • 尝试用console.log 替换document.write,看看你是否看到同样的东西。呃..如果 Safari 有一个可用的控制台。
  • 我实际上使用 document.write 来创建一个没有 jQuery 的示例,但也许同样的原则也适用。这是一个使用 jQuery 的示例:jsfiddle.net/VqzzU

标签: javascript macos safari


【解决方案1】:

严格来说,我不认为这是一个错误。只是都是同步的,第二次alert之前没有repaint。重绘通常不会在浏览器事件循环的同一“滴答”内发生(尽管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);

【讨论】:

  • 他们都是很好的答案,我只选择了这个,因为这就是我最终选择的。我的实际用例根本没有任何警报……它只是表单提交处理程序内部的 $.show() 调用。像冠军一样工作。谢谢!
【解决方案2】:

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

根据我的评论,我的猜测是您使用 document.write 添加的文本还没有呈现(但它仍然存在)。

【讨论】:

  • 是的,这就是我试图在回答中说的。它在那里,只是还没有渲染。
  • @bfvaretto 好吧,我的评论击败了您的回答,而您的回答又击败了我的回答。 :) 但我认为我发布的小提琴有点有趣。
  • 是的。不要误会我的意思,我不是在这里比赛。我实际上赞成你的回答! :)
猜你喜欢
  • 2010-09-26
  • 2023-01-17
  • 2013-07-11
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多