Как узнать о переходе на новый сайт в любом tab-е?
Спасибо.

Выделить код

Код:

var appcontent = document.getElementById("appcontent");
		if(!appcontent)
			return;
		appcontent.addEventListener("load", my_load_listener, true);
		appcontent.addEventListener("beforeunload", my_unload_listener, true);
Shutnik пишет
Выделить код

Код:

var appcontent = document.getElementById("appcontent");
		if(!appcontent)
			return;
		appcontent.addEventListener("load", my_load_listener, true);
		appcontent.addEventListener("beforeunload", my_unload_listener, true);

А скажите, почему true?
Причина, по которой событие onload срабатывает по несколько раз?
Спасибо

А скажите, почему true?

в данном примере это не принципиально

Причина, по которой событие onload срабатывает по несколько раз?

событие ловит загрузку всех документов, включая frame/iframe из всех табов. фильтровать всё это очень просто

Shutnik

в данном примере это не принципиально

Помнится, как раз-таки принципиально – load-события от tabbrowser'а ловятся только в capture phase (т.е. с true).
Хотя смотрел давно – могу и заблуждаться.

Infocatcher пишет

Shutnik

в данном примере это не принципиально

Помнится, как раз-таки принципиально – load-события от tabbrowser'а ловятся только в capture phase (т.е. с true).
Хотя смотрел давно – могу и заблуждаться.

Несложный опыт показал, что по false крокодил всё-таки не ловится ) p.s. видимо, из-за progress listener'а, хотя, чёрт его знает

А как можно отлавливать изменение текущего сайта, который видит пользователь сейчас?

Такие события как:
1) Пользоаатель набрал и перешел на новый сайт
2) Пользователь перешел на новый сайт по ссылке
3) Пользователь переключился на новый таб.

Одним словом: Реагировать на изменение window.content.location

lemax пишет

А как можно отлавливать изменение текущего сайта, который видит пользователь сейчас?

если сильно упрощённо, то так:

Выделить код

Код:

function my_load_listener (event)
	{
		var doc = event.originalTarget;
		var win = getBrowser().selectedBrowser.contentDocument;
		if(doc == win)
		{
			// активный таб
		}
	}
lemax пишет

1) Пользоаатель набрал и перешел на новый сайт
2) Пользователь перешел на новый сайт по ссылке

выше оно и было, остальное фильтруется обработчиком. можно ещё попробовать повесить watch на window.location.href

lemax пишет

3) Пользователь переключился на новый таб.

Выделить код

Код:

var appcontent = document.getElementById("appcontent");
		if(!appcontent)
			return;
		appcontent.addEventListener("select", my_select_listener, true);
Выделить код

Код:

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();
}

Спасибо.
Я только поменял "appcontent" на "content" (tabbrowser)

Выделить код

Код:

function NewSite (event)
{
  ...
}

document.getElementById("content").addEventListener("select", NewSite, true);
document.getElementById("content").addEventListener("load", NewSite, true);

Спасибо вам всем. Очень полезная оказалась информация. В частности, получилось подключиться к событиям таббраузера с помощью C++ в xpcom-компоненте.
Хочется отлавливать еще и другие события - появление новой вкладки за одно сообщение, а то load приходит несколько раз на одну вкладку :( Кто-нибудь знает, где посмотреть какие события могут быть у элемента? Стандартный список на xulplanet выглядит неполным.

И еще вопрос: какие интерфейсы реализует tabBrowser? Хочется создавать новую вкладку и загружать в ней новый html по uri прямо из C++ компонента. Как это можно сделать?

lemax пишет

Спасибо.
Я только поменял "appcontent" на "content" (tabbrowser)

Выделить код

Код:

function NewSite (event)
{
  ...
}

document.getElementById("content").addEventListener("select", NewSite, true);
document.getElementById("content").addEventListener("load", NewSite, true);
StepanM пишет

а то load приходит несколько раз на одну вкладку

не должно такого быть, там наверное фреймы есть. их надо фильтровать

нашёл интересную статью по теме на mdc

Спасибо за ссылку, помогло. :)

Shutnik пишет
StepanM пишет

а то load приходит несколько раз на одну вкладку

не должно такого быть, там наверное фреймы есть. их надо фильтровать

Ошибка была в том, что я коннектился к "content" элементу - это tabbrowser, а нужно было, как ты правильно говорил в самом начале, к "appcontent". Теперь можно отслеживать, какому документу соответствуют события DOMContentLoaded и unload: соответствующий eventTarget кастится к nsIDOMHTMLDocument. Замечено, что на каждый документ приходит всегда ровно один DOMContentLoaded и unload. Для каждого дополнительного фрейма будет дополнительно еще одно событие DOMContentLoaded (unload).

Осталось научиться загружать страничку в новой вкладке из C++. Может, есть у кого-нибудь наработки? Не могу найти даже способ получить window.getBrowser() из C++.:/