4
在我的擴展中,我依賴於DOMContentLoaded事件。這工作正常。但如果用戶取消中間的頁面加載,則失敗。而我的擴展根本不起作用。我希望它在這裏優雅地退化。那麼,有沒有辦法處理這種情況?如果用戶中斷頁面加載,該如何處理?
在我的擴展中,我依賴於DOMContentLoaded事件。這工作正常。但如果用戶取消中間的頁面加載,則失敗。而我的擴展根本不起作用。我希望它在這裏優雅地退化。那麼,有沒有辦法處理這種情況?如果用戶中斷頁面加載,該如何處理?
一種可能性是使用nsIWebProgressListener來監視頁面加載事件的進度。當請求完成時,即使用戶中斷了頁面加載,onStateChange
方法的執行狀態爲STATE_STOP
。
這裏有一個簡單的例子:
const STATE_START = Components.interfaces.nsIWebProgressListener.STATE_START;
const STATE_STOP = Components.interfaces.nsIWebProgressListener.STATE_STOP;
window.addEventListener("load", function(e) {
gBrowser.addProgressListener({
QueryInterface: function(aIID) {
if (aIID.equals(Components.interfaces.nsIWebProgressListener) ||
aIID.equals(Components.interfaces.nsISupportsWeakReference) ||
aIID.equals(Components.interfaces.nsISupports))
return this;
throw Components.results.NS_NOINTERFACE;
},
onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {
if (aFlag & STATE_STOP) {
// load finished or was stopped
alert("stop");
}
},
onLocationChange: function(aProgress, aRequest, aURI) { },
onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) { },
onStatusChange: function(aWebProgress, aRequest, aStatus, aMessage) { },
onSecurityChange: function(aWebProgress, aRequest, aState) { }
});
}, false);
這當然是一個玩具例子。在一些實施細節延伸閱讀: