【问题标题】:Get current page URL from a firefox sidebar extension从 Firefox 侧边栏扩展获取当前页面 URL
【发布时间】:2010-09-29 10:51:44
【问题描述】:

我正在为 Firefox 编写侧边栏扩展,需要一种方法来获取当前页面的 URL,以便我可以对照数据库检查它并显示结果。我该怎么做?

【问题讨论】:

  • 我认为这个问题是关于老式 Firefox 侧边栏的,而不是新的 sidebar SDK。

标签: firefox url xul sidebar


【解决方案1】:

我在寻找同一问题的答案时偶然发现了这篇文章。

其实我觉得很简单

alert(window.content.location.href)

另见https://developer.mozilla.org/en/DOM/window.content

【讨论】:

  • 如果您覆盖主浏览器窗口 (browser.xul),这似乎有效,但我不知道它是否适用于其他情况。
【解决方案2】:
window.top.getBrowser().selectedBrowser.contentWindow.location.href;

可能有效,否则我认为您需要使用:

var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                   .getInterface(Components.interfaces.nsIWebNavigation)
                   .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                   .rootTreeItem
                   .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                   .getInterface(Components.interfaces.nsIDOMWindow);

mainWindow.getBrowser().selectedBrowser.contentWindow.location.href;

【讨论】:

  • 您可能需要在上述答案中的任何地方将Components.interfaces 替换为Ci。请参阅stackoverflow.com/questions/12558983/… 了解更多信息,并将const {Ci, components} = require("chrome") 添加到脚本顶部。
【解决方案3】:

这对我来说似乎很好用

function getCurrentURL(){

    var currentWindow = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser");

    var currBrowser = currentWindow.getBrowser();
    var currURL = currBrowser.currentURI.spec;

    return currURL;
}

【讨论】:

  • 您应该将function getCurrentURL(){ 和} 添加到代码布局中。它们是代码的一部分。
  • 这是一个不错的选择,因为当打开新选项卡时会获取该 URL,而 @Wimmel 则不会。谢谢。
【解决方案4】:

https://developer.mozilla.org/En/Working_with_windows_in_chrome_code

如果您需要从运行在侧边栏中的代码访问主浏览器,您将类似于 Wimmel 发布的内容,除了最后一行可以简化为

mainWindow.content.location.href

(或者,您可以使用返回 nsIURI 的 API)。

根据您的任务,在浏览器窗口中运行代码可能更有意义(例如在页面加载处理程序中),然后它可以通过content 快捷方式和边栏通过document.getElementById("sidebar").contentDocument 访问当前页面或.contentWindow。

【讨论】:

    【解决方案5】:

    如果您只需要域和子域;

    用法;

    PageDomain.getDomain(); // stackoverflow.com
    PageDomain.getSubDomain(); //  abc.stackoverflow.com
    

    代码;

    PageDomain = {
    
    getDomain : function() {
        var docum = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser");
        var domain = PageDomain.extractDomain(new String(docum.location));
        return domain;
    },
    getSubDomain : function() {
        var docum = Components.classes["@mozilla.org/appshell/window-mediator;1"].getService(Components.interfaces.nsIWindowMediator).getMostRecentWindow("navigator:browser");
        var subDomain = PageDomain.extractSubDomain(new String(docum.location));
        return subDomain;
    },
     extractDomain: function(host) {
            var s;
    
            // Credits to Chris Zarate
            host=host.replace('http:\/\/','');
            host=host.replace('https:\/\/','');
            re=new RegExp("([^/]+)");
            host=host.match(re)[1];
            host=host.split('.');
    
            if(host[2]!=null) {
              s=host[host.length-2]+'.'+host[host.length-1];
              domains='ab.ca|ac.ac|ac.at|ac.be|ac.cn|ac.il|ac.in|ac.jp|ac.kr|ac.nz|ac.th|ac.uk|ac.za|adm.br|adv.br|agro.pl|ah.cn|aid.pl|alt.za|am.br|arq.br|art.br|arts.ro|asn.au|asso.fr|asso.mc|atm.pl|auto.pl|bbs.tr|bc.ca|bio.br|biz.pl|bj.cn|br.com|cn.com|cng.br|cnt.br|co.ac|co.at|co.il|co.in|co.jp|co.kr|co.nz|co.th|co.uk|co.za|com.au|com.br|com.cn|com.ec|com.fr|com.hk|com.mm|com.mx|com.pl|com.ro|com.ru|com.sg|com.tr|com.tw|cq.cn|cri.nz|de.com|ecn.br|edu.au|edu.cn|edu.hk|edu.mm|edu.mx|edu.pl|edu.tr|edu.za|eng.br|ernet.in|esp.br|etc.br|eti.br|eu.com|eu.lv|fin.ec|firm.ro|fm.br|fot.br|fst.br|g12.br|gb.com|gb.net|gd.cn|gen.nz|gmina.pl|go.jp|go.kr|go.th|gob.mx|gov.br|gov.cn|gov.ec|gov.il|gov.in|gov.mm|gov.mx|gov.sg|gov.tr|gov.za|govt.nz|gs.cn|gsm.pl|gv.ac|gv.at|gx.cn|gz.cn|hb.cn|he.cn|hi.cn|hk.cn|hl.cn|hn.cn|hu.com|idv.tw|ind.br|inf.br|info.pl|info.ro|iwi.nz|jl.cn|jor.br|jpn.com|js.cn|k12.il|k12.tr|lel.br|ln.cn|ltd.uk|mail.pl|maori.nz|mb.ca|me.uk|med.br|med.ec|media.pl|mi.th|miasta.pl|mil.br|mil.ec|mil.nz|mil.pl|mil.tr|mil.za|mo.cn|muni.il|nb.ca|ne.jp|ne.kr|net.au|net.br|net.cn|net.ec|net.hk|net.il|net.in|net.mm|net.mx|net.nz|net.pl|net.ru|net.sg|net.th|net.tr|net.tw|net.za|nf.ca|ngo.za|nm.cn|nm.kr|no.com|nom.br|nom.pl|nom.ro|nom.za|ns.ca|nt.ca|nt.ro|ntr.br|nx.cn|odo.br|on.ca|or.ac|or.at|or.jp|or.kr|or.th|org.au|org.br|org.cn|org.ec|org.hk|org.il|org.mm|org.mx|org.nz|org.pl|org.ro|org.ru|org.sg|org.tr|org.tw|org.uk|org.za|pc.pl|pe.ca|plc.uk|ppg.br|presse.fr|priv.pl|pro.br|psc.br|psi.br|qc.ca|qc.com|qh.cn|re.kr|realestate.pl|rec.br|rec.ro|rel.pl|res.in|ru.com|sa.com|sc.cn|school.nz|school.za|se.com|se.net|sh.cn|shop.pl|sk.ca|sklep.pl|slg.br|sn.cn|sos.pl|store.ro|targi.pl|tj.cn|tm.fr|tm.mc|tm.pl|tm.ro|tm.za|tmp.br|tourism.pl|travel.pl|tur.br|turystyka.pl|tv.br|tw.cn|uk.co|uk.com|uk.net|us.com|uy.com|vet.br|web.za|web.com|www.ro|xj.cn|xz.cn|yk.ca|yn.cn|za.com';
              domains=domains.split('|');
              for(var i=0;i<domains.length;i++) {
                if(s==domains[i]) {
                  s=host[host.length-3]+'.'+s;
                  break;
                }
              }
            } else {
              s=host.join('.');
            }
            // Thanks Chris
            return s;
          },
    
          extractSubDomain:function(host){
              host=host.replace('http:\/\/','');
              host=host.replace('https:\/\/','');
              re=new RegExp("([^/]+)");
              host=host.match(re)[1];
              return host;
          }
    }
    

    【讨论】:

      【解决方案6】:

      来自 Firefox 扩展弹出窗口;

      你需要

      "permissions": [
        "activeTab"
      ]
      

      在您的清单中,或者可能是 tabs 而不是 activeTab

      async function getCurrentTabUrl(){
          let tabs = await browser.tabs.query({active: true, currentWindow: true}) ;
          return tabs[0].url ;
      }
      
      let hostUrl = await getCurrentTab();
      alert(hostUrl);
      

      【讨论】:

        【解决方案7】:

        这适用于 firefox“弹出”扩展。

        browser.tabs.query({active: true, windowId: browser.windows.WINDOW_ID_CURRENT})
            .then(tabs => browser.tabs.get(tabs[0].id))
            .then(tab => {
            console.log(tab);    
            });
        

        【讨论】:

          【解决方案8】:

          你好,

          我尝试在 JavaScript 中实现这一点,因为我的项目中也需要它,但所有三种可能的解决方案都不起作用。我还实现了一个小站点来测试它,但这也没有用。

          这里是小站的源码:

          <html>
          <head>
          <title>Test</title>
          <script type="text/javascript">
          function Fall1 () {
          
              alert(window.top.getBrowser().selectedBrowser.contentWindow.location.href);
          }
          
          function Fall2() {
          var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                             .getInterface(Components.interfaces.nsIWebNavigation)
                             .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                             .rootTreeItem
                             .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                             .getInterface(Components.interfaces.nsIDOMWindow);
          
          alert(mainWindow.getBrowser().selectedBrowser.contentWindow.location.href);
          }
          
          function Fall3() {
          alert(document.getElementById("sidebar").contentWindow.location.href);
          }
          
          </script>
          </head>
          <body>
          <form name="Probe" action="">
          
          <input type="button" value="Fall1"
          onclick="Fall1()">
          
          <input type="button" value="Fall2"
          onclick="Fall2()">
          
          <input type="button" value="Fall3"
          onclick="Fall13()">
          </form>
          </body>
          </html>
          

          【讨论】:

          • 网页中的 Javascript 与 Firefox 插件中的 Javascript 的行为方式不同。当您编写网页时,document 指的是该网页。在编写插件时,document 指的是嵌入脚本的 XUL 文档。
          猜你喜欢
          • 1970-01-01
          • 2016-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多