Подскажите как можно получить document выбранного таба!
Я получаю документ:

Выделить код

Код:

var saveDocument = null;
document.addEventListener("DOMContentLoaded", OnDocument, true);
function OnDocument(event)
{
        // загруженный document => event. originalTarget
       saveDocument = event. originalTarget;
     ...
}

как определить при смене табов что это именно saveDocument  ?

Вопрос в догонку.
Как узнать документ закрытого таба ?

Точно не помню, но, кажется, почти всё нужное есть в моём давнишнем скрипте: http://forum.mozilla.ru/viewtopic.php?pid=76627#p76627

ну и ещё, у tabbrowser есть методы getBrowserForTab, getBrowserAtIndex, getBrowserIndexForDocument и свойство mCurrentTab, а у tab есть свойства tabId, tabIndex.

Может ты знаешь как определить к какой закладке, документу,окну относяптя документы загружающиеся через превиденный выше код!
для сайта www.rsdn.ru
использовал:

Выделить код

Код:

window.getBrowser().getBrowserIndexForDocument(event. target)

первый(main) фрейм говорит что относится к закладке 0 а остальные -1 а документ то в целом 1-н
как понять что это грузится один и тотже документ

Назначить элементу browser каждой вкладки обработчик DOMContentLoaded - он "отловит" загрузку документа и всех его фреймов

Он и так отлавливает загруз всех документов и фреймов но как их разобрать потом!
Я получил первый документ mainFrame а все остальные фреймы неимеют не индекса browser(тобишь -1) не являются дочерними для главного документа !

CVB пишет

Он и так отлавливает загруз всех документов и фреймов но как их разобрать потом!...

Если window. addEventListener, то конечно, всех. Если добавить addEventListener браузеру вкладки - он отловит только те, которые будут загружаться в этой вкладке. А фреймы и основной документ можно разобрать хотя бы по location.

...Я получил первый документ mainFrame а все остальные фреймы неимеют не индекса browser(тобишь -1) не являются дочерними для главного документа !

Потому что не в табах они. Найти основной документ в mTabs. item'ах, а принадлежность фреймов искать через event. target. defaultView. window. location.

У меня Экстеншин отслеживает загрузку всех Content-ов на всех имеюшихся табах и для каждого таба строит дерево требуемых элементов.
Я создаю массив структур в которых хранится информация. При преходе OnDocument(event) мне надо понять к какому документу относится текущий Content для записи данных в соответствующий массив.

Может ты можешь более наглядно (на коде) показать как его разсортировать правильно !

в случае с www.rsdn.ru Content-ты приходят в фоновой загрузке => до окончания загрузки страницы я должен собрать информацию и внести изменения.

Примерно так:

Выделить код

Код:

function OnDocument (event)
{
    var t = event. target;
    if (window. getBrowser (). getBrowserIndexForDocument (t) != -1)
    {
        // документ имеет "собственную" вкладку
        print ("tab");
    }
    else
    {
        // документ не имеет "собственную" вкладку
        // значит, это фрейм
        print ("frame in tab");
    }
}

function dnins (event)
{
    var t = event. originalTarget;
    if ((t. nodeName == "vbox") || (t. nodeName == "xul:vbox"))
    {
        // добавлена новая вкладка
        // прикрепляем элементу browser вкладки
        // обработчик DOMContentLoaded
        var b = t. getElementsByTagName ("browser") [0];
        b. addEventListener ("DOMContentLoaded", OnDocument, true);
    }
}

var tb = window. getBrowser ();
tb. addEventListener ("DOMNodeInserted", dnins, true);

В этом случае тоже непонятно к чему относится массив.

У меня есть:

Выделить код

Код:

function SavedDoc()
{
    this.Url;
//  List All Elem	
    this.listElem = new Array();
}

var listSavedDocument = new Array();

Проблемма заключается в том, как определить numSave для фрейма.
Для каждой закладки он свой

Выделить код

Код:

function OnDocument (event)
{
    try
	{
		SDoc = new SavedDoc;
	}
	catch (err) 
	{
		alert(err);
	}
    SDoc.Url = event.originalTarget.location.href;
//  номер таба
    var numSave= window.getBrowser().getBrowserIndexForDocument(event.originalTarget);
    if ((numSave >= 0) && (listSavedDocument.length < (numSave + 1)))
       listSavedDocument[numSave] = SDoc;
    var NumElem = 0;
//  numSave как его определить ?
    Fun2(event.originalTarget, numSave, NumElem);
}
function Fun2(elem, numSave, numNextElem)
{
    switch(elem.nodeName)
    {
		case 'FORM': numNextElem = GetDataForm(elem, numSave, numNextElem); break;
		case 'INPUT': numNextElem = GetDataInput(elem, numSave, numNextElem); break;
		case 'SELECT': numNextElem = GetDataSelect(elem, numSave, numNextElem); break;
    }
    for (var i=0;i<elem.childNodes.length;i++)
    {
         numNextElem = Fun2(elem.childNodes[i], numSave, numNextElem);	
    }
}

function GetDataForm(elem, numSave, numNextElem)
{
    listSavedDocument[numSave].listElem[numNextElem] = elem;
    return numNextElem;
}

Проще, наверное так:

Выделить код

Код:

function OnDocument (event)
{
    try
    {
        SDoc = new SavedDoc;
    }
    catch (err) 
    {
        alert (err);
    }
    SDoc. Url = event. originalTarget. location. href;
    var numSave= window. getBrowser (). getBrowserIndexForDocument (event. originalTarget);
    if ((numSave >= 0) && (listSavedDocument. length < (numSave + 1)))
        listSavedDocument[numSave] = new Array ();
    else
        numSave = event. currentTarget. mTab. tabIndex;
    listSavedDocument[numSave]. push (SDoc);
    var NumElem = 0;
    Fun2 (event. originalTarget, numSave, NumElem);
}

listSavedDocument [x] [0] - будет основным документом вкладки с индексом x, а listSavedDocument [x] [n] - это n-й загруженный во вкладке фрейм.

Да так пожалуй лучше будет.
у меня ругается на mTab
Ошибка: event. currentTarget. mTab has no properties

CVB пишет

...у меня ругается на mTab...

А у меня не ругается.

...Ошибка: event. currentTarget. mTab has no properties

Уверен на 99,99%, что OnDocument ставится конструкцией window. addEventListener (..., т. к. у window нет свойства mTab.

я делаю так

Выделить код

Код:

window.addEventListener("load", ext_onInit, false);
window.addEventListener("unload", ext_onDestroy, false);

function ext_onInit() 
{	
	try
	{
//		Test();
		document.addEventListener("DOMContentLoaded", OnDocument, true);
		document.addEventListener("DOMNodeRemoved", OnTabRemoved, true);
  	}
	catch (err) 
	{
		alert(err);
		return;
	}
}

А я сделал так: http://forum.mozilla.ru/viewtopic.php?pid=99949#p99949 с добавлением currentTarget (http://forum.mozilla.ru/viewtopic.php?p … 12#p100512).

Если не нравится вариант с назначением каждой вкладке обработчика DOMContentLoaded, могу посоветовать перебор (сам не пробовал)

Выделить код

Код:

var tb = window. getBrowser (); // tabbrowser
for (var i = 0; i < tb. mTabs. length; i++)
{
    t = tb. mTabs. item (i); // tab
    d = tb. getBrowserForTab (t); // document
    f = d. body. getElementsByTagName ('frame');
    for (j = 0; j < f. length; j++)
    {
        cf = f [i]; // frame
        ...

Возможно, есть другой вариант (вроде бы Mash примеры кода на эту тему приводил), но у меня других идей нет.

у меня при таком вареанте http://forum.mozilla.ru/viewtopic.php?pid=99949#p99949

Ошибка: this.getBrowserAtIndex(i) has no properties
Источник: chrome://global/content/bindings/tabbrowser.xml
Строка: 201

CVB,
у меня ошибок нет. Покажите полный код, может, что-то делаете не так ?

у меня приходит t. nodeName == 'tab' при добовлении таба

Выделить код

Код:

// Main
window.addEventListener("load", ext_onInit, false);
window.addEventListener("unload", ext_onDestroy, false);

function dnins (event)
{
    alert('In');
	alert(event. target.nodeName); // = tabbrowser
	alert(event. originalTarget.nodeName); // = tab
    var t = event. originalTarget;
//    if ((t. nodeName == "vbox") || (t. nodeName == "xul:vbox"))
    if ((t. nodeName == "tab") || (t. nodeName == "xul:vbox"))
    {
    	alert('Add');
 //        var b = t. getElementsByTagName ("browser") [0];
        t. addEventListener ("DOMContentLoaded", OnDocument, true);
    }
}

function ext_onInit() 
{	
	try
	{
	    var tb = window. getBrowser ();        
		tb. addEventListener ("DOMNodeInserted", dnins, true);
		
		document.addEventListener("DOMNodeRemoved", OnTabRemoved, true);
  	}
	catch (err) 
	{
		alert(err);
		return;
	}
}

И ещё  у меня не получилось проинициализировать первый таб в function ext_onInit()
Вот все попытки которые остались в коде

Выделить код

Код:

function dnins (event)
{
	alert('In');
	alert(event. target.nodeName);
	alert(event. originalTarget.nodeName);
    var t = event. originalTarget;
//    if ((t. nodeName == "vbox") || (t. nodeName == "xul:vbox"))
    if ((t. nodeName == "tab") || (t. nodeName == "xul:vbox"))
    {
    	alert('Add');
        // äîáàâëåíà íîâàÿ âêëàäêà
        // ïðèêðåïëÿåì ýëåìåíòó browser âêëàäêè
        // îáðàáîò÷èê DOMContentLoaded
//        var b = t. getElementsByTagName ("browser") [0];
        t. addEventListener ("DOMContentLoaded", OnDocument, true);
    }
}

function ext_onInit() 
{	
	try
	{
//		Test();
		document.addEventListener("DOMContentLoaded", OnDocument, true);
//		var c = window.getBrowser().getBrowserAtIndex(0);
//		var c = document.getElementById ("content");
//		var tb = window. getBrowser ();
//		var b = document. getElementsByTagName ("browser") [0];
//        tb. addEventListener ("DOMContentLoaded", OnDocument, true);
        
//		tb. addEventListener ("DOMNodeInserted", dnins, true);
		
		document.addEventListener("DOMNodeRemoved", OnTabRemoved, true);
  	}
	catch (err) 
	{
		alert(err);
		return;
	}
}

Пока решил эту проблемму более сложным способом.
А хотелось бы использовать более простой механизм темболее он есть.

Выделить код

Код:

var NumElem = window.getBrowser().getBrowserIndexForDocument(event. target);
	if (NumElem != -1)
	{
		SDoc.host = event. target. location. host;
		SDoc.url = '<url value="' + event. target. location. href + '"></url>';
		SDoc.url2 = event. target. location. href;
		listSavedDocument[NumElem] = new Array();
		listSavedDocument[NumElem].push(SDoc);
		ParseDocument(event. target, NumElem, 0, 0)
	}
	else
	{
//		alert(event. currentTarget. mTab. tabIndex);
//*		
		listSavedDocument[0][0].numFrame++;

		for (var i=0;i<listSavedDocument.length;i++)
		{
			if (listSavedDocument[i] != null)
			{
				var find = false;
				if (listSavedDocument[i][0].host == event. target. location. host)
				{
					for (var j=1;j<listSavedDocument[i].length;j++)
					{
						if (listSavedDocument[i][j].url == event. target. location. href)
						{
							find = true;
						}
					}
					if (find == false)
					{
						SDoc.host = event. target. location. host;
						SDoc.url = '<url value="' + event. target. location. href + '"></url>';
						SDoc.url2 = event. target. location. href;
						listSavedDocument[i].push(SDoc);
						ParseDocument(event. target, i, listSavedDocument[i].length - 1, 0)
						break;
					}
				}
			}
		}
//*/
	}

if (listSavedDocument[i][j].url == event. target. location. href)
должна быть
if (listSavedDocument[i][j].url2 == event. target. location. href)

CVB пишет

у меня приходит t. nodeName == 'tab' при добовлении таба

Выделить код

Код:

// Main
...
//    if ((t. nodeName == "vbox") || (t. nodeName == "xul:vbox"))
    if ((t. nodeName == "tab") || (t. nodeName == "xul:vbox"))
...

При добавлении новой вкладки сначала добавляется элемент tab (xul:tab в случае первой вкладки), в которых элемента browser нет, а следом - vbox (xul:hbox для первой вкладки), в которых элемент browser есть, в который и нужно добавить обработчик DOMContentLoaded. Когда управление получит обработчик события, в event. currentTarget будет ссылка на элемент browser вкладки, в которой событие произошло, а в event. target (event. originalTarget) - ссылка на документ, загрузка которого инициировала событие.

при добовлении вктадки пришол только tabbrowser и tab
с alert-ами
tabbrowser, tabbrowser
tabbrowser, tab

Нагнал немного

Выделить код

Код:

function dnins (event)
{
	alert('In');
	alert(event. originalTarget.nodeName);

Приходит (2 ивента):
1- tab
2- Ошибка: this.getBrowserAtIndex(i) has no properties
Источник: chrome://global/content/bindings/tabbrowser.xml
Строка: 201

2- Ошибка: this.getBrowserAtIndex(i) has no properties

Эта ошибка возникает при вызове getBrowserIndexForDocument (...). Где этот вызов, в OnDocument ?
Моя функция такая:

Выделить код

Код:

function OnDocument (event)
{
    var t = event. target;
    if (window. getBrowser (). getBrowserIndexForDocument (t) != -1)
    {
        // документ имеет "собственную" вкладку
        print ("tab");
    }
    else
    {
        // документ не имеет "собственную" вкладку
        // значит, это фрейм
        print ("frame in tab");
    }
}

И ошибок никаких нет. В случае фрейма индекс таба я получаю следующим образом (http://forum.mozilla.ru/viewtopic.php?p … 12#p100512):

Выделить код

Код:

event. currentTarget. mTab. tabIndex

Вот функция:

Выделить код

Код:

function dnins (event)
{
	alert('In');
//	alert(event. target.nodeName);
	alert(event. originalTarget.nodeName);
    var t = event. originalTarget;
//    if ((t. nodeName == "vbox") || (t. nodeName == "xul:vbox"))
    if ((t. nodeName == "tab") || (t. nodeName == "xul:vbox"))
    {
    	alert('Add');
        // äîáàâëåíà íîâàÿ âêëàäêà
        // ïðèêðåïëÿåì ýëåìåíòó browser âêëàäêè
        // îáðàáîò÷èê DOMContentLoaded
//        var b = t. getElementsByTagName ("browser") [0];
//        t. addEventListener ("DOMContentLoaded", OnDocument, true);
    }
}

на втором ивенте (в точке alert(event. originalTarget.nodeName);) выдается ошибка
Может как-нить с броузером связано у меня FF 1.5.0.2

CVB пишет

на втором ивенте (в точке alert(event. originalTarget.nodeName)wink выдается ошибка

Ерунда, т. к.

this.getBrowserAtIndex(i) has no properties
Источник: chrome://global/content/bindings/tabbrowser.xml
Строка: 201

Так что не в dnins функции ошибка.

Может как-нить с броузером связано у меня FF 1.5.0.2

Может, с браузером. У меня тоже 1.5.0.2. Ещё раз:

CVB пишет

this.getBrowserAtIndex(i) has no properties
Источник: chrome://global/content/bindings/tabbrowser.xml
Строка: 201

А что там, в chrome://global/content/bindings/tabbrowser.xml на 201 строке ?

Выделить код

Код:

<method name="getBrowserIndexForDocument">
        <parameter name="aDocument"/>
        <body>
          <![CDATA[
            for (var i = 0; i < this.mPanelContainer.childNodes.length; i++) {
              if (this.getBrowserAtIndex(i).contentDocument == aDocument) {
                return i;
              }
            }
            return -1;
          ]]>
        </body>
      </method>

Так что у вас с индексами табов ? Менеджер вкладок хулиганит ?

Выделить код

Код:

<method name="getBrowserIndexForDocument">
        <parameter name="aDocument"/>
        <body>
          <![CDATA[
            for (var i = 0; i < this.mPanelContainer.childNodes.length; i++) {
              if (this.getBrowserAtIndex(i).contentDocument == aDocument) {
                return i;
              }
            }
            return -1;
          ]]>
        </body>
      </method>

может ещё за экстеншинов.
у меня стоят:
Dom Inspector
TalkBack
ShowIP
Hello Word
и мой

а из-за тулбара такой глюк может быть ?
отключил ShowIP и Hello Word
таже ошибка

Может, поможет event. currentTarget. mTab. tabIndex в OnDocument. Тогда, для различения основного документа и фреймов надо будет делать что-то вроде

Выделить код

Код:

if (event. originalTarget. location. href == event. currentTarget. contentDocument. location. href)
{
    // основной документ
}
else
{
    // фрейм
}

Я говорил, что у меня ругается на mTab
Неужеле перебор единственный вареант !?

CVB пишет

а из-за тулбара такой глюк может быть ?...

Понятия не имею.

Я говорил, что у меня ругается на mTab

Что даёт alert (event. currentTarget. nodeName) ?

для такого варианта

Выделить код

Код:

document.addEventListener("DOMContentLoaded", Docc1, true);
function Docc1(event)
{
	alert(event. currentTarget.nodeName); // == #document
}

для такого

Выделить код

Код:

window. getBrowser (). addEventListener ("DOMNodeInserted", dnins, true);
document.addEventListener("DOMNodeRemoved", OnTabRemoved, true);
function dnins (event)
{
    alert(event. currentTarget.nodeName); 
}

1-й :  tabbrowser
2-й :  Ошибка: this.getBrowserAtIndex(i) has no properties
Источник: chrome://global/content/bindings/tabbrowser.xml
Строка: 201

А надо, чтобы alert (event. currentTarget. nodeName) выдавал "browser". Тогда будет mTab работать, может, и getBrowserIndexForDocument заработает.

еслиб alert (event. currentTarget. nodeName) выдавал "browser" ==>

Выделить код

Код:

var c = document.getElementById ("content");
	for (var i=0;i<c.browsers.length;i++)
	{		
		if (c.browsers[i] == event. currentTarget. nodeName)
		{
			// где i номер таба
		}
	}

Тем более, в чём проблема-то ?

В том что event. currentTarget это документ (Frame не имеет родителей).
и к какому c.browsers[i] он относится.

CVB пишет

В том что event. currentTarget это документ (Frame не имеет родителей).
и к какому c.browsers[i] он относится.

Ну вот вам мой тестовый код:

Выделить код

Код:

function OnDocument (event)
{
    alert ("currentTarget: " + event. currentTarget. nodeName); // всегда browser
    alert ("target: " + event. target);
}

function dnins (event)
{
    var t = event. originalTarget;
    if ((t. nodeName == "vbox") || (t. nodeName == "xul:vbox"))
    {
        var b = t. getElementsByTagName ("browser") [0];
        b. addEventListener ("DOMContentLoaded", OnDocument, true);
    }
}

var tb = window. getBrowser ();
tb. addEventListener ("DOMNodeInserted", dnins, true);

Работает ечли убрать остальные обработчики.
Если в OnDocument добавить alert ("tab index: " + event. currentTarget. mTab. tabIndex);
то Ошибка: event.currentTarget.mTab has no properties
Источник: chrome://get_html_info/content/get_html_info.js
Строка: 64

ну и бог с этим mTab'ом. Если event. currentTarget. nodeName == "browser", индекс можно найти перебором или по ссылке на браузер (array. indexOf), табы и фреймы различать по location. href target'ов.

Спасибо!