2010-01-12 75 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

相关问题