2014-02-12 165 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>"樣式來打破標籤,因爲我覺得它更容易逃脫。