ส่วนขยายของ Google Chrome + chrome.windows.create + window.getSelection().toString()

ฉันกำลังสร้างส่วนขยายของ Chrome ซึ่งจะคัดลอกข้อความที่เลือก/ไฮไลต์ลงในพื้นที่ข้อความ นี่คือสิ่งที่ฉันใช้จนถึงตอนนี้:

chrome.tabs.executeScript( {
    code: "window.getSelection().toString();",
}, function(selection) {
    document.getElementById("output").value = selection[0];
});

แต่ตอนนี้ฉันเปลี่ยนจาก popup.html เป็นหน้าต่างที่ฉันสร้างขึ้นแบบนี้

พื้นหลัง js:

chrome.browserAction.onClicked.addListener(function(tab) {
    chrome.windows.create({
        url: chrome.runtime.getURL("window.html"),
        type: "panel", height: 590, width:850, focused: false
        }, function(win) {
    });
});

และฉันไม่สามารถรับข้อความที่เลือกลงในหน้าต่างนี้ได้อีกต่อไป ฉันยังคัดลอก URL ปัจจุบันของแท็บที่ใช้งานอยู่ด้วย:

chrome.tabs.getSelected(windowId, function(tab) {
    document.getElementById('url').innerHTML = tab.url;
    var windowId = tab.id
});

และฉันสามารถทำให้สิ่งนี้ใช้ได้กับหน้าต่างใหม่โดยใช้:

chrome.tabs.query({'active': true, 'lastFocusedWindow': true}, function (tabs) {
    document.getElementById('url').innerHTML = tabs[0].url;
});

ดังนั้นคำถามของฉันคือ: ฉันจะนำข้อความที่เลือก/ไฮไลต์ลงในพื้นที่ข้อความภายในหน้าต่างที่สร้างขึ้นใหม่ของฉันได้อย่างไร มีอะไรที่คล้ายกับ

chrome.tabs.query() 

เพียงเพื่อเน้นข้อความใช่ไหม


person rekalar    schedule 17.01.2017    source แหล่งที่มา


คำตอบ (1)


ใช้พารามิเตอร์ tabId ของExecuteScript เพื่อแทรกลงในแท็บที่ถูกคลิก จากนั้นส่งข้อความโดยใช้สิ่งใดสิ่งหนึ่งต่อไปนี้:

  • การส่งข้อความ
  • chrome.storage.local
  • encodeURIComponent ใน URL: 'window.html?url=' + encodeURIComponent(text)
    จากนั้นใน window.js ให้ใช้ decodeURIComponent
  • localStorage พื้นที่เก็บข้อมูลซิงโครนัสแบบคลาสสิกที่ใช้ร่วมกันระหว่างหน้าส่วนขยายภายในทั้งหมด ในกรณีที่คุณต้องการให้ผลลัพธ์ปรากฏในการแสดงผลหน้าแรกโดยไม่เกิดความล่าช้า/การสั่นไหว และไม่ต้องการส่งข้อความใน URL

นี่คือตัวอย่างสำหรับ localStorage

  • พื้นหลัง js:

    chrome.browserAction.onClicked.addListener(function(tab) {
        getSelectedText(tab.id, function(text) {
            localStorage.selectedText = text;
            chrome.windows.create({
                url: "/window.html",
                type: "panel", height: 590, width:850, focused: false
            });
        });
    });
    
    function getSelectedText(tabId, cb) {
        chrome.tabs.executeScript(tabId, {
            code: "window.getSelection().toString();",
        }, function(selection) {
            cb(selection[0]);
        });
    }
    
  • หน้าต่าง.html:

            .................
            <script src="window.js"></script>
        </body>
    </html>
    
  • หน้าต่าง js:

    document.getElementById('url').textContent = localStorage.selectedText || '';
    delete localStorage.selectedText;
    
person wOxxOm    schedule 17.01.2017
comment
ขอบคุณ! นี่คือสิ่งที่ฉันต้องการ - person rekalar; 18.01.2017