>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >Как правильно добавить событие TabOpen на все окна? http://forum.mozilla-russia.org/viewtopic.php?id=40782 |
ELV1S > 13-10-2009 00:32:56 |
Я пробовал так: Выделить код Код:for (var i=0; i<Application.windows.length; i++) { var w = Application.windows[i]; w.events.addListener("TabOpen", function(event){ alert( 'tab #'+w.activeTab.index +' opened'); }); } Это работает неправильно, если окон больше одного. При каждом открытии таба, событие срабатывает для каждого окна. Если окон 2, то сработает 2 раза. |
Crazy-EyE > 14-10-2009 00:35:13 |
Видимо этот код выполняется в оверлее для browser.xul. Т.е. в КАЖДОМ окне выполняется код "зарегистрировать обработчик события для всех окон", поэтому количество alert-ов равно количеству открытых окон Фокса. Если возможно, то лучше устанавливать обработчик в каждом окне только для ЭТОГО окна. Но если требуется централизованная обработка событий, то надо что-то из этого (скорее всего JS Modules): https://developer.mozilla.org/en/Workin … ta_sharing |
ELV1S > 14-10-2009 20:43:48 |
Я уже разобрался, спасибо. Как тут применить JS Modules я не знаю. Можно пример кода? |
Crazy-EyE > 14-10-2009 22:35:05 |
Исходное назначение модулей - писать туда функции, которые используются в разных местах, чтобы не дублировать их. Побочным эффектом является то, что модули загружаются только один раз и являются общими для всего приложения, и поэтому переменные, объявленные внутри модулей, тоже общие (в частности, общие для всех окон). Поэтому, модули можно использовать для взаимодействия МЕЖДУ окнами (простейший пример - расширение, подсчитывающее общее количество когда-либо открытых за сессию вкладок). Однако если в вашем случае достаточно, чтобы каждое окно обрабатывало только СВОИ вкладки, модули конечно не нужны. |