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
Trả lời
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;
gBrowser.contentWindow.location.href cũng hoạt động –
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
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
.
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>
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
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
Đ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
Đ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;
}
Nếu bạn chỉ cần miền và subdomain ;
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;
}
}
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