从Firefox的侧边栏扩展中获取当前页面的URL

问题描述:

我正在为Firefox编写一个侧边栏扩展,并且需要一种方法来获取当前页面的URL,以便我可以根据数据库检查它并显示结果。我怎样才能做到这一点?从Firefox的侧边栏扩展中获取当前页面的URL

+1

我认为这个问题是关于老派的Firefox工具条,而不是新的[栏SDK(https://developer.mozilla.org/en-US/Add-ons/SDK/Low- Level_APIs/ui_sidebar)。 – Flimm 2015-06-01 16:06:54

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; 
+5

gBrowser.contentWindow.location.href也可以工作 – 2011-11-21 13:43:10

+1

在上面的答案中,您可能需要将`Components.interfaces`替换为`Ci`。请参阅http://*.com/questions/12558983/nsisockettransportservice-using-firefox-addon-sdk获取更多内容,并在脚本的顶部添加const {Ci,components} = require(“chrome”)。 – jobin 2013-09-18 16:10:22

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

如果你需要从一个侧栏运行代码,你会的东西进入主浏览器就像Wimmel发布的一样,除了最后一行可以简化为

mainWindow.content.location.href 

(或者你可以使用API​​返回一个nsIURI)。

根据任务的不同,它可能是有意义的运行在浏览器窗口中的代码,而不是(在网页加载处理例如),那么就可以通过document.getElementById("sidebar").contentDocument.contentWindow通过content快捷方式和工具条访问当前页面。

喂,

我试图用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> 
+1

网页中的Javascript在Firefox插件中的行为与Javascript不同。当你编写网页时,“文档”是指该网页。在编写插件时,“document”指的是脚本所嵌入的XUL文档。 – MatrixFrog 2010-06-24 16:12:51

我绊了这个职位,而在寻找的答案,同样的问题。

其实我觉得这是那么容易,因为

alert(window.content.location.href) 

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

+3

这似乎工作,如果你是覆盖主浏览器窗口(browser.xul),但我不知道它是否会在其他情况下工作。 – MatrixFrog 2010-06-24 16:47:09

这似乎对做工精细我

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; 
} 

如果您只需要子域 ;

用法;

PageDomain.getDomain(); // *.com 
PageDomain.getSubDomain(); // abc.*.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; 
     } 
}