sti*_*ang 11 javascript jquery internet-explorer
我在misc中包含了一些相关的内容.通过在<script>标记末尾添加标记<body>然后加载其他javascript文件来添加网页.这个流程有点复杂,所以在问我的问题之前我会尝试解释它:
<script>接近结束元素<body>元素<script>元素<script>元素的src属性指向另一个javascript文件,最终在页面的相应部分注入一些内容.我们使用这种两阶段方法在决定是否包含最终内容之前能够进行一些基本处理,这可能需要一些时间来加载.
问题是IE8(可能是旧版本)加载最后一次javascript两次.似乎设置src属性的行为将触发加载,但是将脚本标记附加到DOM.有什么方法可以避免这种情况吗?
我已经创建了一个问题的简单演示.如果您有某种方式来跟踪HTTP请求,您将看到IE8加载js_test2.js两次.
bob*_*nce 15
根本区别在于,IE首次将其添加到父元素的childNodes时执行脚本元素,无论父元素是否实际位于文档中.其他浏览器仅在将脚本添加到文档的childNodes树中的节点时才执行脚本.
jQuery的domManip函数(jQuery 1.3.2的第524行),由append其他类似的jQuery方法调用,试图巧妙地调用它在最终解析的HTML中找到的evalScript任何<script>元素来执行脚本(如果需要,通过执行AJAX请求)对于外部脚本).(实际的脚本元素已从已解析的childNodes中删除,以阻止它们在插入文档时执行,大概是这样只有当包含它们的内容一次附加到多个元素中时脚本才会执行一次.)
但是,因为前一个clean函数在解析HTML时将脚本元素附加到包装器div,所以IE已经执行了该脚本.所以你得到两次执行.
最好的办法是避免在使用脚本执行任何操作时使用HTML字符串domManip等函数append.
实际上,忘记将您的内容放在序列化的HTML字符串中并让jQuery解析它; 只需要更可靠的纯DOM方式:
var s= document.createElement('script');
s.type= 'text/javascript';
s.charset= 'UTF-8';
s.src= 'js_test2.js';
document.getElementById('some_container').appendChild(s);
Run Code Online (Sandbox Code Playgroud)
(老实说,在查看了该clean函数的胃部流失代码之后,我对使用jQuery的基于HTML字符串的DOM操作完全有疑问.它应该修复浏览器错误,但是愚蠢的 -在我看来,正则表达式处理可能会导致尽可能多的问题.)
顺便提一下这个初始电话:
document.write(unescape("%3Cscript src='js_test1.js' type='text/javascript'%3E%3C/script%3E"));
Run Code Online (Sandbox Code Playgroud)
你不需要在这里取景; 我不知道为什么这么多人这么做.</在内联脚本中需要避免序列,因为它会结束<script>标记,如果你正在做XHTML <并且也&应该避免(或者]]>你正在使用CDATA包装器),但是有一种更简单的方法来完成所有这些只使用JavaScript字符串文字:
document.write('\x3Cscript src="js_test1.js" type="text/javascript">\x3C/script>"));
Run Code Online (Sandbox Code Playgroud)