Полезная информация

Общайтесь со знакомыми и друзьями в нашем сообществе в Facebook.

№112-11-2008 18:01:18

lemax
Участник
 
Группа: Members
Зарегистрирован: 12-11-2008
Сообщений: 36
UA: Firefox 3.0

Как отловить событие изменения адресса.

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

Отсутствует

 

№212-11-2008 20:40:46

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Как отловить событие изменения адресса.

Выделить код

Код:

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

Отсутствует

 

№313-11-2008 00:39:33

lemax
Участник
 
Группа: Members
Зарегистрирован: 12-11-2008
Сообщений: 36
UA: Firefox 3.0

Re: Как отловить событие изменения адресса.

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 срабатывает по несколько раз?
Спасибо

Отсутствует

 

№413-11-2008 16:41:48

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Как отловить событие изменения адресса.

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

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

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

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

Отсутствует

 

№513-11-2008 20:01:26

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 3.0

Re: Как отловить событие изменения адресса.

Shutnik

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

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


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№613-11-2008 21:38:14

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 3.0
Веб-сайт

Re: Как отловить событие изменения адресса.

Infocatcher пишет

Shutnik

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

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

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

Отредактировано Anton (13-11-2008 22:08:59)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№717-11-2008 15:31:32

lemax
Участник
 
Группа: Members
Зарегистрирован: 12-11-2008
Сообщений: 36
UA: Opera 9.2

Re: Как отловить событие изменения адресса.

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

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

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

Отсутствует

 

№817-11-2008 18:06:21

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Как отловить событие изменения адресса.

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

Отсутствует

 

№917-11-2008 21:32:40

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 3.0

Re: Как отловить событие изменения адресса.

Выделить код

Код:

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

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1019-11-2008 18:23:58

lemax
Участник
 
Группа: Members
Зарегистрирован: 12-11-2008
Сообщений: 36
UA: Opera 9.2

Re: Как отловить событие изменения адресса.

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

Выделить код

Код:

function NewSite (event)
{
  ...
}

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

Отсутствует

 

№1120-11-2008 16:39:15

StepanM
Участник
 
Группа: Members
Зарегистрирован: 23-10-2008
Сообщений: 4
UA: IE 6.0

Re: Как отловить событие изменения адресса.

Спасибо вам всем. Очень полезная оказалась информация. В частности, получилось подключиться к событиям таббраузера с помощью 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);

Отсутствует

 

№1220-11-2008 17:43:15

Shutnik
Участник
 
Группа: Extensions
Зарегистрирован: 12-11-2005
Сообщений: 3785
UA: Iceweasel 3.0

Re: Как отловить событие изменения адресса.

StepanM пишет

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

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

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

Отсутствует

 

№1321-11-2008 15:48:43

StepanM
Участник
 
Группа: Members
Зарегистрирован: 23-10-2008
Сообщений: 4
UA: IE 6.0

Re: Как отловить событие изменения адресса.

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

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

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

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

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

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

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]