好吧,我觉得问这个问题有点愚蠢。类似问题有很多点击,但我似乎无法回答正确。如果我通过 jQuery/Ajax 修改 DOM,加载的脚本何时实际解析/执行?
下面的代码适用于 F/F,但不适用于 Chrome 或 Opera。 “工作”意味着它执行“do_init()”没有错误。加载的脚本(实际上是一个 svg 文件;“file.svg”)定义了“do_init()”(位于“static”脚本中)所需的许多变量。这些变量对 F/F 可见,但对 Chrome 或 Opera 不可见(“变量 xxx 未定义”)。在所有 3 种情况下,文件/脚本都正确加载到 DOM 中,并且包含<svg>
,有一个<script>
在里面。
我可以通过重新安排代码让它在 Opera 中工作(svg 显示)(或在 F/F 中中断),但不能在 Chrome 中工作。使用 .success 和 .complete 没有区别。
Thanks.
<head>
...
<script type="text/javascript" src="do_init.js"></script>
<script type="text/javascript"><![CDATA[
jQuery(document).ready(function() {
...
$("#submit").click(function(e){
e.preventDefault();
var jqxhr =
$("#svg").html(ajax_load).load("file.svg", function(response, status, xhr) {
if(status == "error") {
var msg = "Error: ";
$("#error").html(msg + xhr.status + " " + xhr.statusText);
} else {
do_init(); // Ok in F/F, not in Chrome/Opera
}
});
});
});
]]></script>
</head>
<body>
<button id="submit" type="button">Click Me!</button>
<div id="svg"></div>
</body>
EDIT 1
事实证明,它们从未被执行过——至少在 IE9、FF8、Chrome、Opera 和 Safari 中是这样。他们are在FF7中执行。我刚刚编写了一个最小的测试页面,它对脚本进行 Ajax 加载,这只是一个警报。这仅在 FF7 中显示警报。我也尝试过将脚本包裹在<svg>
,这没有什么区别。
这就是为什么建议您将 javascript 放在文档末尾、正文末尾的部分原因。
一般情况下,javascript遇到就执行;如果将其放在文档的顶部,它将在加载过程中较早运行,如果放在末尾则较晚运行。但是,当使用库的“onLoad”或“domReady”功能时,您会将执行推迟到稍后的时间。
请参阅 jQuery 文档以获取更多信息:http://api.jquery.com/ready/ http://api.jquery.com/ready/
虽然 JavaScript 提供了在渲染页面时执行代码的 load 事件,但只有在完全接收到所有资源(例如图像)后,才会触发该事件。在大多数情况下,一旦 DOM 层次结构完全构建完毕,脚本就可以运行。传递给 .ready() 的处理程序保证在 DOM 准备好后执行,因此这通常是附加所有其他事件处理程序并运行其他 jQuery 代码的最佳位置。当使用依赖 CSS 样式属性值的脚本时,在引用脚本之前引用外部样式表或嵌入样式元素非常重要。
EDIT我误读了你问题的细节。动态加载的脚本会立即解析,但是onLoad
事件可能(也可能不会!)根据加载脚本的 HTTP 传输方面触发,而不是根据加载脚本的解释触发。通常,这很好(尽管有些浏览器不能可靠地触发事件 - IE,看着你),但你所追求的时间不是脚本被获取的时间,而是实际解析和活动的时间。这些应该在几毫秒内,通常使得差异毫无意义。
使用此技术解决问题有一些不同的看法,其中一些已讨论here http://www.ejeliot.com/blog/109 and here http://unixpapa.com/js/dyna.html- 但似乎没有人具体提到 Chrome 是麻烦的根源。也就是说,轮询所包含脚本(通过超时)的建议方法似乎是建议中最不容易失败的方法,尽管这也是我最不喜欢的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)