2010-06-10 54 views
1

基於頁面上的點擊事件,通過ajax我獲取一塊html和腳本,我可以將腳本元素添加到head元素中,然而基於WebKit的瀏覽器並不把它當作腳本(即我不能調用在附加腳本中聲明的函數)。如何動態添加一個Javascript函數(和調用)

使用Chrome開發人員工具我可以看到我的腳本節點確實存在,但它顯示的方式與不動態添加的腳本塊不同,非動態腳本具有文本子元素,我無法弄清楚一種爲動態腳本複製它的方法。

任何想法或更好的方法來做到這一點?驅動力是潛在的許多HTML和腳本,除非用戶點擊特定的選項卡,否則將加載相關內容(和腳本),否則永遠不會需要該腳本。謝謝!

+0

已嘗試將腳本直接添加到文檔正文...? – deostroll 2010-06-10 13:00:03

+0

我有,而且我可以再次看到它在那裏,但我無法調用它。 – whitey 2010-06-10 13:11:04

回答

2

您可以嘗試使用jQuery ...它提供了一種名爲.getScript的方法,它將以適當的方式動態加載JavaScript。它在所有着名的瀏覽器中都能正常工作。

+0

我曾經想過,我試圖將所有的html和相關的腳本保存在一個模板中,而不必將它們分成兩部分,看起來可能沒有選擇。 – whitey 2010-06-10 13:14:27

1

對從服務器收到的內容調用eval()怎麼樣?當然,你必須切斷<script></script>部件。

+0

我試過了,使用.textContent屬性很容易得到腳本內容,而且我可以看到我有一個var內的函數,但eval沒有任何作用!?! – whitey 2010-06-10 13:12:30

+0

@whitey - 你可以發表一些代碼來證明你正在嘗試做什麼嗎? 'eval()'應該可以工作。你也可以找到[這篇文章](http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html)有趣。 jQuery在寫這篇文章後開始使用他的方法,所以我認爲這可能就是你要做的。 – Andrew 2010-06-10 13:50:27

0

如果您使用像jQuery這樣的庫,只需使用內置方法即可完成此操作。

否則你需要把它添加到文檔,而不是頭部像這樣:

document.write("<scr" + "ipt type=\"text/javascript\" src=\"http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js\"></scr" + "ipt>"); 

說實話,我不知道爲什麼腳本標籤被切斷這樣的,但是很多這樣的例子可能會有很好的理由。

您還需要考慮加載腳本可能需要很長一段時間的事實,因此在將其添加到主體後,應該設置一個計時器來檢查腳本是否已加載。這可以通過腳本導出的任何全局變量的簡單類型檢查來實現。

或者您可以在實際的JavaScript正文上做一個eval(),但可能會有一些注意事項。

一般來說,我會把這種東西放到瀏覽器緩存中,然後在頁面上加載javascript。只是儘量不要使用任何onload事件,而是在顯示選項卡時調用所需的任何初始化器。

+0

對於內聯腳本,打破關閉''是非常重要的,因爲JS解析器會將它解釋爲當前腳本塊的結尾,並且不會得到其後任何其他代碼,即使這樣做會引發大量異常。 – Andrew 2010-06-10 13:25:50