Mevcut sekmenin URL'sini bir Google Chrome uzantısından nasıl alabilirim?


Yanıtlar:


218

Bunun chrome.tabs.query()gibi kullanın :

chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => {
    let url = tabs[0].url;
    // use `url` here inside the callback because it's asynchronous!
});

Bu chrome.tabs, uzantı bildiriminizde API'ya erişim istemenizi gerektirir :

"permissions": [ ...
   "tabs"
]

"Geçerli sekmeniz" tanımının, uzantınızın gereksinimlerine bağlı olarak değişebileceğini unutmayın.

lastFocusedWindow: trueKullanıcının odaklanmış penceresindeki (genellikle en üstteki pencere) geçerli sekmeye erişmek istediğinizde sorgudaki ayar uygundur.

Ayar currentWindow: true, uzantınızın kodunun şu anda yürütülmekte olduğu pencerede geçerli sekmeyi almanızı sağlar. Örneğin, uzantınız yeni bir pencere / açılır pencere (odak değiştirerek) oluşturuyor, ancak yine de uzantının çalıştırıldığı pencereden sekme bilgilerine erişmek istiyorsa bu yararlı olabilir.

lastFocusedWindow: trueBu örnekte kullanmayı seçtim , çünkü Google currentWindow her zaman bulunmayabilecek durumları söylüyor .

Burada tanımlanan özelliklerden herhangi birini kullanarak sekme sorgunuzu daha da daraltabilirsiniz: chrome.tabs.query


27
URL neden her zaman tanımsız?
nnm

2
URL tanımsızsa, uzantınızı chrome: // uzantılarından yeniden yüklemeyi deneyin Bu, uzantının yapılandırmasını yeniden yükler ve yeni eklenen "sekmeler" iznini uygular.
flashbackzoo

2
url tanımlanmamıştır çünkü stackoverflow.com/questions/28786723/… (yanıt: geliştirici araç pencerenizi kapatın veya lastFocusedWindow yerine currentWindow'a değiştirin)
kspearrin

2
Geliştirme araçları pencerem kaldırıldığında tanımsız oldum. Bunu yapmak tanımsız sorunu düzeltti.
Fisu

Bu, değişken URL'yi arayana döndürmez. Geçerli sekme url çağırana döndüren basit bir işlev url = GetCurrentTabUrl () istiyorum. Burada değişken geri arama fonksiyonunun içindedir. Başka bir işleve geçebilir ama kod yapısını akward yapar. Global değişkenleri kullanmaktan da kaçınmak istiyorum. herhangi bir fikir @thauburger?
Thierry Dalon

78

Uyarı! chrome.tabs.getSelectedkullanımdan kaldırıldı . Lütfen chrome.tabs.querydiğer cevaplarda gösterildiği gibi kullanın .


İlk olarak, manifest.json'da API izinlerini ayarlamanız gerekir:

"permissions": [
    "tabs"
]

Ve URL'yi depolamak için:

chrome.tabs.getSelected(null,function(tab) {
    var tablink = tab.url;
});

1
Sadece pop-up (sayfa eylemi, tarayıcı eylemi) için nedeni ilk parametreye bir "boş" göndermenizdir. code.google.com/chrome/extensions/tabs.html#method-getSelected Belgeler, ilk parametrenin windowId olduğunu belirtir; bunu seçeneklerde veya arka plan sayfasında kullanmak istiyorsanız, pencere kimliğini veya Geçerli sekmeyi, tanımlanmamış seçenekler, sırasıyla alırsınız.
Mohamed Mansour

1
evet çalışıyor, ancak neden chrome.tabs.getSelected yönteminin başvuru belgesinde bulunamadığından emin değilim.
swimmingfisher

Bu şey benim için çalışmıyor chrome.tabs.getSelected, tanımsız, ayrı bir soruda sorabilir miyim?
Mostafa Shahverdy

11
chrome.tabs.getSelectedYöntem kullanımdan kaldırıldı doğru yöntem listelenir cevap aşağıda bu .
Rob W

1
Ve tüm açık sekmelerin bağlantılarını alma
Enve

48

Diğer yanıtlar, bir açılır pencereden veya arka plan komut dosyasından bilmek istediğinizi varsayar.

Bir içerik komut dosyasından geçerli URL'yi bilmek istiyorsanız , standart JS yolu geçerlidir:

window.location.toString()

window.locationURL'nin ana bilgisayar, protokol veya yol gibi ayrı bölümlerine erişmek için özelliklerini kullanabilirsiniz .


1
Mükemmel cevap. Tek istediğim window.location.hostIm "stackoverflow.com" de olup olmadığını görmek oldu .
Salyangoz

1
Aslında aradığım şey buydu. Uzantı mekaniğine o kadar yakalandım ki, sayfanın URL'sini window.location.href ile yakalayabileceğinizi unuttum.
felwithe

Bu match:"<all_urls>", content_script bölümünde durum gerektirir ve Chrome, <all_urls> için tavsiye edilmez.
mcan

@Tahtakafa Hayır, değil. Bir içerik komut dosyasının zaten çalıştığını varsayar (bu sayfa veya activeTab için bir ana bilgisayar izni aracılığıyla olsun).
Xan

Bu çalıştırmak için emin olun contentScript.jsve değil background.js. URL'den filtrelediğiniz tüm verileri mesaja iletmeniz yeterlidir background.js. Örnek: let message = { type: "fetchVideoDate", id: getVideoId() };burada getVideoId()bir yürütme içerir window.location.toString(). Aksi takdirde bazı chrome://temp_background_file.htmlveriler alırsınız . Ayrıca bazen messageçağrıldığını unutmayın request.
DavidHulsman

25

Sorun chrome.tabs.getSelected eşzamansız olmasıdır. Aşağıdaki bu kod genellikle beklendiği gibi çalışmaz. 'Tablink' değeri, konsola yazıldığında hala tanımsız olacaktır çünkü getSelected değeri sıfırlayan geri aramayı henüz başlatmadı:

var tablink;
chrome.tabs.getSelected(null,function(tab) {
    tablink = tab.url;
});
console.log(tablink);

Çözüm, kodu bir işlevde kullanacağınız ve getSelected tarafından çağrılan yere sarmaktır. Bu şekilde, her zaman ayarlanmış bir değere sahip olmanız garanti edilir, çünkü kodunuzun yürütülmeden önce değerin sağlanmasını beklemesi gerekecektir.

Şuna benzer bir şey deneyin:

chrome.tabs.getSelected(null, function(tab) {
    myFunction(tab.url);
});

function myFunction(tablink) {
  // do stuff here
  console.log(tablink);
}

Kod için teşekkürler, bu benim için çalıştı, "sekmeler" manifest.json "izinler" dosyasındaki izinlere eklenmesi gerekir: ["sekmeler"]
Doug Molineux


Ve tüm açık sekmelerin bağlantılarını alma
Enve

2
Bunu denedim ama url tanımsız almak neden bu?
nnm

1

Merhaba, mevcut Siteyi bir arkadaşınıza e-posta ile gönderen bir Google Chrome Örneği. Temel fikir istediğiniz şeydir ... her şeyden önce sayfanın içeriğini getirir (sizin için ilgi göstermez) ... daha sonra URL'yi alır (<- iyi bölüm)

Buna ek olarak ben motstly Documents okuma yerine tercih güzel bir çalışma kodu örneğidir.

Burada bulunabilir: Bu sayfayı e-postayla gönder


1

Bu Çözüm zaten TEST EDİLDİ.

manifest.json içinde API için izinleri ayarlama

"permissions": [ ...
   "tabs",
    "activeTab",
    "<all_urls>"
]

İlk yükleme çağrısı fonksiyonunda. https://developer.chrome.com/extensions/tabs#event-onActivated

chrome.tabs.onActivated.addListener((activeInfo) => {  
  sendCurrentUrl()
})

Değişen çağrı fonksiyonu. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

chrome.tabs.onSelectionChanged.addListener(() => {
  sendCurrentUrl()
})

URL alma işlevi

function sendCurrentUrl() {
  chrome.tabs.getSelected(null, function(tab) {
    var tablink = tab.url
    console.log(tablink)
  })


-2

Sen kontrol etmek zorunda bu .

HTML

<button id="saveActionId"> Save </button>

manifest.json

  "permissions": [
    "activeTab",
    "tabs"
   ]

JavaScript
Aşağıdaki kod, etkin pencerenin tüm URL'lerini düğme tıklamasının bir parçası olarak JSON nesnesine kaydeder.

var saveActionButton = document.getElementById('saveActionId');
saveActionButton.addEventListener('click', function() {
    myArray = [];
    chrome.tabs.query({"currentWindow": true},  //{"windowId": targetWindow.id, "index": tabPosition});
    function (array_of_Tabs) {  //Tab tab
        arrayLength = array_of_Tabs.length;
        //alert(arrayLength);
        for (var i = 0; i < arrayLength; i++) {
            myArray.push(array_of_Tabs[i].url);
        }
        obj = JSON.parse(JSON.stringify(myArray));
    });
}, false);

URL'leri etkin pencerelere kaydetmek için krom
uzantım
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.