Chrome 확장 프로그램에서 현재 탭의 URL을 얻으려면 어떻게해야하나요?


답변:


218

다음 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: trueGoogle이 currentWindow 항상 존재하지 않을 수 있는 사례를 호출하기 때문에이 예에서 사용하기로 선택했습니다 .

chrome.tabs.query 여기에 정의 된 속성을 사용하여 탭 쿼리를 더 세분화 할 수 있습니다.


27
URL이 항상 정의되지 않은 이유는 무엇입니까?
nnm

2
url이 정의되어 있지 않으면 chrome : // extensions에서 확장 프로그램을 다시로드하십시오. 확장 프로그램의 구성을 다시로드하고 새로 추가 된 "탭"권한을 적용합니다.
flashbackzoo

2
URL이 있기 때문에 정의되지 stackoverflow.com/questions/28786723/... (: 가까이 개발 도구 창 또는 변경하는 대신 lastFocusedWindow의 currentWindow하는 대답이)
kspearrin

2
개발 도구 창이 도킹 해제되었을 때 정의되지 않았습니다. 도킹하면 정의되지 않은 문제가 해결되었습니다.
Fisu

호출자에게 변수 url을 반환하지 않습니다. 현재 탭 URL을 호출자에게 반환하는 간단한 함수 url = GetCurrentTabUrl ()을 원합니다. 여기서 변수는 콜백 함수 안에 있습니다. 다른 함수에 전달할 수는 있지만 코드 구조를 어색하게 만듭니다. 전역 변수 사용을 피하고 싶습니다. @thauburger 어떤 아이디어?
Thierry Dalon

78

경고! chrome.tabs.getSelected되어 사용되지 . chrome.tabs.query다른 답변에 표시된대로 사용하십시오 .


먼저 manifest.json에서 API에 대한 권한을 설정해야합니다.

"permissions": [
    "tabs"
]

그리고 URL을 저장하려면 :

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

1
팝업에 대한 이유 (페이지 작업, 브라우저 작업)는 첫 번째 매개 변수에 "널"을 전송하기 때문입니다. code.google.com/chrome/extensions/tabs.html#method-getSelected 문서의 첫 번째 매개 변수 상태가 옵션 또는 배경 페이지에서 사용하려면 창 ID를 입력하거나 현재 탭에 정의되지 않은보기 옵션이 각각 표시됩니다.
Mohamed Mansour

1
예, 작동하지만 참조 문서에서 chrome.tabs.getSelected 메소드를 찾을 수없는 이유는 확실하지 않습니다.
swimmingfisher

이 일은 저에게 효과가 없으며 chrome.tabs.getSelected정의되지 않았으므로 별도의 질문으로 물어볼 수 있습니까?
Mostafa Shahverdy

11
chrome.tabs.getSelected방법은 더 이상 사용되지 않으며 올바른 방법 이 아래 답변에 나열되어 있습니다 .
Rob W

1
열려있는 모든 탭의 링크를 얻는 방법
Enve

48

다른 답변은 팝업 또는 백그라운드 스크립트에서 알고 싶다고 가정합니다.

콘텐츠 스크립트에서 현재 URL을 알고 싶다면 표준 JS 방법이 적용됩니다.

window.location.toString()

의 속성을 사용 window.location하여 호스트, 프로토콜 또는 경로와 같은 URL의 개별 부분에 액세스 할 수 있습니다 .


1
좋은 대답입니다. 내가 원하는 것은 window.location.host"stackoverflow.com"에 있는지 여부를 확인하는 것이 었습니다.
Salyangoz

1
이것은 실제로 내가 찾던 것입니다. 확장 메커니즘에 너무 빠져서 window.location.href를 사용하여 페이지의 URL을 가져올 수 있다는 것을 잊었습니다.
felwithe

match:"<all_urls>"content_script 섹션의 상황 이 필요 하며 Chrome은 <all_urls>를 권장하지 않습니다.
mcan

@Tahtakafa 아니오, 그렇지 않습니다. 컨텐츠 스크립트가 이미 실행중인 것으로 가정합니다 (해당 페이지 또는 activeTab에 대한 호스트 권한을 통해).
Xan

에서 실행 contentScript.js하지 말고 실행 하십시오 background.js. URL에서 필터링 한 모든 데이터를에 메시지로 전달하면 background.js됩니다. 예 : let message = { type: "fetchVideoDate", id: getVideoId() };where 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 파일 "permissions"의 권한에 "tabs"를 추가해야합니다. [ "tabs"]
Doug Molineux

또한 이것은 매력처럼 작동합니다 : 팝업에서 현재 창 가져 오기 (google chrome extension)
chemark

열려있는 모든 탭의 링크를 얻는 방법
Enve

2
나는 이것을 시도했지만 URL이 정의되지 않은 이유는 무엇입니까?
nnm

1

안녕하세요. 현재 사이트를 친구에게 이메일로 보내는 Chrome 샘플이 있습니다. 기본 아이디어는 당신이 원하는 것입니다 ... 먼저 페이지의 내용을 가져옵니다 (당신을 위해 평가하지 않습니다) ... 나중에 URL을 얻습니다 (<-good part)

또한 훌륭한 작업 코드 예제입니다. 문서를 읽는 것보다 몹시 선호합니다.

여기에서 찾을 수 있습니다 : 이 페이지를 이메일로 보내기


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.google.com/webstore/detail/tabstore-plugin/…
Kanagavelu Sugumar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.