有Chrome浏览器破碎的动态脚本加载
Has Chrome browser broken dynamic script loading?
这不是我的代码,我只是在排除故障。一些已经工作了一年多的代码现在已经停止在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)我们使用的许多调试工具都依赖于这种组织来显示诸如可折叠标签之类的内容,并呈现更可视化的范围
- 性能:动态脚本注入与服务器渲染脚本
- 从Javascript动态脚本获取参数值
- 如何获取动态脚本 ID
- JQuery 动态脚本标记和执行
- 如何从javascript中检索动态脚本
- Phonegap和requirejs动态脚本加载失败
- JavaScript:不操作DOM的动态脚本加载
- 是否可以插入并运行动态脚本标记
- Firefox中的动态脚本加载和错误
- 使用动态脚本加载JSON数据-跨域-CORS不可用
- 删除src匹配上的动态脚本标记
- ASP.. NET动态脚本文件
- CasperJS不能正确触发动态脚本/链接调用的回调
- 如何设计动态脚本生成作为AJAX响应的一部分
- 动态脚本生成和输出问题
- 动态脚本hack回调
- 防止美元.Pjax从移动动态脚本标签到头部部分
- 带有document.ready()侦听器的动态脚本没有执行ajax调用
- 动态脚本加载任意名称
- 动态脚本加载的最佳方式