有Chrome浏览器破碎的动态脚本加载

Has Chrome browser broken dynamic script loading?

本文关键字:动态 脚本 加载 破碎 Chrome 浏览器      更新时间:2023-09-26

这不是我的代码,我只是在排除故障。一些已经工作了一年多的代码现在已经停止在Chrome(12.0.742.122)中工作,但可以在其他"大型"浏览器(包括WebKit的伙伴Safari(5.0.5))中工作。通过"不再工作",我的意思是尽管脚本文件确实加载,但它不会执行。如果将脚本加载到innerHTML或将其写入div中,但这两件事都没有完成。下面被注释掉的行都是失败的尝试,其中第一行是直到最近才正常工作的原始代码。

<div id="abc"></div>
<script type="text/javascript">
var d=document.getElementById("abc");
var s=document.createElement('SCRIPT');
if(s){s.src=script_path;}
//if(d)d.appendChild(s);        //original line that still works in all other browsers
//if(d)d.parentNode.appendChild(s);
//if(d)d.parentNode.insertBefore(s,d);
//if(d)d.parentNode.insertBefore(s,d.nextSibling);
document.body.appendChild(s);   //this works, script executes
</script>

从上面的代码中想要的是,脚本是div的子元素。大概他们想要能够删除该子元素并同时删除所有脚本(我不确定他们的动机)。

我已经发现了问题所在,这在很大程度上要归功于Martin Bieder的来回交流,并通过他的工作示例向我介绍了jsfiddle.net。

问题实际上是测试页面,你会认为他们在创建它时犯了一个相当无害的错误。div和所有代码将在下面简单地表示为######,因为它甚至与问题无关。这实际上是一个HTML问题。如果你没有正确匹配结束标签,Chrome 12就会不高兴。我真的不敢相信它会对脚本文件的执行产生影响,但它确实有影响。在过去的10分钟里,我尝试了很多次,对和错的HTML标签,令人难以置信的是,这真的是问题。

<font><center><b>
##########
</b></font></center>

你看到字体和中心关闭标签是如何错误的方式,这足以混淆Chrome,它不会执行任何动态脚本被添加到这些标签。怪异。我不能在jsfiddle上重新创建这个,可能是由于网站运行html/js的性质,你把它(例如使用onload)。

不,它可以工作。Google Analytics也使用is。

var ga=document.createElement('script');
ga.type='text/javascript';
ga.async=true;
ga.src='http://www.google-analytics.com/ga.js';
var s=document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(ga,s);

您是否尝试将脚本元素设置为async ?

var script = document.createElement('script');
script.async = 'async';

这都是关于三件事。组织、优化和调试。

1)适当地限定标签的作用域可以使内容更容易阅读。2)正确组织代码使其更容易解析,这意味着解析器可以更快,更有效。3)我们使用的许多调试工具都依赖于这种组织来显示诸如可折叠标签之类的内容,并呈现更可视化的范围