Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.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 如何等待document.write完成_Javascript_Jquery_Cdn_Fallback - Fatal编程技术网

Javascript 如何等待document.write完成

Javascript 如何等待document.write完成,javascript,jquery,cdn,fallback,Javascript,Jquery,Cdn,Fallback,我正在尝试编写一些脚本回退代码,以便在CDN中无法使用jQuery和jQuery验证器时加载本地版本。请注意,以下脚本位于单独的文件中,以支持内容安全策略(CSP) (window.jQuery | | document.write(“”)); ($.validator | | document.write(“”)); 如果jQuery不可用,则会在文档末尾写入一个新的脚本标记,但下一行会出现错误,指出$is undefined。在执行下一行之前,如何等待文档写入完成加载文档?您应该利用的on

我正在尝试编写一些脚本回退代码,以便在CDN中无法使用jQuery和jQuery验证器时加载本地版本。请注意,以下脚本位于单独的文件中,以支持内容安全策略(CSP)

(window.jQuery | | document.write(“”));
($.validator | | document.write(“”));

如果jQuery不可用,则会在文档末尾写入一个新的脚本标记,但下一行会出现错误,指出$is undefined。在执行下一行之前,如何等待文档写入完成加载文档?

您应该利用
onload
事件。通过DOM操作将脚本标记添加到文档中,而不是
ducoment.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
是同步的。
document.write之后的下一行仅在write方法完成写入后执行。但是,如果使用
src
属性将
标记写入文档,则资源(src指向的地方)的加载将是异步的,并将在写入完成后与下一个语句并行启动。因为不可能提前知道加载资源需要多长时间,确保外部脚本中的所有内容都可用的唯一可行方法是
onload
事件。

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

另一方面,我建议使用DOM注入而不是
document.write
<代码>文档。写入
延迟CSS处理,并可能导致(未设置样式的内容的闪烁)

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

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

// Check if jQuery is loaded here

但是当代码的注释显示“检查jQuery是否已加载”时,OP需要等待它加载。你是怎么做到的?那么为什么第二行的$是未定义的呢?@rehanseed
$
在脚本加载之前是未定义的。
document.write()
调用已成功完成,但在执行第二行时尚未加载脚本。删除标记,因为问题/问题/解决方案与此插件无关,并且可以应用于任何CDN承载的脚本。
var scriptElm = document.createElement('script');
scriptElm.src = '/js/jquery.js';
document.getElementsByTagName('head')[0].appendChild( scriptElm );

// Check if jQuery is loaded here