我尝试使用某些功能加载远程脚本并在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上尝试了这一点,它确实以预期的顺序执行警报。
我真的不知道这里发生了什么,有什么想法吗?
答案 0 :(得分:1)
从您对该问题的评论:
使用另一个脚本(通过广告服务器)将脚本注入我的页面,这可能是一个值得检查的问题。
这与您在问题中实际拥有的完全不同。您在问题中的内容显示标记中的脚本标记; 使用JavaScript注入脚本完全不同。
广告脚本可以通过两种方式将脚本添加到页面中:
在主页解析期间使用document.write
写出脚本标记。你说过你的页面是严格的XHTML。在主要解析期间使用document.write
向页面输出标记在XHTML中是无效的,完全停止。你做不了。如果它完全有效,则行为未指定,您不应该依赖它。
如果要在主页解析期间使用document.write
,则必须停止使用XHTML。此时,脚本将按解析器看到它们的顺序进行评估(无论它们如何放入解析器的输入流,来自标记或通过document.write
)。
创建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”属性的标准,它不是严格合法的。)