2014-02-12 133 views
0

我想动态加载脚本。这是我的代码:document.write动态加载脚本

document.write('<script type="text/javascript">window.jQuery || document.write(\"<script src=\'http://code.jquery.com/jquery-1.10.2.min.js\'></script>\")</script>'); 

这是在B.js里面,它是作为A.html脚本加载的。但我得到错误。将双引号内的结束脚本标记视为嵌套脚本标记并破坏代码。

任何想法如何解决这个问题?

+3

是的,不要使用'document.write()'。改用DOM操作。 – Cerbrus

+0

@Cerbrus你无法将脚本执行到DOM –

+1

@YuriyGalanter:_“无法将可执行脚本导入DOM”_ - >不能做什么? “跑”? “插”?无论哪种方式,你都不需要。而不是'document.write',只需检查jQuery。如果jQuery不存在,则使用DOM操作来加载脚本。 – Cerbrus

回答

1

代表</一个JavaScript字符串字面量为<\/内。

转义/使JavaScript解析器的含义保持不变,但不保留HTML解析器的含义。

由于您的HTML包含JavaScript,其中包含HTML,其中包含HTML,其中包含HTML(!!!),因此您必须双重转义最内层的HTML。

我认为这将工作:

document.write('<script type="text/javascript">window.jQuery || document.write(\"<script src=\'http://code.jquery.com/jquery-1.10.2.min.js\'><\\/script>\")<\/script>'); 

...但它是可怕的,似乎是在生成一个新的脚本元素只是为了决定是否要到,虽然产生一个新的脚本元素的小点。你会得到同样的结果:

if (!window.jQuery) { 
    document.write("<script src='http://code.jquery.com/jquery-1.10.2.min.js'><\/script>"; 
} 
+0

我已经试过了。它仍然不起作用。 – Jack

+0

我没有意识到你需要在_JavaScript_中跳过'/'s。 ''\ /'==='/'; // true' –

+2

@PaulS。 - 正如我所解释的,在JavaScript中,“”和“<\/script>”是等效的。在HTML中,它们是不同的。 – Quentin

4

使用:

var s = document.createElement("script"); 
s.type = "text/javascript"; 
s.src = "http://somedomain.com/somescript"; 
    $("head").append(s); 
//or using plain js 
    (document.getElementsByTagName("head")[0] || document.documentElement).appendChild(s); 

dynamically-load-jquery-library-javascript

+3

我喜欢你是如何将_vanilla_加到'$(“head”)'xD ['document.head'](https://developer.mozilla.org/en-US/docs/Web/API/document.head) –

+0

_“jQuery以特殊方式处理标签”__Nope。内部的''标签只是简单地破坏了代码。除此之外,解决方案是正确的。 – Cerbrus

+0

hmm.i猜我没有正确解释那部分。 –

1

这是一个很好的方法总是使用CDN但有时什么,如果CDN下跌(极少可能性虽然),但你永远不知道在这个世界上的任何事情都可能发生。

下面给出jQuery代码检查是否从Google CDN加载jQuery,如果没有,则它会引用文件夹中的jQuery.js文件。

<script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 
<script type="text/javascript"> 
if (typeof jQuery == 'undefined') 
{ 
document.write(unescape("%3Cscript src='Scripts/jquery.1.9.1.min.js' type='text/javascript'%3E%3C/script%3E")); 
} 
</script> 

它首先从Google CDN加载jQuery,然后检查jQuery对象。如果jQuery未成功加载,那么它将从硬盘位置引用jQuery.js文件。在这个例子中,jQuery.js从脚本文件夹加载。

1

打破你的字符串从它的最内层嵌套开始,每次考虑它将被解释的位置以及它如何被编码。

<script src='http://code.jquery.com/jquery-1.10.2.min.js'></script> 

HTML将是一个字符串内,逃避报价反斜杠和升了一级的嵌套

window.jQuery || document.write("<script src=\'http://code.jquery.com/jquery-1.10.2.min.js\'></script>"); 

脚本将里面HTML,转义标签 and go up al埃维尔在嵌套

<script type="text/javascript">window.jQuery || document.write("<"+"script src=\'http://code.jquery.com/jquery-1.10.2.min.js\'><"+"/script>");</script> 

HTML将是一个字符串内,逃避报价反斜杠和升了一级的嵌套

document.write('<script type=\"text/javascript\">window.jQuery || document.write(\"<\"+\"script src=\\\'http://code.jquery.com/jquery-1.10.2.min.js\\\'><\"+\"/script>\");</script>'); 

这将被载入作为外部脚本,所以我们完成了。

我选择使用"<"+"tag>..<"+"/tag>"样式来打破标签,因为我觉得它更容易逃脱。