【问题标题】:How do i move a screenshot from an extension to a content script?如何将屏幕截图从扩展移动到内容脚本?
【发布时间】:2012-12-03 23:56:40
【问题描述】:

所以这个想法是这样的......我要做的就是在加载特定内容脚本后立即调用扩展背景页面。 (在这种情况下,当加载页面时)我的内容脚本中有类似的内容。

var port = chrome.extension.connect({name: "screenshot"});
port.postMessage({request: "screenshot"});
port.onMessage.addListener(function(msg) {
    var img = document.createElement('img');
    img.src = msg.response;
    document.body.appendChild(img);
});

在我的 background.js 页面中有类似的内容

function takeScreenshot(){
    chrome.tabs.captureVisibleTab(null, function(img) {
        return img;

    });
}
chrome.extension.onConnect.addListener(function(port) {
    console.assert(port.name == "screenshot");
    port.onMessage.addListener(function(msg) {
    if (msg.request == "screenshot"){
        port.postMessage({response: takeScreenshot() });
    }
    });
});

但我没有运气......我让图像显示在身体上,但从 takeScreenshot 返回 img 时它实际上并没有传递图像

【问题讨论】:

    标签: javascript google-chrome-extension screen-capture


    【解决方案1】:

    问题是你试图在background page中实现同步和异步事件之间的同步

    a) chrome.tabs.captureVisibleTab() 是异步的

    b) port.postMessage() 是同步的

    port.postMessage({response: takeScreenshot() }); 被调用时,它不会等待 takeScreenshot() call back 即; return img; 所以一个空的 JSON 对象被发送到 content script

    call back 返回后使用posting message 避免它

    chrome.extension.onConnect.addListener(function(port) {
        console.assert(port.name == "screenshot");
        port.onMessage.addListener(function(msg) {
        if (msg.request == "screenshot"){
            chrome.tabs.captureVisibleTab(null,{format:"jpeg",quality:100},function(img) {
            //post message only after call back return with Data URL
            port.postMessage(img);
            });
        }
        });
    });
    

    工作版演示

    ma​​nifest.json

    {
    "name":"Screen Shot Demo",
    "description":"This demonstrates Screen Shot API",
    "manifest_version":2,
    "version":"1",
    "permissions":["tabs","<all_urls>"],
    "background":{
        "scripts":["background.js"]
    },
    "content_scripts": [
        {
          "matches": ["<all_urls>"],
          "js": ["myscript.js"]
        }
      ]
    }
    

    background.js

    chrome.extension.onConnect.addListener(function(port) {
        console.assert(port.name == "screenshot");
        port.onMessage.addListener(function(msg) {
        if (msg.request == "screenshot"){
            chrome.tabs.captureVisibleTab(null,{format:"jpeg",quality:100},function(img) {
            //post message only after call back return with Data URL
            port.postMessage(img);
            });
        }
        });
    });
    

    myscript.js(内容脚本)

    var port = chrome.extension.connect({
        name: "screenshot"
    });
    port.postMessage({
        request: "screenshot"
    });
    port.onMessage.addListener(function (msg) {
        var img = document.createElement('img');
        img.src = msg;
        document.body.appendChild(img);
    });
    

    如果您需要更多信息,请告诉我。

    【讨论】:

    • 非常感谢!这似乎不是基本知识,我永远不会猜到甚至开始朝那个方向看。我唯一需要改变的是取出 {format:"jpeg",quality:100},它出于某种原因在我的 img 元素的 src 属性中放置了一个 [object Object]。
    猜你喜欢
    • 2021-04-04
    • 1970-01-01
    • 2018-04-10
    • 2014-06-23
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2022-01-16
    相关资源
    最近更新 更多