2009-01-04 7 views
21

Ich schreibe eine Sidebar-Erweiterung für Firefox und brauche eine Möglichkeit, die URL der aktuellen Seite zu bekommen, damit ich sie gegen eine Datenbank prüfen und die Ergebnisse anzeigen kann. Wie kann ich das machen?Aktuelle Seiten-URL von einer Firefox-Sidebar-Erweiterung holen

+1

Ich denke, diese Frage nach der alten Schule ist Sidebars Firefox, und nicht der neue [Sidebar SDK] (https://developer.mozilla.org/en-US/Add-ons/SDK/Low- Level_APIs/ui_sidebar). – Flimm

Antwort

15
window.top.getBrowser().selectedBrowser.contentWindow.location.href; 

funktionieren könnte, sonst glaube ich, Sie verwenden müssen:

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 funktioniert auch –

+1

Sie müssen 'Components.interfaces' in der obigen Antwort überall auf' Ci' ersetzen. Weitere Informationen finden Sie unter http://stackoverflow.com/questions/12558983/nsisockettransportservice-using-firefox-addon-sdk. Fügen Sie außerdem 'const {Ci, components} = require (" chrome ")' an den Anfang Ihres Skripts ein. – jobin

2

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

Wenn Sie aus dem Code des Haupt-Browser zugreifen müssen in einer Sidebar ausgeführt wird, werden Sie etwas wie das, was Wimmel geschrieben hat, bis auf die letzte Zeile könnte vereinfacht werden zu

(alternativ könnten Sie die API verwenden, die ein nsIURI zurückgibt).

Je nach Aufgabe, könnte es sinnvoll sein, den Code im Browser-Fenstern laufen (zum Beispiel in einer Seitenlastaufnahmemittel), dann kann es die aktuelle Seite über die content Verknüpfung zugreifen und die Sidebar über document.getElementById("sidebar").contentDocument oder .contentWindow.

-1

Hallo,

Ich habe versucht, dies in JavaScript zu implementieren, weil ich in meinem Projekt zu müssen, dass aber alle drei möglichen Lösungen funktionierten nicht. Ich habe auch eine kleine Seite implementiert, um es zu testen, aber das hat auch nicht funktioniert. Hier

ist der Quellcode der kleinen Website:

<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 in einer Webseite verhält sich nicht wie Javascript in einem Firefox-Addon. Wenn Sie eine Webseite schreiben, bezieht sich "Dokument" auf diese Webseite. Wenn Sie ein Addon schreiben, bezieht sich "Dokument" auf das XUL-Dokument, in das das Skript eingebettet ist. – MatrixFrog

19

ich über diesen Beitrag gestolpert, während auf eine Antwort auf die gleiche Frage suchen.

Eigentlich denke ich, es ist so einfach wie

alert(window.content.location.href) 

Siehe auch https://developer.mozilla.org/en/DOM/window.content

+3

Dies scheint zu funktionieren, wenn Sie das Hauptbrowserfenster (browser.xul) überlagern, aber ich weiß nicht, ob es in anderen Fällen funktioniert. – MatrixFrog

4

Dies scheint gut für mich zu arbeiten

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

sollten Sie 'function getCurrentURL() {' und '}' zum Code-Layout hinzufügen. Sie sind Teil des Codes. – dierre

+0

oops mein schlechtes - behoben. – Kapil

+0

+1 Dieser Code funktioniert wirklich, danke :) –

1

Wenn Sie nur Domain und Subdomain ;

Verwendung;

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

Code;

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