Google Chrome拡張機能から現在のタブのURLを取得するにはどうすればよいですか?


回答:


215

chrome.tabs.query()このように使用します:

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

これにはchrome.tabs拡張マニフェストで API へのアクセスをリクエストする必要があります。

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

「現在のタブ」の定義は、拡張機能のニーズによって異なる場合があることに注意することが重要です。

lastFocusedWindow: trueクエリの設定は、ユーザーのフォーカスされたウィンドウ(通常は最上位のウィンドウ)の現在のタブにアクセスする場合に適しています。

設定currentWindow: trueにより、拡張機能のコードが現在実行されているウィンドウの現在のタブを取得できます。たとえば、拡張機能が新しいウィンドウ/ポップアップを作成し(フォーカスを変更)、それでも拡張機能が実行されたウィンドウからタブ情報にアクセスする必要がある場合に、これは役立ちます。

lastFocusedWindow: trueこの例で使用することを選択したのは、GoogleがcurrentWindow 常に存在するとは限らないケースを呼び出すためです。

ここで定義されているプロパティのいずれかを使用して、タブクエリをさらに自由に調整できます:chrome.tabs.query


27
なぜURLが常に未定義なのですか?
nnm 2014年

2
URLが定義されていない場合は、拡張機能をchrome:// extensionsから再読み込みしてみてください。これにより、拡張機能の設定が再読み込みされ、新しく追加された「タブ」権限が適用されます。
flashbackzoo

2
stackoverflow.com/questions/28786723/…(回答:開発ツールウィンドウを閉じるか、lastFocusedWindowではなくcurrentWindowに変更する)ため、URLは未定義
kspearrin

2
開発ツールウィンドウがドッキング解除されたときに、未定義になりました。ドッキングすると、未定義の問題が修正されました。
Fisu

これは、変数のURLを呼び出し元に返しません。現在のタブのURLを呼び出し元に返す単純な関数url = GetCurrentTabUrl()が欲しいのですが。ここで、変数はコールバック関数内にあります。別の関数に渡すことはできますが、コード構造が扱いにくくなります。また、グローバル変数の使用も避けたいです。@thauburger?
ティエリーダロン

77

警告!chrome.tabs.getSelectedされる非推奨chrome.tabs.query他の回答にあるようにご利用ください。


まず、manifest.jsonでAPIの権限を設定する必要があります。

"permissions": [
    "tabs"
]

そしてURLを保存するには:

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

1
これがポップアップ(ページアクション、ブラウザアクション)専用である理由は、最初のパラメータに「null」を送信するためです。code.google.com/chrome/extensions/tabs.html#method-getSelected ドキュメントには、最初のパラメータがwindowIdであると記載されています。オプションまたはバックグラウンドページでそれを使用する場合は、ウィンドウIDまたは未定義の現在のタブ表示オプションをそれぞれ取得します。
モハメドマンスール

1
はい、動作しますが、参照ドキュメントにchrome.tabs.getSelectedメソッドが見つからない理由はわかりません。
スイム

これは私にとってはうまくchrome.tabs.getSelectedいきません、未定義です、別の質問で尋ねるべきでしょうか?
Mostafa Shahverdy 2013年

11
chrome.tabs.getSelectedこの方法は、正しい方法がに記載されてい、廃止されました。この下の答え
Rob W

1
そして、すべての開いているタブのリンクを取得する方法
Enve

48

他の回答では、ポップアップまたはバックグラウンドスクリプトからそれを知りたいと想定しています。

コンテンツスクリプトから現在のURLを知りたい場合は、標準のJS方法が適用されます。

window.location.toString()

のプロパティを使用してwindow.location、ホスト、プロトコル、パスなど、URLの個々の部分にアクセスできます。


1
すばらしい答えです。私が欲しかったのはwindow.location.host、Imが "stackoverflow.com"にいるかどうかを確認することだけでした。
Salyangoz 2017

1
これは実際に私が探していたものです。拡張機能の仕組みに夢中だったので、window.location.hrefを使用してページのURLを取得できることを忘れていました。
felwithe 2018年

これにはmatch:"<all_urls>"content_scriptセクションの状況が必要であり、Chromeは<all_urls>を推奨していません。
mcan 2018年

@Tahtakafaいいえ、ありません。これは、コンテンツスクリプトがすでに実行されていることを前提としています(そのページまたはactiveTabのホスト権限によるもの)。
Xan

これを内contentScript.jsではなく必ず実行してくださいbackground.js。フィルタリングしたデータをURLからメッセージに渡すだけですbackground.js。例:let message = { type: "fetchVideoDate", id: getVideoId() };getVideoId()はの実行が含まれますwindow.location.toString()。それ以外の場合は、いくつかのchrome://temp_background_file.htmlデータを取得します。messageがと呼ばれることもありrequestます。
DavidHulsman

25

問題は、chrome.tabs.getSelectedが非同期であることです。以下のこのコードは通常、期待どおりに機能しません。getSelectedが値をリセットするコールバックをまだ呼び出していないため、 'tablink'の値はコンソールに書き込まれるときに未定義のままになります。

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

解決策は、関数で値を使用するコードをラップし、getSelectedによって呼び出されるようにすることです。この方法では、コードは実行される前に値が提供されるのを待つ必要があるため、常に値が設定されていることが保証されます。

次のようなものを試してください:

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

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

コードのおかげで、これは私にとってはうまく
いきました。manifest.json

また、これは魅力のように機能します
chemark 2013年

また、開いているすべてのタブのリンクを取得する方法
Enve

2
私はこれを試しましたが、URLが未定義になっているのはなぜですか?
nnm 2014年

1

こんにちは、Google Chromeのサンプルで、現在のサイトを友達にメールで送信しています。背後にある基本的な考え方はあなたが望むものです...まず第一にそれはページのコンテンツをフェッチします(あなたのために興味をそそるものではありません)...その後、それはURLを取得します(<-良い部分)

さらに、それはドキュメントを読むよりも私が好きなように動作する素晴らしいコード例です。

ここで見つけることができます: このページをメールで送信


1

このソリューションはすでにテスト済みです。

manifest.jsonでAPIの権限を設定する

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

最初のロード呼び出し関数。https://developer.chrome.com/extensions/tabs#event-onActivated

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

変更呼び出し機能。https://developer.chrome.com/extensions/tabs#event-onSelectionChanged

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

URLを取得する関数

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


-2

これを確認する必要があります

HTML

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

manifest.json

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

JavaScript
以下のコードは、アクティブなウィンドウのすべてのURLをボタンクリックの一部としてJSONオブジェクトに保存します。

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を保存するための私のChrome
10/8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.