1

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

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

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

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

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

问题似乎是一致的。在 IE10 上也试过这个,它确实以预期的顺序执行警报。

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

4

2 回答 2

1

根据您对问题的评论:

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

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

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

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

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

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

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

于 2013-11-07T15:12:22.183 回答
-1

(我第一次在stackoverflow上发帖......)

很明显...第一个脚本标签需要浏览器加载一个单独的脚本文件,而第二个脚本标签有 javascript 内联(在 HTML 中)。

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

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

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

于 2013-11-07T11:50:33.193 回答