ฉันจะรับ URL ของแท็บปัจจุบันจากส่วนขยายของ Google Chrome ได้อย่างไร


คำตอบ:


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.tabsAPI ในรายการส่วนขยายของคุณ:

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

โปรดทราบว่าคำจำกัดความของ "แท็บปัจจุบัน" ของคุณอาจแตกต่างกันไปขึ้นอยู่กับความต้องการของส่วนขยายของคุณ

การตั้งค่าlastFocusedWindow: trueในแบบสอบถามนั้นเหมาะสมเมื่อคุณต้องการเข้าถึงแท็บปัจจุบันในหน้าต่างที่ผู้ใช้โฟกัส (โดยทั่วไปคือหน้าต่างด้านบนสุด)

การตั้งค่าcurrentWindow: trueช่วยให้คุณได้รับแท็บปัจจุบันในหน้าต่างที่รหัสส่วนขยายของคุณกำลังทำงานอยู่ ตัวอย่างเช่นสิ่งนี้อาจมีประโยชน์หากส่วนขยายของคุณสร้างหน้าต่าง / ป๊อปอัปใหม่ (เปลี่ยนโฟกัส) แต่ยังคงต้องการเข้าถึงข้อมูลแท็บจากหน้าต่างที่มีการเรียกใช้ส่วนขยาย

ฉันเลือกที่จะใช้lastFocusedWindow: trueในตัวอย่างนี้เพราะ Google โทรออกในกรณีที่อาจไม่เป็นปัจจุบันcurrentWindow

คุณสามารถปรับแต่งการสืบค้นแท็บโดยใช้คุณสมบัติใด ๆ ที่กำหนดไว้ที่นี่: chrome.tabs.query


27
ทำไม URL ไม่ได้กำหนดไว้เสมอ
nnm

2
หากไม่ได้กำหนด url ลองโหลดส่วนขยายของคุณใหม่จาก chrome: // extensions สิ่งนี้จะโหลดการกำหนดค่าส่วนขยายอีกครั้งและใช้สิทธิ์ "tabs" ที่เพิ่มเข้ามาใหม่
flashbackzoo

2
url ไม่ได้กำหนดไว้เนื่องจากstackoverflow.com/questions/28786723/… (คำตอบ: ปิดหน้าต่างเครื่องมือ dev ของคุณหรือเปลี่ยนเป็น currentWindow แทน lastFocusedWindow ครั้งสุดท้าย)
kspearrin

2
ฉันไม่ได้กำหนดเมื่อหน้าต่างเครื่องมือ dev ของฉันไม่ได้ถูกปลด การเชื่อมต่อแก้ไขปัญหาที่ไม่ได้กำหนด
Fisu

สิ่งนี้จะไม่ส่งคืนตัวแปร url ไปยังผู้โทร ฉันต้องการฟังก์ชั่นอย่างง่าย url = GetCurrentTabUrl () ที่ส่งกลับ url แท็บปัจจุบันไปยังผู้เรียก นี่คือตัวแปรที่อยู่ภายในฟังก์ชั่นการโทรกลับ ฉันสามารถส่งมันไปยังฟังก์ชั่นอื่น แต่มันทำให้โครงสร้างรหัส akward ฉันต้องการหลีกเลี่ยงการใช้ตัวแปรทั่วโลก ความคิดใด ๆ @thauburger?
ธีรี่ร์ดาลอน

78

คำเตือน! chrome.tabs.getSelectedจะเลิก โปรดใช้chrome.tabs.queryตามที่แสดงในคำตอบอื่น ๆ


ก่อนอื่นคุณต้องกำหนดสิทธิ์สำหรับ API ใน manifest.json:

"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 หรือ คุณจะได้รับแท็บปัจจุบันของคุณดูซึ่งไม่ได้กำหนดตัวเลือกตามลำดับ
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
นี่คือสิ่งที่ฉันกำลังมองหา ฉันจมอยู่กับกลไกการขยายที่ฉันลืมคุณสามารถคว้า URL ของหน้าเว็บด้วย window.location.href
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() };ที่มีการดำเนินการของgetVideoId() window.location.toString()มิฉะนั้นคุณจะได้รับchrome://temp_background_file.htmlข้อมูลบางส่วน นอกจากนี้ยังทราบว่าบางครั้งเรียกว่าmessage request
DavidHulsman

25

ปัญหาคือ chrome.tabs.getSelected นั้นไม่ตรงกัน รหัสด้านล่างนี้จะไม่ทำงานตามที่คาดไว้ ค่าของ 'tablink' จะยังไม่ได้กำหนดเมื่อถูกเขียนไปยังคอนโซลเนื่องจาก getSelected ยังไม่ได้เรียกใช้การเรียกกลับที่รีเซ็ตค่า:

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 "การอนุญาต": ["แท็บ"]
Doug Molineux

นอกจากนี้ยังใช้งานได้เหมือนเสน่ห์: รับหน้าต่างปัจจุบันบนป๊อปอัป (ส่วนขยายของ Google chrome)
chemark

และวิธีการที่จะได้รับการเชื่อมโยงของแท็บที่เปิดอยู่ทั้งหมด
Enve

2
ฉันลองสิ่งนี้แล้ว แต่การได้รับ url ไม่ได้ระบุไว้ทำไมจึงเป็นเช่นนี้
nnm

1

สวัสดีนี่คือตัวอย่าง Google Chrome ที่ส่งอีเมลถึงไซต์ปัจจุบันให้เพื่อน แนวคิดพื้นฐานที่อยู่เบื้องหลังคือสิ่งที่คุณต้องการ ... ก่อนอื่นจะดึงเนื้อหาของหน้า (ไม่รบกวนคุณ) ... หลังจากนั้นจะได้รับ URL (<- ส่วนที่ดี)

นอกจากนี้มันเป็นตัวอย่างรหัสที่ใช้งานได้ดีซึ่งฉันชอบ motstly มากกว่าการอ่านเอกสาร

พบได้ที่นี่: ส่งหน้านี้ทางอีเมล


1

โซลูชันนี้ผ่านการทดสอบแล้ว

กำหนดสิทธิ์สำหรับ API ใน manifest.json

"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"
   ]

จาวาสคริปต์
รหัสด้านล่างจะบันทึก 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/
......
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.