>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >document http://forum.mozilla-russia.org/viewtopic.php?id=9809 |
CVB > 21-04-2006 12:16:54 |
Подскажите как можно получить document выбранного таба! Выделить код Код:var saveDocument = null; document.addEventListener("DOMContentLoaded", OnDocument, true); function OnDocument(event) { // загруженный document => event. originalTarget saveDocument = event. originalTarget; ... } как определить при смене табов что это именно saveDocument ? |
CVB > 21-04-2006 12:23:09 |
Вопрос в догонку. |
Anton > 21-04-2006 14:18:06 |
Точно не помню, но, кажется, почти всё нужное есть в моём давнишнем скрипте: http://forum.mozilla.ru/viewtopic.php?pid=76627#p76627 ну и ещё, у tabbrowser есть методы getBrowserForTab, getBrowserAtIndex, getBrowserIndexForDocument и свойство mCurrentTab, а у tab есть свойства tabId, tabIndex. |
CVB > 21-04-2006 15:28:48 |
Может ты знаешь как определить к какой закладке, документу,окну относяптя документы загружающиеся через превиденный выше код! первый(main) фрейм говорит что относится к закладке 0 а остальные -1 а документ то в целом 1-н |
Anton > 21-04-2006 16:57:05 |
Назначить элементу browser каждой вкладки обработчик DOMContentLoaded - он "отловит" загрузку документа и всех его фреймов |
CVB > 21-04-2006 17:01:48 |
Он и так отлавливает загруз всех документов и фреймов но как их разобрать потом! |
Anton > 21-04-2006 17:07:55 |
CVB пишет
Если window. addEventListener, то конечно, всех. Если добавить addEventListener браузеру вкладки - он отловит только те, которые будут загружаться в этой вкладке. А фреймы и основной документ можно разобрать хотя бы по location.
Потому что не в табах они. Найти основной документ в mTabs. item'ах, а принадлежность фреймов искать через event. target. defaultView. window. location. |
CVB > 21-04-2006 17:20:52 |
У меня Экстеншин отслеживает загрузку всех Content-ов на всех имеюшихся табах и для каждого таба строит дерево требуемых элементов. Может ты можешь более наглядно (на коде) показать как его разсортировать правильно ! |
CVB > 21-04-2006 17:23:41 |
в случае с www.rsdn.ru Content-ты приходят в фоновой загрузке => до окончания загрузки страницы я должен собрать информацию и внести изменения. |
Anton > 22-04-2006 13:26:28 |
Примерно так: Выделить код Код: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); |
CVB > 24-04-2006 12:23:08 |
В этом случае тоже непонятно к чему относится массив. У меня есть: Выделить код Код: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; } |
Anton > 25-04-2006 14:10:18 |
Проще, наверное так: Выделить код Код: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-й загруженный во вкладке фрейм. |
CVB > 25-04-2006 14:32:36 |
Да так пожалуй лучше будет. |
Anton > 25-04-2006 16:23:02 |
CVB пишет
А у меня не ругается.
Уверен на 99,99%, что OnDocument ставится конструкцией window. addEventListener (..., т. к. у window нет свойства mTab. |
CVB > 25-04-2006 16:32:34 |
я делаю так Выделить код Код: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; } } |
Anton > 25-04-2006 16:46:37 |
А я сделал так: 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 примеры кода на эту тему приводил), но у меня других идей нет. |
CVB > 25-04-2006 17:29:11 |
у меня при таком вареанте http://forum.mozilla.ru/viewtopic.php?pid=99949#p99949 Ошибка: this.getBrowserAtIndex(i) has no properties |
Anton > 26-04-2006 13:03:18 |
CVB, |
CVB > 26-04-2006 13:19:32 |
у меня приходит 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; } } |
CVB > 26-04-2006 13:27:38 |
И ещё у меня не получилось проинициализировать первый таб в 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; } } } } //*/ } |
CVB > 26-04-2006 13:29:37 |
if (listSavedDocument[i][j].url == event. target. location. href) |
Anton > 26-04-2006 13:32:57 |
CVB пишет
При добавлении новой вкладки сначала добавляется элемент tab (xul:tab в случае первой вкладки), в которых элемента browser нет, а следом - vbox (xul:hbox для первой вкладки), в которых элемент browser есть, в который и нужно добавить обработчик DOMContentLoaded. Когда управление получит обработчик события, в event. currentTarget будет ссылка на элемент browser вкладки, в которой событие произошло, а в event. target (event. originalTarget) - ссылка на документ, загрузка которого инициировала событие. |
CVB > 26-04-2006 13:39:08 |
при добовлении вктадки пришол только tabbrowser и tab |
CVB > 26-04-2006 13:43:40 |
Нагнал немного Приходит (2 ивента): |
Anton > 26-04-2006 14:13:56 |
Эта ошибка возникает при вызове 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): |
CVB > 26-04-2006 14:18:36 |
Вот функция: Выделить код Код: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) выдается ошибка |
Anton > 26-04-2006 14:32:36 |
CVB пишет
Ерунда, т. к.
Так что не в dnins функции ошибка.
Может, с браузером. У меня тоже 1.5.0.2. Ещё раз: CVB пишет
А что там, в 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> Так что у вас с индексами табов ? Менеджер вкладок хулиганит ? |
CVB > 26-04-2006 14:38:01 |
Выделить код Код:<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> может ещё за экстеншинов. |
CVB > 26-04-2006 14:42:04 |
а из-за тулбара такой глюк может быть ? |
Anton > 26-04-2006 14:46:28 |
Может, поможет event. currentTarget. mTab. tabIndex в OnDocument. Тогда, для различения основного документа и фреймов надо будет делать что-то вроде Выделить код Код:if (event. originalTarget. location. href == event. currentTarget. contentDocument. location. href) { // основной документ } else { // фрейм } |
CVB > 26-04-2006 14:49:24 |
Я говорил, что у меня ругается на mTab |
Anton > 26-04-2006 14:57:11 |
CVB пишет
Понятия не имею.
Что даёт alert (event. currentTarget. nodeName) ? |
CVB > 26-04-2006 15:13:48 |
для такого варианта Выделить код Код:document.addEventListener("DOMContentLoaded", Docc1, true); function Docc1(event) { alert(event. currentTarget.nodeName); // == #document } |
CVB > 26-04-2006 15:17:09 |
для такого Выделить код Код:window. getBrowser (). addEventListener ("DOMNodeInserted", dnins, true); document.addEventListener("DOMNodeRemoved", OnTabRemoved, true); function dnins (event) { alert(event. currentTarget.nodeName); } 1-й : tabbrowser |
Anton > 26-04-2006 15:17:28 |
А надо, чтобы alert (event. currentTarget. nodeName) выдавал "browser". Тогда будет mTab работать, может, и getBrowserIndexForDocument заработает. |
CVB > 26-04-2006 15:22:33 |
еслиб 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 номер таба } } |
Anton > 26-04-2006 15:24:32 |
Тем более, в чём проблема-то ? |
CVB > 26-04-2006 15:29:41 |
В том что event. currentTarget это документ (Frame не имеет родителей). |
Anton > 26-04-2006 15:40:52 |
CVB пишет
Ну вот вам мой тестовый код: Выделить код Код: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); |
CVB > 26-04-2006 16:01:14 |
Работает ечли убрать остальные обработчики. |
Anton > 26-04-2006 16:36:26 |
ну и бог с этим mTab'ом. Если event. currentTarget. nodeName == "browser", индекс можно найти перебором или по ссылке на браузер (array. indexOf), табы и фреймы различать по location. href target'ов. |
CVB > 26-04-2006 16:40:49 |
Спасибо! |