Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Chrome浏览器是否破坏了动态脚本加载?_Javascript_Google Chrome_Dynamic_Load - Fatal编程技术网

Javascript Chrome浏览器是否破坏了动态脚本加载?

Javascript Chrome浏览器是否破坏了动态脚本加载?,javascript,google-chrome,dynamic,load,Javascript,Google Chrome,Dynamic,Load,这不是我的代码,我只是在排除故障。一些已经工作了一年多的代码现在已经停止在Chrome(12.0.742.122)中工作,但在其他“大”浏览器中工作(包括WebKit stablemate Safari(5.0.5))。通过“不再工作”,我的意思是,虽然脚本文件确实加载了,但它不会执行。如果将脚本加载到innerHTML或将其写入div中,但这两种操作都没有完成,您会期望出现这种行为。下面被注释掉的行都是试图让它工作的失败尝试,第一行是直到最近才工作的原始代码 <div id="abc"&

这不是我的代码,我只是在排除故障。一些已经工作了一年多的代码现在已经停止在Chrome(12.0.742.122)中工作,但在其他“大”浏览器中工作(包括WebKit stablemate 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>

var d=document.getElementById(“abc”);
var s=document.createElement('SCRIPT');
如果(s){s.src=script_path;}
//如(d)d.儿童//在所有其他浏览器中仍然有效的原始行
//如果(d)d.parentNode.appendChild;
//if(d)d.parentNode.insertBefore(s,d);
//如果(d)d.parentNode.insertBefore(s,d.nextSibling);
文件。正文。附录子项//这是可行的,脚本执行

上面这段代码想要的是,脚本是div的子脚本。他们可能希望能够删除该子脚本,并同时删除所有脚本(我不确定他们的动机)。

不,这是可行的。谷歌分析也使用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';

我发现了问题所在,这在很大程度上要感谢Martin Bieder的反复介绍,并用他的工作示例向我介绍了JSFIDLE.net

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

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

##########

您可以看到字体和中间结束标记的方式是错误的,这足以让Chrome感到困惑,以至于它不会执行添加到这些标记中的任何动态脚本。奇怪的我无法在JSFIDLE上重新创建它,这可能是因为网站的性质是运行您放在上面的html/js(例如使用onload)。

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

1) 正确地确定标签的范围会使内容更容易阅读。 2) 正确组织代码可以使解析更容易,这意味着解析器可以更快、更高效。
3) 我们使用的许多调试工具都依赖于此组织,以便显示可折叠标记之类的内容,并呈现更直观的范围。createElement('SCRIPT')尝试小写的“SCRIPT”,这没有什么区别,我已经尝试过了。我试过了,它让事情变得更糟而不是更好。与加载脚本但不执行不同,通过这样设置异步,文件甚至根本不加载。似乎您唯一的解决方案是将脚本元素追加到应该追加的位置(也称为head),并以某种方式将您应该追加脚本的元素与脚本元素链接起来。类似于jQuery的数据实现。将脚本放在何处并不重要。这可能对您来说并不重要,对我来说也不重要,但这段代码的所有者希望脚本是div的兄弟,或者div的子脚本。我已经找到了对它们的主要响应,只需将脚本附加到document.body,如上面代码片段的最后一行所示,但我正在寻找一种方法将其链接到div,正如他们所希望的那样。如果不能做到这一点,那么我肯定会告诉他们附加到主体(或者像您的代码片段那样插入到最后一个脚本之后)。这真的没关系。但是你可以使用
document.getElementById('myDiv').appendChild(script)
,如果你想的话。我知道这通常并不重要,但这篇文章的主要关键是,在Chrome上,它突然变得重要了。也许这是他们最近的版本。哇。我只能说这些了。神圣的比吉祖斯铬过于敏感。我花了过去40分钟(自从你上一篇文章发表后)试图弄明白为什么你的代码可以工作,但我调试的这个测试页面却不能工作。你不会相信这个解决方案是多么愚蠢。我将试着回答下面我自己的问题(如果允许的话,我以前试过一次另一个问题,但它不允许我回答)。作为一个完全的网络新手,我能想到的一个可能的原因可能是Chrome认为脚本由它们所包含的HTML元素拥有,如果封闭元素无法呈现,那么执行其脚本就没有意义。事实上,这可能适用于其他失败标签中的任何标签。是的,在这组不匹配的标签中,我想象着“好的,我现在正在等待关闭字体”,“堆栈我正在等待关闭字体,因为我现在正在等待关闭中心”。然后出现匹配,弹出状态“等待接近中心标记”。在这一点上,它遇到了一个关闭的字体标签,并认为“它在这里做什么,我不等待这些,忽略它”。然后是它等待的关闭中心,它会弹出原始的“等待字体关闭”状态,关闭字体永远不会到达,因此不会执行脚本。