注:此方法no longer works as of 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);
调度时间与原始的不完全相同,但在大多数情况下已足够。这是(非仿真)的事件时间线:
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/现场看到
顺便说一句,不能使用HTML5加载事件,它是一个简单的事件,因此不会冒泡。 – sroussey
您可以看到何时使用此解包扩展执行各种事件:https://github.com/simov/事件记录器,它不是直接解决你的问题,但它可能帮助你找出你应该听的事件。您还可以单击控制台中的对象来查看每个步骤中的数据。 – simo