>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Обсерверы, проблема с более чем одним запущеным FF http://forum.mozilla-russia.org/viewtopic.php?id=41174 |
alkh > 25-10-2009 17:59:02 |
Есть код, который вызывает алерт с ссылкой, после того как скачается какой-либо файл: Выделить код Код:window.addEventListener('load' , checker, true); function checker() { Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService) .addObserver(dlObserver, 'dl-done', false); } const dlObserver = { observe: function(subject, topic, state) { if (topic == 'dl-done') { try { var file = subject.QueryInterface(Components.interfaces.nsIDownload); alert( newfile.source.spec) } catch (e){} } } } Всё работает, но если запустить ещё одну копию браузера, и скачать какой-нибудь файл, вылетят два alerta(точнее на каждую копию браузера по алерту). Как этого избежать? Если при данном способе не избежать, как можно по-другому реализовать нужный мне функционал. Заранее спасибо. |
Anton > 25-10-2009 19:19:53 |
alkh Выделить код Код:var obj = { sender: false, notify: function () { this. sender = true; os. notify (...); this. sender = false; }, observe: function () { if (this. sender) return; ... } }; ps. точнее, для заданного условием одного алерта (что ещё более подчеркивает ненужную "излишнесть" такого подхода) |
alkh > 26-10-2009 03:20:28 |
>> Пусть алерт вызывает отправитель. Но отправителем является браузер, событие завершение закачки. Сейчас я слушаю это событие, но слушается каждой копией FF Код что ты привёл либо не подходит, либо я неправильно его понял, вот что я понял: Выделить код Код:window.addEventListener('load' , checker, true); var os = null; function checker() { os = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService) os.addObserver(dlObserver, 'dl-done', false); } const dlObserver = { sender: false, notify: function () { this.sender = true; os.notifyObservers(os,'dl-done',null); this.sender = false; }, observe: function(subject, topic, state) { if (topic == 'dl-done') { try { if (!this.sender) { var file = subject.QueryInterface(Components.interfaces.nsIDownload); alert(newfile.source.spec) } } catch (e){} } } } |
Anton > 26-10-2009 10:09:12 |
alkh
Я этого сначала не заметил, прошу прощения. Теперь понятно. Чтобы был один алерт, нужен один обработчик. Проще всего, я думаю, будет организовать модуль (https://developer.mozilla.org/en/Using_ … de_modules) в котором и будет находиться обработчик, выдающий алерт. |
alkh > 26-10-2009 11:13:48 |
Если вынести dlObserver в модуль, то где нужно регистрироваться на событие В модуле, или в мейн скрипте? |
Anton > 26-10-2009 14:29:31 |
alkh
В скрипте оверлея. В модуле сложнее. |
alkh > 26-10-2009 17:33:43 |
Дело ещё в том, что у меня там не просто алерт, а вполне себе функция Может что ещё, что подскажешь, или примерчик простой. Пойду какой-нибудь давнлоад плагин поковыряю =\ |
Anton > 26-10-2009 22:40:58 |
А это без разницы, просто алерт или что-то другое. |
alkh > 27-10-2009 02:21:05 |
Anton пишет
Хотел меня ещё больше запутать? Удалось Давай по другому подойдём к вопросу, как бы ты реализовал на моём месте. Отслеживание события окончания загрузки файла. |
Anton > 27-10-2009 08:58:02 |
alkh
А это уже как скрипт в модуле решит - каждая копия выполнит действие или только первая, и какие они получат параметры в функцию обратного вызова. Это если решать вопрос подпиской на события модуля.
По уведомлению выдать один алерт и выполнить какие-то действия в каждом окне приложения ? Поставил бы в модуле обсервер с алертом, а в оконных скриптах - обсерверы, выполняющие эти какие-то действия, но без алерта. |
alkh > 27-10-2009 09:05:05 |
okkamas_knife Что-то типа твоего варианта пробывал, типа если активно окно выполняем действие над скачены файлом, использовал window.onfocus и window.onblur, которыми как раз и управлял переменой А(как в твоём примере), но браузер вешался. Да на форум полез-то думал мож кто подходящий адон посоветует, или пример. |
Anton > 27-10-2009 09:53:36 |
okkamas_knife пишет
Кстати, можно попробовать так: Выделить код Код:var wm = Components. classes ["@mozilla.org/appshell/window-mediator;1"]. getService (Components. interfaces. nsIWindowMediator); var win = wm. getMostRecentWindow ("navigator:browser"); if (win == window) { ... } (без модуля) |
alkh > 27-10-2009 09:53:53 |
Anton пишет
Осталось, умножить это на то что никогда подобное не писал, и даже примерно где об этом почитать. |
Anton > 27-10-2009 09:59:22 |
Anton пишет
Или лучше так: Выделить код Код:var ww = Components. classes ["@mozilla.org/embedcomp/window-watcher;1"]. getService (Components. interfaces. nsIWindowWatcher); if (ww. activeWindow == window) { ... } |
alkh > 27-10-2009 11:11:13 |
2 Anton, да такой способ помог Но всё равно как время появится буду попробую добить компонент. |