这是可能的。
我可能会这样处理它:
首先,创建一个函数来加载脚本。
function loadScript(src) {
var s = document.createElement('script'), x;
s.type = 'text/javascript';
s.async = true;
s.src = src;
x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(x, s);
}
这对于加载脚本来说已经足够好了,但是我们怎么知道它什么时候完成加载,或者根本没有加载呢?
让我们添加两个回调参数(一个代表成功,一个代表失败)和一个超时参数。我们还需要在我们的script
元素上附加一个事件监听器,以便在它加载时触发回调。
function loadScript(src, onSuccess, onFail, timeout) {
var s = document.createElement('script'), x, loaded;
s.type = 'text/javascript';
s.async = true;
s.src = src;
s.onload = s.onreadystatechange = function() {
if (''+s.readyState).match(/^(|complete|loaded|uninitialized)$/) {
loaded = true;
onSuccess && onSuccess();
s.onload = s.onreadystatechange = null;
}
}
if (onFail) {
setTimeout(function(){loaded || onFail();}, timeout || 5000);
}
x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(x, s);
}
全面披露:
- 这是完全未经测试的。
- 第一个代码块是从 Google Analytics 中抄袭而来的,代码不那么难看。
- 在看到 Slace 的答案后,第二块代码是从 yepnope 中扯下来的,代码稍微难看,但更简洁。