2009-01-04 31 views
21

Tôi đang viết tiện ích mở rộng thanh bên cho Firefox và cần có cách để lấy URL của trang hiện tại để tôi có thể kiểm tra nó trên cơ sở dữ liệu và hiển thị kết quả. Tôi có thể làm cái này như thế nào?Nhận URL trang hiện tại từ tiện ích mở rộng thanh bên firefox

+1

Tôi nghĩ câu hỏi này là về thanh sidebar cũ của Firefox và không phải là [sidebar SDK] mới (https://developer.mozilla.org/en-US/Add-ons/SDK/Low- Level_APIs/ui_sidebar). – Flimm

Trả lời

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

có thể làm việc, nếu không tôi nghĩ rằng bạn cần phải sử dụng:

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 cũng hoạt động –

+1

Bạn có thể cần phải thay thế 'Components.interfaces' thành' Ci' ở mọi nơi trong câu trả lời ở trên. Tham khảo http://stackoverflow.com/questions/12558983/nsisockettransportservice-using-firefox-addon-sdk để biết thêm và cũng thêm 'const {Ci, components} = require (" chrome ")' vào đầu tập lệnh của bạn. – jobin

2

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

Nếu bạn cần truy cập vào trình duyệt chính từ mã chạy trong một bên, bạn sẽ một cái gì đó giống như những gì Wimmel đã đăng, ngoại trừ dòng cuối cùng có thể được đơn giản hóa thành

mainWindow.content.location.href 

(Hoặc bạn có thể sử dụng API trả về một nsIURI).

Tùy thuộc vào nhiệm vụ của bạn, nó có thể làm cho tinh thần để chạy mã trong cửa sổ trình duyệt để thay thế (ví dụ trong một handler tải trang), sau đó nó có thể truy cập vào trang hiện qua content shortcut và các sidebar qua document.getElementById("sidebar").contentDocument hoặc .contentWindow.

-1

Hallo,

tôi đã cố gắng thực hiện điều này trong JavaScript, bởi vì tôi cần điều đó trong dự án của tôi cũng vậy, nhưng cả ba giải pháp có thể không hoạt động. Tôi cũng đã thực hiện một trang web nhỏ để kiểm tra nó, nhưng điều này cũng không hoạt động.

Đây là mã nguồn của trang web nhỏ:

<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 trong trang web không hoạt động giống như Javascript trong trình bổ sung Firefox. Khi bạn đang viết một trang web, 'tài liệu' đề cập đến trang web đó. Khi bạn đang viết một addon, 'document' là tài liệu XUL mà kịch bản được nhúng vào. – MatrixFrog

19

Tôi loạng choạng về bưu chính này trong khi tìm kiếm một câu trả lời cho câu hỏi tương tự.

Thật sự tôi nghĩ rằng đó là dễ dàng như

alert(window.content.location.href) 

Xem thêm https://developer.mozilla.org/en/DOM/window.content

+3

Điều này dường như hoạt động nếu bạn đang che phủ cửa sổ trình duyệt chính (browser.xul) nhưng tôi không biết liệu nó có hoạt động trong các trường hợp khác hay không. – MatrixFrog

4

Điều này dường như làm việc tốt cho tôi

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

bạn nên thêm 'function getCurrentURL() {' và '}' vào bố cục mã. Chúng là một phần của mã. – dierre

+0

oops của tôi xấu - cố định nó. – Kapil

+0

+1 Mã này thực sự hoạt động, cảm ơn :) –

1

Nếu bạn chỉ cần miềnsubdomain ;

Cách sử dụng;

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

Mã;

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; 
     } 
} 
Các vấn đề liên quan