Làm cách nào tôi có thể nhận URL của tab hiện tại từ tiện ích mở rộng Google Chrome?


187

Tôi đang vui vẻ với tiện ích mở rộng của Google Chrome và tôi chỉ muốn biết làm cách nào tôi có thể lưu trữ URL của tab hiện tại trong một biến?

Câu trả lời:


215

Sử dụng chrome.tabs.query()như thế này:

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

Điều này yêu cầu bạn yêu cầu quyền truy cập vào chrome.tabsAPI trong bảng kê khai tiện ích mở rộng của bạn :

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

Điều quan trọng cần lưu ý là định nghĩa về "tab hiện tại" của bạn có thể khác nhau tùy thuộc vào nhu cầu của tiện ích mở rộng của bạn.

Đặt lastFocusedWindow: truetrong truy vấn là phù hợp khi bạn muốn truy cập tab hiện tại trong cửa sổ tập trung của người dùng (thường là cửa sổ trên cùng).

Cài đặt currentWindow: truecho phép bạn nhận tab hiện tại trong cửa sổ nơi mã của tiện ích mở rộng của bạn hiện đang thực thi. Ví dụ: điều này có thể hữu ích nếu tiện ích mở rộng của bạn tạo cửa sổ / cửa sổ bật lên mới (thay đổi tiêu điểm), nhưng vẫn muốn truy cập thông tin tab từ cửa sổ nơi tiện ích mở rộng được chạy.

Tôi đã chọn sử dụng lastFocusedWindow: truetrong ví dụ này, bởi vì Google gọi ra các trường hợp currentWindow có thể không phải lúc nào cũng có mặt .

Bạn có thể tinh chỉnh thêm truy vấn tab của mình bằng bất kỳ thuộc tính nào được xác định tại đây: chrome.tabs.query


27
Tại sao url luôn không được xác định?
nnm

2
Nếu url không được xác định, hãy thử tải lại tiện ích mở rộng của bạn từ chrome: // extend Điều này sẽ tải lại cấu hình của tiện ích mở rộng và áp dụng quyền "tab" mới được thêm.
flashbackzoo

2
url không được xác định vì stackoverflow.com/questions/28786723/ (câu trả lời: đóng cửa sổ công cụ dev của bạn hoặc thay đổi thành currentWindow thay vì lastF FocusedWindow)
kspearrin

2
Tôi đã không xác định khi cửa sổ công cụ dev của tôi không bị khóa. Docking nó đã sửa vấn đề không xác định.
Fisu

Điều này không trả lại url biến cho người gọi. Tôi muốn một url chức năng đơn giản = GetCienTabUrl () trả về url tab hiện tại cho người gọi. Ở đây biến nằm trong hàm gọi lại. Tôi có thể chuyển nó sang một hàm khác nhưng nó làm cho cấu trúc mã trở nên tốt hơn. Tôi cũng muốn tránh sử dụng các biến toàn cầu. bất kỳ ý tưởng @thauburger?
Thierry Dalon

77

Cảnh báo! chrome.tabs.getSelectedđang bị phản đối . Vui lòng sử dụng chrome.tabs.querynhư thể hiện trong các câu trả lời khác.


Trước tiên, bạn đã đặt quyền cho API trong manifest.json:

"permissions": [
    "tabs"
]

Và để lưu trữ URL:

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

1
Lý do tại sao nó chỉ dành cho cửa sổ bật lên (hành động trang, hành động trình duyệt) là vì việc bạn gửi "null" vào tham số đầu tiên. code.google.com/chrome/extensions/tabs.html#method-getSelected Các tài liệu nêu tham số đầu tiên là windowId, nếu bạn muốn sử dụng nó trong các tùy chọn hoặc trang nền, bạn sẽ cần đặt id cửa sổ hoặc bạn sẽ nhận được tab hiện tại mà bạn đang xem không xác định, tùy chọn tương ứng.
Mohamed Mansour

1
có, nó hoạt động, nhưng không chắc chắn tại sao không thể tìm thấy phương thức chrome.tabs.getSelected trong tài liệu tham khảo.
bơi lội

Điều này không làm việc cho tôi, chrome.tabs.getSelectedkhông xác định, tôi có thể hỏi nó trong một câu hỏi riêng biệt không?
Mostafa Shahverdy 21/03/13

11
Các chrome.tabs.getSelectedphương pháp đã bị phản đối, đúng phương pháp được liệt kê ở dưới đây câu trả lời .
Rob W

1
Và, làm thế nào để có được liên kết của tất cả các tab đang mở
Bắt đầu

48

Các câu trả lời khác giả sử bạn muốn biết nó từ cửa sổ bật lên hoặc tập lệnh nền.

Trong trường hợp bạn muốn biết URL hiện tại từ tập lệnh nội dung , cách áp dụng tiêu chuẩn JS:

window.location.toString()

Bạn có thể sử dụng các thuộc tính của window.locationđể truy cập các phần riêng lẻ của URL, chẳng hạn như máy chủ, giao thức hoặc đường dẫn.


1
Câu trả lời chính xác. Tất cả những gì tôi muốn là window.location.hostxem liệu Im tại "stackoverflow.com" hay không.
Salyangoz

1
Đây thực sự là những gì tôi đang tìm kiếm. Tôi đã bị cuốn vào các cơ chế mở rộng đến nỗi tôi quên rằng bạn chỉ có thể lấy URL của trang với window.location.href.
felwithe

Điều này yêu cầu match:"<all_urls>"tình huống trên phần content_script và Chrome không được giới thiệu <all_urls>.
mcan

@Tahtakafa Không, không. Nó giả sử một tập lệnh nội dung đã chạy (có thể thông qua sự cho phép của máy chủ lưu trữ cho trang đó hoặc activeTab).
Xan

Hãy chắc chắn để chạy này trong contentScript.jsvà không trong background.js. Chỉ cần chuyển bất kỳ dữ liệu nào bạn đã lọc từ URL vào tin nhắn background.js. Ví dụ: let message = { type: "fetchVideoDate", id: getVideoId() };nơi getVideoId()chứa một thực thi window.location.toString(). Nếu không, bạn sẽ nhận được một số chrome://temp_background_file.htmldữ liệu. Cũng lưu ý rằng đôi khi messageđược gọi là request.
DavidHulsman

25

Vấn đề là chrome.tabs.getSelected không đồng bộ. Mã này dưới đây thường sẽ không hoạt động như mong đợi. Giá trị của 'tablink' vẫn sẽ không được xác định khi được ghi vào bàn điều khiển vì getSelected chưa gọi lại cuộc gọi lại đặt lại giá trị:

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

Giải pháp là bọc mã nơi bạn sẽ sử dụng giá trị trong hàm và được gọi bởi getSelected. Theo cách này, bạn được đảm bảo luôn có một bộ giá trị, bởi vì mã của bạn sẽ phải chờ giá trị được cung cấp trước khi nó được thực thi.

Hãy thử một cái gì đó như:

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

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

Cảm ơn mã, điều này đã làm việc với tôi, "các tab" cần được thêm vào các quyền trong tệp manifest.json "quyền": ["tab"]
Doug Molineux

Ngoài ra, điều này hoạt động giống như một sự quyến rũ: Bắt cửa sổ hiện tại trên một cửa sổ bật lên (tiện ích mở rộng của Google chrome)
chemark

Và, làm thế nào để có được liên kết của tất cả các tab đang mở
Enve 27/07/13

2
tôi đã thử điều này nhưng nhận được url không xác định tại sao lại như vậy?
nnm

1

Xin chào, đây là Mẫu Google Chrome gửi email cho Trang web hiện tại cho bạn bè. Ý tưởng cơ bản đằng sau là những gì bạn muốn ... trước hết, nó tìm nạp nội dung của trang (không xen kẽ với bạn) ... sau đó, nó nhận được URL (<- phần tốt)

Ngoài ra, đây là một ví dụ mã làm việc tốt, mà tôi thích đọc hơn Tài liệu.

Có thể tìm thấy ở đây: Gửi email trang này


1

Giải pháp này đã được KIỂM TRA.

đặt quyền cho API trong manifest.json

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

Trên chức năng gọi tải đầu tiên. https://developer.chrome.com/extensions/tabs#event-onActivated

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

Khi thay đổi chức năng gọi. https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

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

chức năng lấy URL

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


-2

Bạn phải kiểm tra điều này .

HTML

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

manifest.json

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

JavaScript
Đoạn mã dưới đây sẽ lưu tất cả các url của cửa sổ đang hoạt động vào đối tượng JSON như một phần của nút bấm.

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

Tiện ích mở rộng chrome của tôi để lưu URL trên các cửa sổ đang hoạt động là chrome.google.com/webstore/detail/tabstore-plugin/
mẹo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.