Chrome 扩展 - 获取当前选项卡的全部文本内容

发布于 2024-12-21 05:40:15 字数 1045 浏览 0 评论 0 原文

我正在开发一个扩展,我需要获取当前选项卡上的整个文本内容。现在我有一个插件可以从当前选项卡中检索选定的文本。所以,本质上我正在寻找它的 ctrl-A 版本:)。这就是我到目前为止根据@Derek 的提示所做的事情。

这是在我的事件处理程序中(这只是一个,还有其他侦听器用于 onUpdated 等):

chrome.tabs.onSelectionChanged.addListener(function(tabId,changeInfo,tab) {
  chrome.tabs.getSelected(null,function(tab) {
    chrome.tabs.sendRequest(tab.id, {method: "getSelection"}, function (response) {
      selectedtext = response.data;
    });
    chrome.tabs.sendRequest(tab.id, {method: "getText"}, function (response) {
      alltext = response.data;
    });
  });
});

这是我在内容脚本中编写的内容:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method == "getSelection")
    sendResponse({data: window.getSelection().toString()});
  else if (request.method == "getText")
    sendResponse({data: document.body.innerText});
  else 
    sendResponse({});
});

但是 document.body. innerText 返回未定义。我需要 alltext 中当前选项卡的完整文本。有人可以帮我解决这个问题吗? 谢谢。

I'm developing an extension where I need to get the entire text content on the current tab. Now I've a plugin which retrieves selected text from the current tab. So, in essence I'm looking for the ctrl-A version of it :). This is what I've done so far taking the hint from @Derek.

This is in my event handler(this is just one, there are other listeners too for onUpdated etc):

chrome.tabs.onSelectionChanged.addListener(function(tabId,changeInfo,tab) {
  chrome.tabs.getSelected(null,function(tab) {
    chrome.tabs.sendRequest(tab.id, {method: "getSelection"}, function (response) {
      selectedtext = response.data;
    });
    chrome.tabs.sendRequest(tab.id, {method: "getText"}, function (response) {
      alltext = response.data;
    });
  });
});

This is what I've written in the content script:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
  if (request.method == "getSelection")
    sendResponse({data: window.getSelection().toString()});
  else if (request.method == "getText")
    sendResponse({data: document.body.innerText});
  else 
    sendResponse({});
});

However the document.body.innerText is returning undefined. I need the entire text of the current tab in alltext. Can someone help me out on this?
Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

七婞 2024-12-28 05:40:15

您可以使用 document.body.innerTextdocument.all[0].innerText内容脚本
它将获取页面中的所有文本内容,无需任何 HTML 代码。

或者您可以使用 document.all[0].outerHTML 获取整个页面的 HTML。


示例

在内容脚本中

function getText(){
    return document.body.innerText
}
function getHTML(){
    return document.body.outerHTML
}
console.log(getText());             //Gives you all the text on the page
console.log(getHTML());             //Gives you the whole HTML of the page

添加

因此您希望内容脚本将文本返回到弹出窗口。您可以使用:

  • chrome.tabs.getSelected 来选择选项卡,
  • chrome.tabs.sendRequest 将请求发送到内容脚本,
  • 以及 chrome.extension。 onRequest.addListener 监听请求。

弹出页面

chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, {method: "getText"}, function(response) {
        if(response.method=="getText"){
            alltext = response.data;
        }
    });
});

内容脚本

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {
        if(request.method == "getText"){
            sendResponse({data: document.all[0].innerText, method: "getText"}); //same as innerText
        }
    }
);

这应该可行。

You can use document.body.innerText or document.all[0].innerText to do it in the content script.
It will get all the text content in the page, without any HTML code.

Or you can use document.all[0].outerHTML to get the HTML of the whole page.


Example

In the Content Script

function getText(){
    return document.body.innerText
}
function getHTML(){
    return document.body.outerHTML
}
console.log(getText());             //Gives you all the text on the page
console.log(getHTML());             //Gives you the whole HTML of the page

Added

So you want the content script to return the text to the popup. You can use:

  • chrome.tabs.getSelected to get the tab selected,
  • chrome.tabs.sendRequest to send request to the content script,
  • and chrome.extension.onRequest.addListener to listen to requests.

Popup page

chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, {method: "getText"}, function(response) {
        if(response.method=="getText"){
            alltext = response.data;
        }
    });
});

Content Script

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) {
        if(request.method == "getText"){
            sendResponse({data: document.all[0].innerText, method: "getText"}); //same as innerText
        }
    }
);

This should work.

海夕 2024-12-28 05:40:15

使用 executeScript:(需要权限 activeTab

chrome.tabs.executeScript(null, {
    code: `document.all[0].innerText`,
    allFrames: false, // this is the default
    runAt: 'document_start', // default is document_idle. See https://stackoverflow.com/q/42509273 for more details.
}, function(results) {
    // results.length must be 1
    var result = results[0];
    process_result(result);
});

如果代码很复杂,可以在内容脚本中定义一个函数并在代码中调用该函数(或使用文件)。

Use executeScript: (requires permission activeTab)

chrome.tabs.executeScript(null, {
    code: `document.all[0].innerText`,
    allFrames: false, // this is the default
    runAt: 'document_start', // default is document_idle. See https://stackoverflow.com/q/42509273 for more details.
}, function(results) {
    // results.length must be 1
    var result = results[0];
    process_result(result);
});

In case the code is complex, it's possible to define a function in the content script and call that function in the code (or use file).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文