如何等待document.write完成

时间:2015-07-05 12:36:49

标签: javascript jquery cdn fallback

我正在尝试编写一些脚本后备代码,以便如果从CDN无法获得jQuery和jQuery Validator,我会加载本地版本。请注意,以下脚本位于单独的文件中,以支持内容安全策略(CSP)。

1st username

如果jQuery不可用,则会在文档的末尾写入新的脚本标记,但接下来的行错误表明$未定义。如何在执行下一行之前等待文档写入完成加载文档?

2 个答案:

答案 0 :(得分:6)

您应该使用onload的{​​{1}}事件。而不是<script>,通过DOM操作向文档添加脚本标记:

ducoment.write

更新:

您的问题“如何等待document.write”的答案是您不必的,因为var s = document.createElement('script'); s.onload = function() { // jQuery is now loaded and can be used } s.src = '/js/jquery.js'; document.getElementsByTagName('head')[0].appendChild(s); 是同步的。 document.write之后的下一行只会在写入方法完成写入后执行。但是,如果您使用document.write属性将<script>标记写入文档,则资源的加载(src指向的位置)将是异步的,并且将在写入完成 in paralell < / em>与下一个陈述。因为不可能事先告诉资源加载需要多长时间,所以确保从外部脚本获得所有内容的唯一可行方法是src事件。

答案 1 :(得分:2)

document.write已经阻止执行,直到解析和处理信息为止。因此,您不需要为您的示例添加任何额外代码。

另一方面,我建议使用DOM注入而不是document.writedocument.write延迟了CSS处理,可能导致FOUC(无格式内容的Flash)。

DOM注入可以按如下方式进行:

var scriptElm = document.createElement('script');
scriptElm.src = '/js/jquery.js';
document.getElementsByTagName('head')[0].appendChild( scriptElm );

// Check if jQuery is loaded here