Chrome扩展程序:消息传递(将DOM发送到popup.js)返回“空”

布莱恩特

我想使用Chrome扩展程序下载当前页面的DOM。我不知道为什么,但是当我进行下载时,结果只是一个带有'null'或'undefined'的文本文件,而不是DOM。我试图从吸收知识在这里这里,但我似乎无法从得到消息content.js通过对popup.js

另外,我不确定为什么确实起作用。当我阅读文档时,似乎我需要通过选择活动标签将消息从发送popup.jscontent.js

chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
    chrome.tabs.sendMessage(tabs[0].id, {message: 'getMessageFromContent'}, function(response) {
        //Code to handle response from content.js
    }
});

我当前的代码:

content.js

var page_html = DOMtoString(document);
chrome.runtime.sendMessage({method: 'downloadPageDOM', pageDOM: thisPage});

function DOMtoString(document_root) { ... }

background.js

chrome.tabs.query({currentWindow: true, active: true}, function(tab) {
    var page_html;
    chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
        if (request.message == 'downloadPageDOM')
            page_html = request.pageDOM;
        else if (request.message == 'getPageDOM')
            sendResponse(page_html);
    });
}); 

popup.js

document.addEventListener('DOMContentLoaded', function() {
    var download_button = document.getElementById('download_button');
    download_button.addEventListener('click', function() {
        chrome.runtime.sendMessage({message:'getPageDOM'}, function(response) {
            download(response, "download.html", "text/html");
        });
    });
});

function download(data, fileName, mimeType) { ... }

我觉得我对消息传递的工作方式缺少关键的了解。如果有人可以帮助我理解为什么下载的文件只是“ null”,我将不胜感激。

可汗

您过于复杂了,这会导致很多逻辑错误。

您已将后台页面设置为充当消息代理,并且内容脚本本身触发更新page_html变量。然后,弹出窗口会用另一条消息提取该数据。

请注意,在任何情况下page_html都不会包含当前标签页的数据:您正在使用最后加载的标签页覆盖此数据


您可以做的是完全切掉中间人(即background.js)。我猜您对向弹出窗口发送消息通常是个坏主意(不保证它是打开的)的事实感到困惑,但是反过来通常是安全的(您可以使其始终保持安全)。

解决方案1(差,但出于教育目的)

您的应用程序的逻辑是:一旦用户点击该按钮,创建快照的那一刻因此,与其让您的内容脚本立即执行工作,不如添加一个消息侦听器:

// content.js
chrome.runtime.onMessage(function(message, sender, sendResponse) {
  else if (request.message == 'getPageDOM')
    sendResponse(DOMtoString(document));
});

function DOMtoString(document_root) { ... }

并在弹出窗口中请求它:

// popup.js
// (Inside the click listener)
chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
  // Note that sending a message to a content script is different
  chrome.tabs.sendMessage(tabs[0].id, {message:'getPageDOM'}, function(response) {
    download(response, "download.html", "text/html");
  });
});

但是,此解决方案并非100%可靠如果内容脚本未注入到页面中,它将失败(并且可能发生)。但是有可能解决这个问题。

解决方案2

我们不假设内容脚本已注入。实际上,大多数情况下,仅当用户单击您的按钮时,您才不需要自动注入它。

因此,从清单中删除内容脚本,确保您具有主机许可权"<all_urls>"尽管考虑了activeTab许可权也可以正常工作),并使用编程注入

有一种很少使用的程序注入形式,它收集最后执行的语句的值。我们将使用它。

// content.js
DOMtoString(document); // This will be the last executed statement

function DOMtoString(document_root) { ... }

在弹出窗口中,执行脚本,收集结果:

// popup.js
// (Inside the click listener)
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
  chrome.tabs.executeScript(tabs[0].id, {file: "content.js"}, function(data) {
    // Data is an array of values, in case it was executed in multiple tabs/frames
    download(data[0], "download.html", "text/html");
  });
});

注意:以上所有均假设您的功能DOMtoString确实有效。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Chrome扩展程序:消息传递(将DOM发送到popup.js)返回“空”

来自分类Dev

Chrome扩展程序将Background.js中的消息发送到内容脚本

来自分类Dev

Chrome扩展程序创建新标签页,并将消息从popup.js发送到新标签页的内容脚本

来自分类Dev

discord.js将消息发送到特定频道

来自分类Dev

Chrome扩展程序将消息从iFrame发送到事件页面,然后再发送到内容脚本

来自分类Dev

如何将chrome扩展ID动态发送到网页以进行消息传递

来自分类Dev

从popup.js访问DOM | Chrome扩展程序

来自分类Dev

如何将数据从 content.js 发送到 popup.js?

来自分类Dev

WKWebView JavaScript将消息发送到Objective-C并返回值

来自分类Dev

将消息发送到node.js和socket.io中的单个套接字

来自分类Dev

如何将消息从js库发送到Azure SignalR Serverless中的组

来自分类Dev

Discord.js V12将数据从json文件发送到单个消息中

来自分类Dev

将消息从Node.js服务器发送到Windows计算机

来自分类Dev

TCP将消息发送到端口上的localhost-node.js

来自分类Dev

如何将消息发送到Node.js中的特定客户端

来自分类Dev

如何将消息从node.js函数发送到角度控制器

来自分类Dev

将信息从android应用程序发送到Web服务并返回

来自分类Dev

GCM不会将消息发送到notification_key并返回带有空响应正文

来自分类Dev

jQuery表单插件将空数据发送到Node.js?

来自分类Dev

将多个消息发送到Node.js tcp套接字时,它们将作为单个消息流式传输

来自分类Dev

如何将道具发送到点击处理程序 - React JS

来自分类Dev

在Chrome扩展程序的背景页面的onClick事件上将消息发送到内容脚本

来自分类Dev

将空参数发送到Sql Server

来自分类Dev

Ajax将空数组发送到php文件

来自分类Dev

Facebook将空POST发送到Webhook

来自分类Dev

Vim将空缓冲区发送到Shell

来自分类Dev

Volley将空参数发送到服务器

来自分类Dev

如何将空数据发送到组合存储

来自分类Dev

JQuery fomdata 将空数据发送到 php 文件?

Related 相关文章

  1. 1

    Chrome扩展程序:消息传递(将DOM发送到popup.js)返回“空”

  2. 2

    Chrome扩展程序将Background.js中的消息发送到内容脚本

  3. 3

    Chrome扩展程序创建新标签页,并将消息从popup.js发送到新标签页的内容脚本

  4. 4

    discord.js将消息发送到特定频道

  5. 5

    Chrome扩展程序将消息从iFrame发送到事件页面,然后再发送到内容脚本

  6. 6

    如何将chrome扩展ID动态发送到网页以进行消息传递

  7. 7

    从popup.js访问DOM | Chrome扩展程序

  8. 8

    如何将数据从 content.js 发送到 popup.js?

  9. 9

    WKWebView JavaScript将消息发送到Objective-C并返回值

  10. 10

    将消息发送到node.js和socket.io中的单个套接字

  11. 11

    如何将消息从js库发送到Azure SignalR Serverless中的组

  12. 12

    Discord.js V12将数据从json文件发送到单个消息中

  13. 13

    将消息从Node.js服务器发送到Windows计算机

  14. 14

    TCP将消息发送到端口上的localhost-node.js

  15. 15

    如何将消息发送到Node.js中的特定客户端

  16. 16

    如何将消息从node.js函数发送到角度控制器

  17. 17

    将信息从android应用程序发送到Web服务并返回

  18. 18

    GCM不会将消息发送到notification_key并返回带有空响应正文

  19. 19

    jQuery表单插件将空数据发送到Node.js?

  20. 20

    将多个消息发送到Node.js tcp套接字时,它们将作为单个消息流式传输

  21. 21

    如何将道具发送到点击处理程序 - React JS

  22. 22

    在Chrome扩展程序的背景页面的onClick事件上将消息发送到内容脚本

  23. 23

    将空参数发送到Sql Server

  24. 24

    Ajax将空数组发送到php文件

  25. 25

    Facebook将空POST发送到Webhook

  26. 26

    Vim将空缓冲区发送到Shell

  27. 27

    Volley将空参数发送到服务器

  28. 28

    如何将空数据发送到组合存储

  29. 29

    JQuery fomdata 将空数据发送到 php 文件?

热门标签

归档