缺少JS库的最简单方法是使XMLHttpRequest和eval()返回。你的“onload”将会在数据返回的时候出现,而“oninit”在你评估完毕后就会立即生效。
编辑:如果你想排序这个,你可以创建一个AssetLoader,它接受一个脚本数组并且不会eval()一个脚本,直到它被取出并初始化为止。
编辑2:你也可以在评论中引用的帖子中使用script.onload的东西。 eval方法有一个小优点,因为您可以分离和控制脚本导入的加载和执行部分。
编辑3:下面是一个例子。考虑一个名为foo.js文件,该文件包含以下内容:
function foo() {
alert('bar');
}
然后从另一个页面在浏览器中执行以下命令:
function initScript (scriptString) {
window.eval(scriptString);
}
function getScript (url, loadCallback, initCallback, callbackScope) {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onreadystatechange = function (e) {
if (req.readyState == 4) {
if (loadCallback) loadCallback.apply(callbackScope);
initScript.call(null, req.responseText);
if (initCallback) initCallback.apply(callbackScope);
}
}
req.send();
}
function fooScriptLoaded() {
alert('script loaded');
}
function fooScriptInitialized() {
alert('script initialized');
foo();
}
window.onload = function() {
getScript('foo.js', fooScriptLoaded, fooScriptInitialized, null);
}
你会看到“脚本加载”警报“,初始化脚本“和”酒吧“。很显然,XMLHttpRequest在这里的实现并不完整,并且你可以为你希望执行脚本的任何范围做各种事情,但这是它的核心。
的Dupicate http://stackoverflow.com/questions/3125897/loading-scripts-dynamically/3125918#3125918 – tcooc 2010-08-19 15:05:42
为什么不看看像LabJS这样的现有解决方案? http://labjs.com/ – Pointy 2010-08-19 15:06:06
没有冒犯,但这是一个糟糕的设计决定的怪胎。 – Fosco 2010-08-19 15:08:22