Как добавить событие «TabOpen» ко всем окнам в расширении Firefox? - PullRequest
1 голос
/ 13 октября 2009

Я пишу расширение Firefox. Я хотел бы, чтобы мой код выполнялся всякий раз, когда открывается новая вкладка.

Я пробовал это:

for (var i=0; i<Application.windows.length; i++) {
  var w = Application.windows[i];
  w.events.addListener("TabOpen", function(event){
    alert( 'tab #'+w.activeTab.index +' opened');
  });
} 

Не работает правильно, если windows.length> 1. Например, у нас два окна. Я открываю новую вкладку и запускаю события 2 раза для каждого окна. Я хочу только один вызов события для текущего окна.

Ответы [ 3 ]

2 голосов
/ 14 октября 2009

Без ТОПЛИВА: https://developer.mozilla.org/en/Code_snippets/Tabbed_browser#Notification_when_a_tab_is_added_or_removed. Мне это нравится больше, чем при использовании Application.activeWindow, поскольку при взгляде на код нет гарантии, activeWindow всегда ссылается на то же окно, в котором выполняется ваш код. (Если они отличаются друг от друга, у вас возникнут странные, трудно воспроизводимые проблемы).

Причина, по которой исходный код не работал, заключается в том, что вы, вероятно, помещаете свой код в сценарий для наложения на главное окно браузера. Такой код выполняется в каждом экземпляре окна браузера, которое открывает пользователь. Поэтому, когда вы открываете второе окно, цикл выполняется снова и добавляет второго прослушивателя для 1-го окна и первого (только) прослушивателя во 2-е окно.

1 голос
/ 13 октября 2009

Ответ на мой вопрос:

window.addEventListener('load', function(){

  var w = Application.activeWindow;
  w.events.addListener("TabOpen", function(event){
    alert( 'tab #'+w.activeTab.index +' opened');
  });

}, false);
0 голосов
/ 10 февраля 2014

ни в коем случае я не работал, я прикрепил его к gbrowser, вот как я это делаю: https://gist.github.com/Noitidart/8673632

где я прикрепляю domContentLoad я также прикрепляю TabOpen

...