注:此方法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