繁体   English   中英

奇怪的javascript执行顺序IE9

[英]Strange javascript execution order IE9

我正在尝试加载具有某些功能的远程脚本,并在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加载顺序和JQuery

问题似乎是一致的。 在IE10上也尝试过此方法,它确实按预期顺序执行警报。

我真的不知道这是怎么回事,有什么想法吗?

根据您对问题的评论:

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

这与您所提出的问题完全不同 问题中的内容将在标记中显示脚本标签; 使用JavaScript 注入脚本是完全不同的。

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

  1. 在主页解析期间使用document.write编写脚本标签。 您已经说过您的页面是XHTML严格的。 在主解析期间,使用document.write将标记输出到页面是无效的,在XHTML中是句号。 你做不到。 如果它完全起作用,则行为是不确定的,您不应依赖它。

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

  2. 通过创建script元素( document.createElement('script') ),然后将其附加到DOM。 执行此操作后,将在脚本可用后立即对其进行评估。 没有命令。 就像在标记中使用async属性一样(不同之处在于跨浏览器更可靠)。

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

(我的第一个帖子发布到stackoverflow ...)

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

假设您具有“ alert('nr.1');” 在multibanner_rev04_tmp.js的顶部,即使IE9稍后出现在HTML中,它似乎也像IE9首先执行内联代码一样,这是不正确的行为: http : //www.w3.org/TR/html5 /scripting-1.html#script

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM