Расширение Chrome: Как получить URL текущей веб-страницы из background.html - PullRequest
8 голосов
/ 23 июня 2011

Насколько я знаю, это невозможно сделать напрямую, получив tab.url (возможно только в popup.html), а для передачи сообщений также необходимо открыть popup.html.В любом случае можно обойти это и получить URL текущей страницы из background.html?

Мой лучший снимок был с передачей сообщений, который я использовал этот код в background.html

var bg = chrome.extension.getPopupPage(); 
var myURL = bg.myURL; 

тогдав popup.html у меня было:

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

В любом случае вышеприведенное не работает вообще.Кто-нибудь знает способ сделать это, не открывая всплывающее окно?

Ответы [ 4 ]

18 голосов
/ 23 июня 2011

chrome.tabs.query поддерживается на фоновых страницах, конечно, если у вас есть разрешение tabs.Это поддерживаемый маршрут начиная с Chrome 19.

chrome.tabs.query({
  active: true,
  currentWindow: true
}, function(tabs) {
  var tab = tabs[0];
  var url = tab.url;
});

Обратите внимание, что currentWindow необходим, потому что в противном случае он вернул бы активную вкладку для каждого окна.Это должно гарантировать только одну вкладку.

Конечно, имейте в виду, что это асинхронный API - вы не можете получить доступ к любым данным, которые он предоставляет, кроме как из функции обратного вызова.Вы можете хранить значения (например, url здесь) в более широкой области видимости, чтобы другая функция могла получить к ней доступ, но это будет обеспечивать правильный результат только после выполнения обратного вызова.


(Ниже приведен мой первоначальный ответ, сохраненный для потомков - этот метод больше не нужен, требует постоянно работающей фоновой страницы, а getSelected() устарел.)

Сначала поместите его в background.htmlи сделайте переменную myURL глобальной:

var myURL = "about:blank"; // A default url just in case below code doesn't work
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { // onUpdated should fire when the selected tab is changed or a link is clicked 
    chrome.tabs.getSelected(null, function(tab) {
        myURL = tab.url;
    });
});

Затем запустите ее в popup.html, когда вы хотите получить URL страницы:

chrome.extension.getBackgroundPage().myURL;

Так что если бы я сделал так, чтобы это появилось внутривсплывающее окно и я зашел в Google и нажал на вашу страницу или в браузере, я увижу http://google.com/webhp во всплывающем окне.

2 голосов
/ 02 мая 2013

Увидев этот пост, я почувствовал, что должен быть способ пометить обсуждение как "устаревшее".

Причины ...

Этот вопрос необходимо перенести в манифест v2 и...Ответы оба не работают.Я использую select onchange и публикую URL текущей вкладки, который не работает.

Возможно, все это работает в манифесте v1.

Мой ответ ...

var myURL = "not set yet";
window.addEventListener('load', function () {
    chrome.tabs.getSelected(null,function(tab){
        myURL=tab.url;
    });     
1 голос
/ 23 июня 2011
chrome.tabs.getSelected(null, function(tab) {
  var myURL = tab.url;
});

Не понимаю, приведенный выше код можно использовать на фоновой странице для получения URL текущей вкладки.

0 голосов
/ 07 августа 2014

Это немного больше работы, но работает как шарм ...

Я бы использовал скрипт контента;это относительно просто и позволяет получить любую информацию с текущей страницы, которую вы можете захотеть.Сделайте так, чтобы фоновая страница «внедрила» скрипт в текущую веб-страницу, чтобы собрать необходимую информацию.Затем скрипт просто передает его обратно в фон.

background.js:

// Icon is clicked and triggers content script to be injected into current webpage
chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.executeScript(null, { file: 'inject.js' });
});

// Listens for message back from content script and then runs
chrome.runtime.onMessage.addListener(function (request) {
    var URL = request.url;
});

inject.js (скрипт содержимого):

// Gathers up in the information that you need from webpage
var pageInfo = {
  "url": window.location.href
};

// Sends the information back to background.js
chrome.runtime.sendMessage(pageInfo);

Надеюсь, это поможеткто-то!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...