注意:此方法自 Chrome 36 起不再有效。没有直接的替代方案。
注意:下面的答案仅适用于外部脚本,即那些加载了<script src>
.
在 Chrome(和 Safari)中,“beforeload”事件在资源加载之前触发。此事件允许阻止资源,以便永远不会获取脚本。在这种情况下,你可以判断加载的资源是否是脚本,并检查是否要执行一些动作
此事件可用于模拟beforescriptexecute / afterscriptexecute:
document.addEventListener('beforeload', function(event) {
var target = event.target;
if (target.nodeName.toUpperCase() !== 'SCRIPT') return;
var dispatchEvent = function(name, bubbles, cancelable) {
var evt = new CustomEvent(name, {
bubbles: bubbles,
cancelable: cancelable
});
target.dispatchEvent(evt);
if (evt.defaultPrevented) {
event.preventDefault();
}
};
var onload = function() {
cleanup();
dispatchEvent('afterscriptexecute', true, false);
};
var cleanup = function() {
target.removeEventListener('load', onload, true);
target.removeEventListener('error', cleanup, true);
}
target.addEventListener('error', cleanup, true);
target.addEventListener('load', onload, true);
dispatchEvent('beforescriptexecute', true, true);
}, true);
调度时间不是 100% 与原始的相同,但对于大多数情况来说已经足够了。这是(非模拟)事件的时间线:
beforeload Before the network request is started
beforescriptexecute Before a script executes
afterscriptexecute After a script executes
onload After the script has executed
这是查看事件是否按预期工作的简单方法:
window.addEventListener('afterscriptexecute', function() {
alert(window.x);
});
document.head.appendChild(document.createElement('script')).src = 'data:,x=1';
document.head.appendChild(document.createElement('script')).src = 'data:,x=2';
该演示可以在http://jsfiddle.net/sDaZt/上看到