这不是我的代码,我只是对它进行故障排除。一些已经工作超过一年的代码现在已停止在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的子代。据推测,他们希望能够移除那个孩子并同时删除所有脚本(我不确定他们的动机)。
答案 0 :(得分:3)
我已经发现了问题所在,很大程度上要归功于Martin Bieder的来回,并以他的工作实例向我介绍jsfiddle.net。
问题实际上是测试页面,您认为在创建它时会产生相当无害的错误。 div和所有代码将在下面简单地表示为######,因为它甚至与问题无关。它实际上是一个HTML问题。如果你没有正确匹配你的结束标签,Chrome 12并不高兴。我真的不能相信它对脚本文件的执行有影响,但确实如此。我在过去10分钟内尝试了很多次HTML标签的对与错,令人难以置信的是这确实是问题所在。
<font><center><b>
##########
</b></font></center>
您会看到字体和中心结束标记的方式是错误的,这足以让Chrome充分混淆,以至于它不会执行在这些标记中添加的任何动态脚本。离奇。我无法在jsfiddle上重新创建这个,可能是由于网站的性质运行你放在它上面的html / js(例如使用onload)。
答案 1 :(得分:1)
不行。 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);
答案 2 :(得分:0)
您是否尝试过设置async
脚本元素?
var script = document.createElement('script');
script.async = 'async';
答案 3 :(得分:-2)
这是关于3件事......组织,优化和调试。
1)正确确定标签的范围使事情更容易阅读。 2)正确组织代码可以更容易解析,这意味着解析器可以更快,更高效。 3)我们使用的很多调试工具都依赖于这个组织,以便显示诸如可折叠标签之类的内容并呈现更直观的范围