>Форум 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=27693 |
lemax > 12-11-2008 18:01:18 |
Как узнать о переходе на новый сайт в любом tab-е? |
Shutnik > 12-11-2008 20:40:46 |
Выделить код Код:var appcontent = document.getElementById("appcontent"); if(!appcontent) return; appcontent.addEventListener("load", my_load_listener, true); appcontent.addEventListener("beforeunload", my_unload_listener, true); |
lemax > 13-11-2008 00:39:33 |
Shutnik пишет
А скажите, почему true? |
Shutnik > 13-11-2008 16:41:48 |
в данном примере это не принципиально
событие ловит загрузку всех документов, включая frame/iframe из всех табов. фильтровать всё это очень просто |
Infocatcher > 13-11-2008 20:01:26 |
Shutnik
Помнится, как раз-таки принципиально – load-события от tabbrowser'а ловятся только в capture phase (т.е. с true). |
Anton > 13-11-2008 21:38:14 |
Infocatcher пишет
Несложный опыт показал, что по false крокодил всё-таки не ловится ) p.s. видимо, из-за progress listener'а, хотя, чёрт его знает |
lemax > 17-11-2008 15:31:32 |
А как можно отлавливать изменение текущего сайта, который видит пользователь сейчас? Такие события как: Одним словом: Реагировать на изменение window.content.location |
Shutnik > 17-11-2008 18:06:21 |
lemax пишет
если сильно упрощённо, то так: Выделить код Код:function my_load_listener (event) { var doc = event.originalTarget; var win = getBrowser().selectedBrowser.contentDocument; if(doc == win) { // активный таб } } lemax пишет
выше оно и было, остальное фильтруется обработчиком. можно ещё попробовать повесить watch на window.location.href lemax пишет
Выделить код Код:var appcontent = document.getElementById("appcontent"); if(!appcontent) return; appcontent.addEventListener("select", my_select_listener, true); |
Infocatcher > 17-11-2008 21:32:40 |
Выделить код Код:var tabCont = gBrowser.mTabContainer; tabCont.addEventListener("TabSelect", selectHandler, true); Еще можно поиграться для получения совместимости с расширением Split Browser: Выделить код Код:function getTabBrowser(tabsRequired) { return "SplitBrowser" in window && !(tabsRequired && "TM_init" in window) // Tab Mix Plus ? SplitBrowser.activeBrowser : gBrowser || getBrowser(); } |
lemax > 19-11-2008 18:23:58 |
Спасибо. Выделить код Код:function NewSite (event) { ... } document.getElementById("content").addEventListener("select", NewSite, true); document.getElementById("content").addEventListener("load", NewSite, true); |
StepanM > 20-11-2008 16:39:15 |
Спасибо вам всем. Очень полезная оказалась информация. В частности, получилось подключиться к событиям таббраузера с помощью C++ в xpcom-компоненте. И еще вопрос: какие интерфейсы реализует tabBrowser? Хочется создавать новую вкладку и загружать в ней новый html по uri прямо из C++ компонента. Как это можно сделать? lemax пишет
|
Shutnik > 20-11-2008 17:43:15 |
StepanM пишет
не должно такого быть, там наверное фреймы есть. их надо фильтровать нашёл интересную статью по теме на mdc |
StepanM > 21-11-2008 15:48:43 |
Спасибо за ссылку, помогло. Shutnik пишет
Ошибка была в том, что я коннектился к "content" элементу - это tabbrowser, а нужно было, как ты правильно говорил в самом начале, к "appcontent". Теперь можно отслеживать, какому документу соответствуют события DOMContentLoaded и unload: соответствующий eventTarget кастится к nsIDOMHTMLDocument. Замечено, что на каждый документ приходит всегда ровно один DOMContentLoaded и unload. Для каждого дополнительного фрейма будет дополнительно еще одно событие DOMContentLoaded (unload). Осталось научиться загружать страничку в новой вкладке из C++. Может, есть у кого-нибудь наработки? Не могу найти даже способ получить window.getBrowser() из C++. |