Как справиться, если пользователь прерывает загрузку страницы? - PullRequest
4 голосов
/ 01 ноября 2011

В моем расширении я полагаюсь на событие DOMContentLoaded. Это отлично работает. Но происходит сбой, если пользователь отменяет загрузку страницы посередине. И мое расширение просто не работает. Я хочу, чтобы это изящно ухудшилось здесь. Итак, есть ли способ разобраться с этим делом?

1 Ответ

3 голосов
/ 01 ноября 2011

Одной из возможностей является использование 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);

Это, конечно, игрушечный пример. Далее читаем о некоторых деталях реализации:

...