Расширения Firefox: добавление функциональности к существующим элементам Chrome XUL - PullRequest
4 голосов
/ 03 апреля 2011

Для удовольствия я пытаюсь написать расширение для Firefox.Просто очень просто.Я просмотрел учебники, которые нашел, и у меня работает базовое приложение «Hello, World».

Что я хотел бы сделать, так это добавить прослушиватель событий к существующему элементу в приложении Firefox DOM браузера (т.е. вкладки).До сих пор все ресурсы, которые я смог найти, показывают, как добавить новый элемент в приложение, а затем добавить к нему действие с помощью Javascript.Я пробовал несколько способов добавить функцию Javascript (которая, как я знаю, работает, поскольку я успешно добавил элементы с этой функцией) к существующим элементам.

Моя последняя попытка сделать это структурирована следующим образом:

<?xml version="1.0"?>
<!-- in myExtension.xul -->

<overlay  id="myExtension"
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/x-javascript">
    var tabs = document.getElementsByTagName("tabbrowser-tab")
    var len = tabs.length;
    for (var i = 0; i < len; i++) {
      tabs[i].ondblclick = function() {
        alert('bam!');
      }
    };
  </script>

</overlay>

Ничего из этого не работает.Как я уже сказал, я совершенно новичок в этом деле, и я немного вдохновился проектом выходного дня.Может быть, есть какой-то способ убедиться, что я получаю доступ к документу Chrome, а не к документу страницы? Хотя, когда я пытаюсь получить элементы страницы (то есть "p"), используя эту технику, это тоже не работает, так что это, вероятно, тупик.

[править] Чтобы попытатьсяпроясните некоторые недоразумения:

Что я подразумеваю под DOM браузера - это элементы, которые являются частью интерфейса Chrome, , а не элементы веб-страницы.Я говорю о размещении прослушивателя событий специально для элемента, который уже существует как часть пользовательского интерфейса приложения Firefox, такого как вкладка (не содержимое вкладки, а сама вкладка) или, скажем, кнопка «Домой».Я хочу переопределить поведение частей графического интерфейса приложения Firefox.

Скажем, например, что я хотел добавлять оповещение каждый раз, когда кто-то нажимал кнопку «Новая вкладка» или кнопку «Закрыть вкладку».Или, если я хотел переопределить кнопку «Перезагрузить», чтобы перенаправить в корень домена текущей вкладки, а не просто перезагрузить страницу.Это все существующие части Firefox, и я хочу переопределить их / переписать их через расширение, в частности, добавив к ним действие javascript.

[/ edit]

[sidenote] Isвстроенный JavaScript разрешен в XUL?Или это должно быть в отдельном файле? [/ Sidenote]

У кого-нибудь есть какие-либо советы по этому поводу?

Ответы [ 2 ]

4 голосов
/ 05 апреля 2011

Код JavaScript в оверлейном коде не работает, поскольку он запускается раньше, чем gbrowser содержит какие-либо вкладки.

В расширениях Firefox (или Thunderbird) вы обычно запускаете свое расширение в прослушивателе событий загрузки:

window.addEventListener("load",
                         pinfresh.init,
                         false);

Затем функции init необходимо зарегистрировать прослушиватели событий для различных событий вкладок:

  pub.init = function() {
    var container = gBrowser.tabContainer;

    container.addEventListener("TabOpen", tabOpened, false);
    container.addEventListener("TabClose", tabRemoved, false);
  };

Когда открывается новая вкладка, мы регистрируем другого прослушивателя, который вызовет перезагрузку вкладки, когда пользователь удвоитщелчки на вкладке:

  tabOpened = function(e) {
    var tab = e.target;
    tab.addEventListener("dblclick", tabDoubleClicked, false);
  }

  tabDoubleClicked = function(e) {
    gBrowser.reloadTab(e.target);
  }

Полный код выглядит следующим образом:

<overlay  id="pinfresh"
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/x-javascript">
    pinfresh = function() {
      var pub = {};

      tabOpened = function(e) {
        var tab = e.target;
        tab.addEventListener("dblclick", tabDoubleClicked, false);
      }

      tabRemoved = function(e) {
        var tab = e.target;

        tab.removeEventListener("dblclick", tabDoubleClicked, false);
      }

      tabDoubleClicked = function(e) {
        gBrowser.reloadTab(e.target);
      }

      pub.init = function() {
        var container = gBrowser.tabContainer;

        container.addEventListener("TabOpen", tabOpened, false);
        container.addEventListener("TabClose", tabRemoved, false);
      };

      return pub;
    }();

    window.addEventListener("load",
                            pinfresh.init,
                            false);

  </script>
</overlay>

Для фрагментов кода для работы со вкладками я рекомендую страницу Браузер вкладок по адресуЦентр разработки Mozilla.

Я рекомендую помещать код Javascript в отдельный файл, а не включать его в файл XUL.Ошибки во внешних файлах Javascript отображаются в консоли ошибок Firefox, что значительно упрощает отладку.

3 голосов
/ 03 апреля 2011

Чтобы получить элемент страницы текущей просматриваемой вкладки, сначала необходимо получить сам документ с помощью gBrowser.selectedBrowser.contentDocument

Так что, в основном, если у вас есть элемент <p id='test'>blah</p> и вы хотите манипулироватьэто вы можете сделать var p = gBrowser.selectedBrowser.contentDocument.getElementById('test');, а затем делать с ним все, что захотите.

Относительно «добавления прослушивателя событий к существующему элементу в DOM браузера (т.е. вкладки)», извините, но я не могуПонимаете, что вы хотите, хотите ли вы манипулировать GUI браузера (т.е. добавить кнопку на панель навигации) или вы хотите манипулировать DOM-содержимым вкладки (то есть просматриваемым сайтом)?(в основном «браузер» может означать многое:)).

...