在我的CMS中,我通过Javascript向页面添加模块,这些模块可能包含外部JS文件,这些文件会在页面上注册,并加载到合作的外部文件中。我可以通过Javascript在页面上注册外部JS文件吗?
当通过JS添加模块时,这些脚本因此在页面重新加载之前不会被注册。
有没有办法让我通过JavaScript调用动态地注册这些脚本?
在我的CMS中,我通过Javascript向页面添加模块,这些模块可能包含外部JS文件,这些文件会在页面上注册,并加载到合作的外部文件中。我可以通过Javascript在页面上注册外部JS文件吗?
当通过JS添加模块时,这些脚本因此在页面重新加载之前不会被注册。
有没有办法让我通过JavaScript调用动态地注册这些脚本?
您可以使用下面的代码脚本标记添加到您的网页:
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>'
);
我做了以下的功能,由jQuery的$.getScript
方法的启发,它需要一个url
和callback
说法。
该回调非常有用,它在脚本加载成功时执行,并且您已准备好使用它。
该功能还负责从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);
}
不错的功能:)虽然,我不确定我明白从DOM中删除脚本后有什么好处,那么内容是否已经被解析并加载到内存中?删除元素会得到什么?你现在好奇我了! :) – 2010-01-12 15:08:48
这是关于IE :(它有问题,并开始泄漏内存,它也需要脚本事件处理程序('onload'和'onreadystatechange')被废除以便正确地进行垃圾收集... IE吸吮.. – CMS 2010-01-12 15:24:43
我之前在添加脚本标记来获取JSONP(在IE中)时遇到了问题,并且每次删除标记都会导致巨大的内存泄漏 - 每个脚本文件都可能至少有30k。我没有附加任何事件处理程序,但它仍然在泄漏,最后我回到了XMLHttpRequest和bog标准的JSON,但是,IE确实很糟糕。 – 2010-01-12 19:09:34
这会实际登记的JavaScript函数关系吗? – 2010-01-12 13:25:44
是的。 *评论填充* – 2010-01-12 13:28:47
是的,但它只会*后*下载和解析文件。最好在脚本底部有一个回调函数,它可以调用页面中的一个函数,让你知道它何时加载并准备好,或者你可以使用setInterval查询文件中函数的存在性 – 2010-01-12 13:29:18