Страницы: 1
Есть код, который вызывает алерт с ссылкой, после того как скачается какой-либо файл:
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(точнее на каждую копию браузера по алерту).
Как этого избежать? Если при данном способе не избежать, как можно по-другому реализовать нужный мне функционал.
Заранее спасибо.
Отсутствует
alkh
Самый простой способ - пусть алерт выдает отправитель сообщения. И, по-моему, самый верный.
Можно, конечно, "семафор" организовать, но это лишнее (опять же, по-моему):
var obj = { sender: false, notify: function () { this. sender = true; os. notify (...); this. sender = false; }, observe: function () { if (this. sender) return; ... } };
ps. точнее, для заданного условием одного алерта
(что ещё более подчеркивает ненужную "излишнесть" такого подхода)
Отредактировано Anton (25-10-2009 19:30:50)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
>> Пусть алерт вызывает отправитель.
Но отправителем является браузер, событие завершение закачки. Сейчас я слушаю это событие, но слушается каждой копией 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){} } } }
Отсутствует
alkh
Но отправителем является браузер, событие завершение закачки.
Я этого сначала не заметил, прошу прощения. Теперь понятно.
Чтобы был один алерт, нужен один обработчик. Проще всего, я думаю, будет организовать модуль (https://developer.mozilla.org/en/Using_ … de_modules) в котором и будет находиться обработчик, выдающий алерт.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Если вынести dlObserver в модуль, то где нужно регистрироваться на событие
В модуле, или в мейн скрипте?
Отсутствует
alkh
В модуле, или в мейн скрипте?
В скрипте оверлея. В модуле сложнее.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Дело ещё в том, что у меня там не просто алерт, а вполне себе функция
Как всё в модуль запихать не представляю.
Жесть, написал своё первое расширение, и встал в том месте, где меньше всего ожидал подвоха
Может что ещё, что подскажешь, или примерчик простой.
Пойду какой-нибудь давнлоад плагин поковыряю =\
Отсутствует
Дело ещё в том, что у меня там не просто алерт, а вполне себе функция
А это без разницы, просто алерт или что-то другое.
Как вариант, алерт может прыгать из модуля, а скрипты оверлеев по тому же уведомлению будут делать всё остальное.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
а скрипты оверлеев по тому же уведомлению будут делать всё остальное.
Хотел меня ещё больше запутать? Удалось
Если в модуле(который один на все копии браузера), будет обсервер на событие окончания загрузки файла, то чтобы вызывать скрипты оверлея придётся в оверлее подписываться на события модуля, а модуль общий, и значит каждая копия браузера выполнит действие.
Давай по другому подойдём к вопросу, как бы ты реализовал на моём месте. Отслеживание события окончания загрузки файла.
Отсутствует
alkh
то чтобы вызывать скрипты оверлея придётся в оверлее подписываться на события модуля, а модуль общий, и значит каждая копия браузера выполнит действие.
А это уже как скрипт в модуле решит - каждая копия выполнит действие или только первая, и какие они получат параметры в функцию обратного вызова. Это если решать вопрос подпиской на события модуля.
как бы ты реализовал на моём месте
По уведомлению выдать один алерт и выполнить какие-то действия в каждом окне приложения ?
Поставил бы в модуле обсервер с алертом, а в оконных скриптах - обсерверы, выполняющие эти какие-то действия, но без алерта.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
okkamas_knife
А я программист, у меня нет проблем с написанием алгоритмов и т.п.
Просто область незнакомая, первый раз пишу расширение, а мануалы только по xul
Какой-то документации вида "для выполнение такой-то задачи, используются такие-то и такие-то классы интерфейсы" - у меня нет.
Что-то типа твоего варианта пробывал, типа если активно окно выполняем действие над скачены файлом, использовал window.onfocus и window.onblur, которыми как раз и управлял переменой А(как в твоём примере), но браузер вешался.
Да на форум полез-то думал мож кто подходящий адон посоветует, или пример.
Отсутствует
если А=1 и Окно активное то выполняем алерт в противном ничего не делаем
Кстати, можно попробовать так:
var wm = Components. classes ["@mozilla.org/appshell/window-mediator;1"]. getService (Components. interfaces. nsIWindowMediator); var win = wm. getMostRecentWindow ("navigator:browser"); if (win == window) { ... }
(без модуля)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
По уведомлению выдать один алерт и выполнить какие-то действия в каждом окне приложения ?Поставил бы в модуле обсервер с алертом, а в оконных скриптах - обсерверы, выполняющие эти какие-то действия, но без алерта.
Осталось, умножить это на то что никогда подобное не писал, и даже примерно где об этом почитать.
Те же модули 3-мя способами объявляются.
Зря вы так к алерту привязались, я его привёл в качестве примера, что это некоторая функция который выполняется при dl-done.
Отсутствует
okkamas_knife пишетесли А=1 и Окно активное то выполняем алерт в противном ничего не делаем
Кстати, можно попробовать так:
Выделить кодКод:
var wm = Components. classes ["@mozilla.org/appshell/window-mediator;1"]. getService (Components. interfaces. nsIWindowMediator); var win = wm. getMostRecentWindow ("navigator:browser"); if (win == window) { ... }(без модуля)
Или лучше так:
var ww = Components. classes ["@mozilla.org/embedcomp/window-watcher;1"]. getService (Components. interfaces. nsIWindowWatcher); if (ww. activeWindow == window) { ... }
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Страницы: 1