>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >открыть несколько табов и отслеживать загрузку страниц в них http://forum.mozilla-russia.org/viewtopic.php?id=10499 |
Elena > 24-05-2006 11:06:42 |
Здравствуйте. Я только начинаю разбираться с расширениями для firefox, и прошу совета. |
cesspit > 24-05-2006 16:33:10 |
Elena пишет
Выделить код Код:var progressListener= { QueryInterface: function (aIID) { if (aIID. equals (Components. interfaces. nsIWebProgressListener) || aIID. equals (Components. interfaces. nsISupportsWeakReference) || aIID. equals (Components. interfaces. nsIXULBrowserWindow) || aIID. equals (Components. interfaces. nsISupports)) return this; throw Components. results. NS_NOINTERFACE; }, onLocationChange:function (a,b,c){}, onProgressChange:function(a,b,c,d,e,f){}, onSecurityChange:function(a,b,c){}, onStateChange:function(a,b,c,d){}, onStatusChange:function(a,b,c,d){} }; var res = "http://ya.ru"; var tab = getBrowser().addTab(res); var br = window.getBrowser().getBrowserForTab(tab); br.addProgressListener(progressListener); Copyright © Anton для того, чтобы узнать об окончании загрузки нужно проверять флаги в OnStateChange (3й аргумент). Выделить код Код:const STATE_STOP = Components. interfaces. nsIWebProgressListener.STATE_STOP; const STATE_NETWORK = Components.interfaces.nsIWebProgressListener.STATE_IS_NETWORK; ....................... onStateChange:function(a,b,stateFlags,d){ var STOP = (stateFlags & STATE_STOP) != 0; var NETWORK = (stateFlags & STATE_NETWORK) != 0; if (STOP && NETWORK) { //загрузка закончена } } но эти же флаги приходят когда загрузка остановлена (польз-ль нажал на стоп, дисконнект). Чтобы узнать, загрузилась ли страница полностью, можно проверять значения 3го и 4го аргумента метода OnProgressChange (curSelfProgress и maxSelfProgress). Если равны - страница загружена полностью |
Sky > 24-05-2006 16:40:29 |
Ну вот, пока писал ответ, уже ответить успели... |
Elena > 24-05-2006 19:14:01 |
Большое спасибо. Работает. Выделить код Код:for(var i=1; i<=10; i++){ var tab = getBrowser().addTab(res); var br = window.getBrowser().getBrowserForTab(tab); br.addProgressListener(progressListener); } то ведь обработчик будет зарегистрирован только для последнего таба. можно ли какнибудь соотнести обработчик и таб из которого пришло событие? |
Anton > 24-05-2006 21:32:52 |
Elena пишет
Что если соорудить класс Выделить код Код:function progressListener (id) { this. id = id; } progressListener. prototype. QueryInterface = function (aIID) { ... ... br. addProgressListener (new progressListener (i)) ... ? cesspit пишет
не, не мой, это из расширения extended statusbar |
Elena > 25-05-2006 11:02:39 |
Попробовала написать так: Выделить код Код:function progressListener (id) { this. id = id; } progressListener. prototype.QueryInterface=function(aIID) { if (aIID.equals(Components.interfaces.nsIWebProgressListener) || aIID.equals(Components.interfaces.nsISupportsWeakReference) || aIID.equals(Components.interfaces.nsIXULBrowserWindow) || aIID.equals(Components.interfaces.nsISupports)) return this; throw Components.results.NS_NOINTERFACE; } progressListener.prototype={ onStateChange: function(...){...}, ... } Скорее всего где-то не правильно из-за моего слабого знания javascript, т.к. не работает и похоже из-за ошибки: Выделить код Код:Error: [Exception... "Component returned failure code: 0x80070057 (NS_ERROR_ILLEGAL_VALUE) [nsIWebProgress.addProgressListener]" nsresult: "0x80070057 (NS_ERROR_ILLEGAL_VALUE)" location: "JS frame :: chrome://global/content/bindings/browser.xml :: addProgressListener :: line 346" data: no] Source File: chrome://global/content/bindings/browser.xml Line: 346 |
Anton > 25-05-2006 14:21:08 |
Elena
Сначала вы определяете в прототипе функцию QueryInterface, а потом полностью "перекрываете" прототип конструкцией после чего в прототипе progressListener'а уже нет определения QueryInterface, отсюда и ошибка. Выделить код Код:function progressListener (arglist) { ... } progressListener. prototype. QueryInterface = function (aIID) { ... } progressListener. prototype. onStateChange = function (arglist) { ... } ... или Выделить код Код:function progressListener (arglist) { ... } progressListener. prototype = { QueryInterface: function (arglist) { ... }, onStateChange: function (arglist) { ... }, ... } или (без prototype) Выделить код Код:function progressListener (id) { this. id = id; this. QueryInterface = function (aIID) { ... } this. onStateChange = function (arglist) { ... } ... } |
Elena > 26-05-2006 12:28:45 |
Большое спасибо за разъяснения! Буду делать. |
Atomic > 05-07-2006 14:19:42 |
А кто мне пояснит, почему для text/html onProgressChange вызывается, а для "text/plain" нет? |