2010-01-12 73 views
1

在我的CMS中,我通過Javascript向頁面添加模塊,這些模塊可能包含外部JS文件,這些文件會在頁面上註冊,並加載到合作的外部文件中。我可以通過Javascript在頁面上註冊外部JS文件嗎?

當通過JS添加模塊時,這些腳本因此在頁面重新加載之前不會被註冊。

有沒有辦法讓我通過JavaScript調用動態地註冊這些腳本?

回答

5

您可以使用下面的代碼腳本標記添加到您的網頁:

var head = document.documentElement.childNodes[0]; 
var sTag = document.createElement("script"); 
sTag.src = "/path/to/script.js"; 
sTag.type = "text/javascript"; 
head.appendChild(sTag); 

您也可以使用document.getElementsByTagName("head")[0]head變種。另外,您也可以使用document.write,就像這樣:

document.write(
    '<script src="path/to/script.js" type="text/javascript"><\/script>' 
); 
+0

這會實際登記的JavaScript函數關係嗎? – 2010-01-12 13:25:44

+0

是的。 *評論填充* – 2010-01-12 13:28:47

+0

是的,但它只會*後*下載和解析文件。最好在腳本底部有一個回調函數,它可以調用頁面中的一個函數,讓你知道它何時加載並準備好,或者你可以使用setInterval查詢文件中函數的存在性 – 2010-01-12 13:29:18

1

我做了以下的功能,由jQuery的$.getScript方法的啓發,它需要一個urlcallback說法。

該回調非常有用,它在腳本加載成功時執行,並且您已準備好使用它。

該功能還負責從DOM移除script元素,以避免衆所周知memory leaks

loadScript("myLib.js", function() { 
    // myLib is loaded 
    //.. 
}); 

function loadScript(url, callback) { 
    var head = document.getElementsByTagName("head")[0], 
     script = document.createElement("script"), 
     done = false; 

    script.src = url; 
    // Attach event handlers for all browsers 
    script.onload = script.onreadystatechange = function(){ 
    if (!done && (!this.readyState || 
     this.readyState == "loaded" || this.readyState == "complete")) { 
     done = true; 
     callback(); // Execute callback function 
     // Prevent memory leaks in IE 
     script.onload = script.onreadystatechange = null; 
     head.removeChild(script); 
    } 
    }; 
    head.appendChild(script); 
} 
+0

不錯的功能:)雖然,我不確定我明白從DOM中刪除腳本後有什麼好處,那麼內容是否已經被解析並加載到內存中?刪除元素會得到什麼?你現在好奇我了! :) – 2010-01-12 15:08:48

+0

這是關於IE :(它有問題,並開始泄漏內存,它也需要腳本事件處理程序('onload'和'onreadystatechange')被廢除以便正確地進行垃圾收集... IE吸吮.. – CMS 2010-01-12 15:24:43

+0

我之前在添加腳本標記來獲取JSONP(在IE中)時遇到了問題,並且每次刪除標記都會導致巨大的內存泄漏 - 每個腳本文件都可能至少有30k。我沒有附加任何事件處理程序,但它仍然在泄漏,最後我回到了XMLHttpRequest和bog標準的JSON,但是,IE確實很糟糕。 – 2010-01-12 19:09:34

相關問題