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);
这当然是一个玩具例子。在一些实施细节延伸阅读: