我正在尝试编写一些脚本后备代码,以便如果从CDN无法获得jQuery和jQuery Validator,我会加载本地版本。请注意,以下脚本位于单独的文件中,以支持内容安全策略(CSP)。
1st username
如果jQuery不可用,则会在文档的末尾写入新的脚本标记,但接下来的行错误表明$未定义。如何在执行下一行之前等待文档写入完成加载文档?
答案 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.write
。 document.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