编程语言
首页 > 编程语言> > javascript – Firefox Extensions:为现有的chrome XUL元素添加功能

javascript – Firefox Extensions:为现有的chrome XUL元素添加功能

作者:互联网

对于踢和笑,我正在尝试编写Firefox扩展.只是一个非常简单的.我已经完成了我找到的教程,并且我已经获得了基本的“Hello,World”应用程序.

我想做的是向浏览器的Firefox Application 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应用程序UI的一部分存在的元素上,例如选项卡(不是选项卡的内容,而是选项卡本身),或者说是主页按钮.我想重新定义Firefox应用程序GUI部分的行为.

比如说,每当有人点击“新标签”按钮或“关闭标签”按钮时,我想添加提醒.或者,如果我想重新定义“重新加载”按钮以重定向到当前选项卡的域的根,而不是仅重新加载页面.这些都是Firefox的现有部分,我想重新定义它们/通过扩展覆盖它们,特别是通过向它们添加javascript操作.

[/编辑]

[sidenote]是否允许在xul中嵌入javascript?或者它需要在一个单独的文件中?[/ sidenote]

有人对此有任何建议吗?谢谢.

解决方法:

覆盖代码中的javascript代码不起作用,因为它比gbrowser包含任何选项卡更早运行.

在Firefox(或Thunderbird)扩展中,您通常在加载事件侦听器中启动扩展:

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

然后,init函数需要为各种tab事件注册事件监听器:

  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开发中心使用Tab Browser页面.

我建议将Javascript代码放在自己的文件中,而不是将其包含在XUL文件中.外部Javascript文件中的错误显示在Firefox的错误控制台中,这使得调试变得更加容易.

标签:javascript,javascript-events,firefox-addon,xul
来源: https://codeday.me/bug/20190614/1237591.html