奇怪的javascript执行命令IE9

时间:2013-11-07 10:49:37

标签: javascript internet-explorer-8 internet-explorer-9

我尝试使用某些功能加载远程脚本并在IE9中执行它内联。 但是我遇到了一条错误消息,表明我的函数未定义。

它归结为IE9(并且看起来更低)以我期望的顺序执行脚本。我做了一个简化的例子,它仍然会给我带来同样的错误。

<script type="text/javascript" src="multibanner_rev04_tmp.js"></script>
<script type="text/javascript">alert('nr.2');</script>

脚本有一个较长的路径,我为了便于阅读而编辑了它,它只有一个警报而没有别的。

警告&#39; nr.2&#39;在IE9中的multibanner_rev04_tmp.js中执行之前执行 我已经在使用IE9的多台计算机上尝试过此操作,以确保它与此问题不同:IE9 js load order and JQuery

问题似乎是一致的。还在IE10上尝试了这一点,它确实以预期的顺序执行警报。

我真的不知道这里发生了什么,有什么想法吗?

2 个答案:

答案 0 :(得分:1)

从您对该问题的评论:

  

使用另一个脚本(通过广告服务器)将脚本注入我的页面,这可能是一个值得检查的问题。

这与您在问题中实际拥有的完全不同。您在问题中的内容显示标记中的脚本标记; 使用JavaScript注入脚本完全不同。

广告脚本可以通过两种方式将脚本添加到页面中:

  1. 在主页解析期间使用document.write写出脚本标记。你说过你的页面是严格的XHTML。在主要解析期间使用document.write向页面输出标记在XHTML中是无效的,完全停止。你做不了。如果它完全有效,则行为未指定,您不应该依赖它。

    如果要在主页解析期间使用document.write,则必须停止使用XHTML。此时,脚本将按解析器看到它们的顺序进行评估(无论它们如何放入解析器的输入流,来自标记或通过document.write)。

  2. 创建script元素(document.createElement('script')),然后将其附加到DOM。执行此操作时,脚本会在可用时立即进行评估。没有订单。这就像在标记中使用async attribute一样(除了它更加跨浏览器可靠)。

    如果这是脚本的添加方式,则不能依赖订单。如果您控制以这种方式添加的脚本,您可以让该脚本检查其他脚本提供的内容,并使用setTimeout推迟执行,直到出现其他内容为止。如果不这样做,则必须延迟添加脚本元素,直到您准备好它为止。

答案 1 :(得分:-1)

(我的第一篇关于stackoverflow的帖子......)

陈述明显的......第一个脚本标记要求浏览器加载单独的脚本文件 而第二个脚本标签有内嵌的javascript(在HTML中)。

假设你有“警告('nr.1');”在multibanner_rev04_tmp.js的顶部,然后看起来好像IE9首先执行内联代码,即使它 出现在HTML的后面,根据这个不正确的行为: http://www.w3.org/TR/html5/scripting-1.html#script

  

如果两个属性[async或defer]都不存在,那么脚本就是   在用户代理继续之前立即获取并执行   解析页面。

然而,使用IE10和“IE9标准”文档模式设置(我没有IE9),我无法重现您所看到的行为,这有点指向IE9本身或特定版本中的错误IE9?我想知道如果你在你的第二个脚本标签中添加defer =“defer”属性会发生什么? (仅用于诊断,因为根据没有“src”属性的标准,它不是严格合法的。)