奇怪的javascript执行顺序IE9

奇怪的javascript执行顺序IE9,javascript,internet-explorer-8,internet-explorer-9,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');</sc

我试图加载一个带有函数的远程脚本,并在IE9中内联执行它。 但是,我遇到一条错误消息,说明我的函数未定义

归根结底,IE9(以及更低版本)以与我预期相反的顺序执行脚本。我做了一个简化的例子,它仍然为我产生相同的错误

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

警报(“第2号”);
该脚本有一个较长的路径,我编辑了可读性,它只有一个警报,它没有其他

警报“nr.2”在IE9中multibanner_rev04_tmp.js中的警报之前执行 我在多台使用IE9的计算机上尝试过这一点,以确保问题与此不同:

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

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

(我第一次发到stackoverflow…)

第一个脚本标记要求浏览器加载一个单独的脚本文件 而第二个脚本标记具有javascript内联(在HTML中)

假设在multibanner_rev04_tmp.js的顶部有“alert('nr.1');”,那么就好像IE9首先执行内联代码一样,即使它 稍后出现在HTML中,根据以下内容,这是不正确的行为:

如果属性[async或defer]都不存在,则脚本将被删除 在用户代理继续之前立即获取并执行 解析页面


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

您对这个问题的评论:

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

这与你在问题中的实际情况完全不同。您的问题中显示了标记中的脚本标记;用JavaScript注入脚本是完全不同的

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

  • 在主页解析期间使用
    document.write
    ,写出脚本标记。您说过您的页面是严格的XHTML。在主解析期间使用
    document.write
    将标记输出到页面在XHTML中无效,请使用句号。你不能这样做。如果它真的有效,那么行为是未指定的,你不应该依赖它

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

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

    如果脚本就是这样添加的,那么就不能依赖顺序。如果以这种方式控制要添加的脚本,则可以让该脚本检查其他脚本提供的任何内容,并使用
    setTimeout
    延迟其执行,直到其他内容出现。如果不这样做,您将不得不延迟添加脚本元素,直到您准备就绪为止


  • multibanner\u rev04\u tmp.js
    的内容是什么?没有它,这个问题就没有什么意义。@t.J.Crowder它只是一个警报,就像这样:警报('nr.1');@杰斯珀:再次:显示脚本。如果我有一个脚本文件,它只包含
    警报(“文件”)并完全按照上面使用的方式使用它(后面是一个带有
    警报(“内联”);
    )的内联脚本),对于IE9,我不理解您描述的行为。我得到
    “file”
    警报,然后是
    “inline”
    警报。所以,如果你要说它确实如此,你必须展示一个完整的例子。这很可能与您没有展示的内容有关。@jesper:也无法使用IE8或IE6进行复制(我手头没有IE7)。(你确实说了“而且似乎更低”)。我的测试用例:(请注意,
    type
    属性在上面没有任何用途,可以删除,但我想尽可能复制您的测试用例。)@jesper:没有
    doctype
    也无法复制(以防这是关于
    alert
    的一些奇怪的事情):我确实有“alert”('nr.1');”在multibanner_revu tmp.js中(事实上,这就是它现在包含的全部内容)。尝试添加延迟,这导致IE9根本不运行内联脚本。与真实浏览器相比,文档模式似乎有所不同。有时,我在IE8中也遇到过这种情况。噢,欢迎来到stackoverflow!我想你可能在这里待了一段时间,但至少作为海报:)到目前为止只是一个冷漠的观察者。我注册只是能够+1有用的职位比任何东西,但甚至没有足够的声誉,到目前为止。感谢您的欢迎:-)@Lqueryvg:“很明显……第一个脚本标记要求浏览器加载一个单独的脚本文件,而第二个脚本标记具有javascript内联(在HTML中)。”是的,但是规范(和长期实践)非常清楚,除非您使用
    async
    defer
    属性,必须按顺序计算HTML中的脚本元素。@Lqueryvg:看来您的答案被否决了。别误会。这个特别的答案是不正确的,但你显然是一个聪明的情报员