Bagaimana saya bisa mendapatkan URL tab saat ini dari ekstensi Google Chrome?


Jawaban:


219

Gunakan chrome.tabs.query()seperti ini:

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

Ini mengharuskan Anda meminta akses ke chrome.tabsAPI di manifes ekstensi Anda :

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

Penting untuk dicatat bahwa definisi "tab saat ini" Anda mungkin berbeda tergantung pada kebutuhan ekstensi Anda.

Pengaturan lastFocusedWindow: truedalam kueri sesuai ketika Anda ingin mengakses tab saat ini di jendela fokus pengguna (biasanya jendela paling atas).

Pengaturan currentWindow: truememungkinkan Anda untuk mendapatkan tab saat ini di jendela tempat kode ekstensi Anda sedang dieksekusi. Misalnya, ini mungkin berguna jika ekstensi Anda membuat jendela / jendela baru (mengubah fokus), tetapi masih ingin mengakses informasi tab dari jendela tempat ekstensi dijalankan.

Saya memilih untuk menggunakan lastFocusedWindow: truedalam contoh ini, karena Google menyebut kasus-kasus yang currentWindow mungkin tidak selalu ada .

Anda bebas untuk lebih mempersempit kueri tab Anda menggunakan salah satu properti yang didefinisikan di sini: chrome.tabs.query


27
Mengapa url selalu tidak terdefinisi?
nnm

2
Jika url tidak ditentukan, coba muat ulang ekstensi Anda dari chrome: // extensions Ini akan memuat ulang konfigurasi ekstensi dan menerapkan izin "tab" yang baru ditambahkan.
flashbackzoo

2
url tidak terdefinisi karena stackoverflow.com/questions/28786723/… (jawab: tutup jendela alat dev Anda atau ubah ke currentWindow alih-alih lastFocusedWindow)
kspearrin

2
Saya tidak terdefinisi ketika jendela alat dev saya dibatalkan. Docking itu memperbaiki masalah yang tidak ditentukan.
Fisu

Ini tidak mengembalikan url variabel ke pemanggil. Saya ingin url fungsi sederhana = GetCurrentTabUrl () yang mengembalikan url tab saat ini ke pemanggil. Di sini variabelnya ada di dalam fungsi callback. Saya dapat meneruskannya ke fungsi lain tetapi membuat struktur kode akward. Saya juga ingin menghindari penggunaan variabel global. ada ide @thuburger?
Thierry Dalon

78

Peringatan! chrome.tabs.getSelectedsudah usang . Silakan gunakan chrome.tabs.queryseperti yang ditunjukkan pada jawaban lain.


Pertama, Anda harus mengatur izin untuk API di manifes.json:

"permissions": [
    "tabs"
]

Dan untuk menyimpan URL:

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

1
Alasan mengapa ini hanya untuk popup (tindakan halaman, tindakan browser) adalah karena pengiriman Anda dalam "null" ke dalam parameter pertama. code.google.com/chrome/extensions/tabs.html#method-getSelected Dokumen menyatakan parameter pertama adalah windowId, jika Anda ingin menggunakannya dalam opsi, atau halaman latar belakang, Anda harus memasukkan id jendela atau Anda akan mendapatkan tab saat ini yang Anda lihat yang tidak ditentukan, masing-masing pilihan.
Mohamed Mansour

1
ya itu berfungsi, tetapi tidak yakin mengapa metode chrome.tabs.getSelected tidak dapat ditemukan dalam dokumen referensi.
swimmingfisher

Hal ini tidak berfungsi untuk saya, chrome.tabs.getSelectedtidak terdefinisi, haruskah saya menanyakannya dalam pertanyaan terpisah?
Mostafa Shahverdy

11
The chrome.tabs.getSelectedMetode telah usang, metode yang benar tercantum di bawah ini jawabannya .
Rob W

1
Dan, bagaimana cara mendapatkan tautan dari semua tab yang terbuka
Enve

48

Jawaban lain menganggap Anda ingin mengetahuinya dari munculan atau skrip latar belakang.

Jika Anda ingin mengetahui URL saat ini dari skrip konten , cara JS standar berlaku:

window.location.toString()

Anda dapat menggunakan properti window.locationuntuk mengakses setiap bagian dari URL, seperti host, protokol, atau jalur.


1
Jawaban yang bagus Yang saya inginkan adalah window.location.hostmelihat apakah saya di "stackoverflow.com" atau tidak.
Salyangoz

1
Ini sebenarnya yang saya cari. Saya begitu terjebak dalam mekanika ekstensi sehingga saya lupa Anda bisa mengambil URL halaman dengan window.location.href.
felwithe

Ini memerlukan match:"<all_urls>"situasi di bagian content_script dan Chrome tidak merekomendasikan <all_urls>.
mcan

@Tahtakafa Tidak, tidak. Itu mengasumsikan skrip konten sudah berjalan (baik itu melalui izin host untuk halaman itu atau activeTab).
Xan

Pastikan untuk menjalankan ini di contentScript.jsdan bukan di background.js. Cukup kirimkan data apa pun yang telah Anda filter dari URL ke dalam pesan background.js. Contoh: di let message = { type: "fetchVideoDate", id: getVideoId() };mana getVideoId()berisi eksekusi window.location.toString(). Kalau tidak, Anda akan mendapatkan beberapa chrome://temp_background_file.htmldata. Perhatikan juga bahwa kadang-kadang messagedisebut request.
DavidHulsman

25

Masalahnya adalah chrome.tabs.getSelected asynchronous. Kode di bawah ini umumnya tidak akan berfungsi seperti yang diharapkan. Nilai 'tablink' akan tetap tidak terdefinisi saat ditulis ke konsol karena getSelected belum memanggil panggilan balik yang menyetel ulang nilai:

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

Solusinya adalah dengan membungkus kode di mana Anda akan menggunakan nilai dalam suatu fungsi dan meminta itu dipanggil oleh getSelected. Dengan cara ini Anda dijamin akan selalu memiliki nilai yang ditetapkan, karena kode Anda harus menunggu nilai diberikan sebelum dieksekusi.

Coba sesuatu seperti:

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

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

Terima kasih untuk kodenya, ini berfungsi untuk saya, "tab" perlu ditambahkan ke izin di file manifest.json "izin": ["tabs"]
Doug Molineux


Dan, bagaimana cara mendapatkan tautan dari semua tab yang terbuka
Enve

2
saya mencoba ini tetapi mendapatkan url tidak jelas mengapa ini
nnm

1

Hai di sini adalah Sampel Google Chrome yang mengirimkan email ke Situs saat ini kepada seorang teman. Ide dasar di belakang adalah apa yang Anda inginkan ... pertama-tama ia mengambil konten halaman (bukan untuk Anda) ... kemudian mendapatkan URL (<- bagian yang baik)

Selain itu itu adalah contoh kode kerja yang bagus, yang saya lebih suka motstly daripada membaca Dokumen.

Dapat ditemukan di sini: Email halaman ini


1

Solusi ini sudah DIUJI.

setel izin untuk API di manifest.json

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

Pada fungsi panggilan beban pertama. https://developer.chrome.com/extensions/tabs#event-onActivated

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

Di ubah fungsi panggilan. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

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

fungsi untuk mendapatkan URL

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


-2

Anda harus memeriksa ini .

HTML

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

manifes. json

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

JavaScript
Kode di bawah ini akan menyimpan semua url jendela aktif ke objek JSON sebagai bagian dari klik tombol.

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

Ekstensi chrome saya untuk menyimpan URL di windows aktif adalah chrome.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.