在 Google Docs 中捕获文本选择
Posted
技术标签:
【中文标题】在 Google Docs 中捕获文本选择【英文标题】:Capture text selection in Google Docs 【发布时间】:2017-05-16 02:33:47 【问题描述】:我正在编写一个 Chrome 扩展程序来捕获用户文本选择并将所选文本发送到 Google 搜索。
manifest.json
"manifest_version": 2,
"name": "Selection Extension",
"description": "Search your selected text",
"version": "1.0",
"permissions": [
"tabs",
"http://*/*",
"https://*/*"
],
"background":
"scripts": [
"background.js"
],
"persistent": false
,
"browser_action":
"default_icon": "icon.png",
"default_title": "Mark it!!"
,
"content_scripts": [
"matches": ["<all_urls>"],
"js": ["content_script.js"]
]
content_script.js
chrome.extension.onMessage.addListener(function(request, sender, sendResponse)
if (request.method == "getSelection")
sendResponse(data: window.getSelection().toString());
else
sendResponse();
);
background.js
function initBackground()
chrome.browserAction.onClicked.addListener(function(tab)
chrome.tabs.sendMessage(tab.id, method: "getSelection", function(response)
sendServiceRequest(response.data);
);
);
function sendServiceRequest(selectedText)
var serviceCall = 'http://www.google.com/search?q=' + selectedText;
chrome.tabs.create(url: serviceCall);
initBackground();
此代码适用于网页(例如 Gmail、Facebook、新闻)中的选择。
我还希望能够在 PDF 和 Google Docs(在浏览器中查看)中获得选择。
在这些情况下:window.getSelection
返回一个空字符串...
有人知道怎么做吗?
【问题讨论】:
谢谢你!我将删除 executeScript。 对于 google-docs,有一个带有“kix-selection-overlay”类的 html 元素。此类是创建选择外观(即青色背景)的实际 div。但它无论如何都没有连接到包含文本的 div... 关于PDF:***.com/questions/15527095/… @Makyen 在这种情况下最小、完整和可验证的例子是唯一的window.getSelection().toString()
。
This video tutorial 几乎完全符合您的要求。
【参考方案1】:
Google Docs 文档并没有真正遵循从扩展程序访问文本的正常方式。 为此,我创建了一个使用 Google Docs 的工具,可以在 here 找到它
这应该使您能够:
//contentScript.js
var googleDocument = googleDocsUtil.getGoogleDocument();
console.log("The selected text is: " + googleDocument.selectedText);
【讨论】:
您能否分享截取的确切代码 - 仅用于获取选定的文本?【参考方案2】:您可以从上下文菜单中获取此信息。我打赌你无论如何都会添加一个上下文菜单项。
chrome.contextMenus.create(
id:"g-search",
title:"Search %s",
contexts:["selection"]
);
chrome.contextMenus.onClicked.addListener(function(sel)
console.log(sel.selectionText);
);
【讨论】:
谢谢,但是这种方法被 Google Docs 阻止了 - 而不是浏览器用户的上下文菜单,而是查看 Google Docs 的上下文菜单。 如果您愿意,可以添加禁用 Google 文档菜单的 Google 文档菜单项。 IE。禁用此菜单并允许原生。 在执行此操作之前将“contextMenus”权限添加到 manifest.json【参考方案3】:感谢Mr. Java Wolf answer。
我创建了他的项目的一个分支,然后完全重写了他的项目以适应我自己的需要。保留了核心概念,但现在它更易于使用,因为它同时支持 IIFE 和 CJS。
所以,这里是google-docs-utils
包:
您可以将它与 Node.js 一起使用,也可以直接在浏览器中使用:
Node.js:npm install google-docs-utils
浏览器:https://unpkg.com/google-docs-utils@latest/dist/iife/index.js
这是使用google-docs-utils
包解决您的任务的代码:
const linesData = GoogleDocsUtils.getSelection();
let selectionData = null;
for (const lineData of linesData)
if (lineData)
selectionData = lineData;
// we handle only single selection
break;
if (selectionData)
console.log(selectionData.selectedText);
【讨论】:
以上是关于在 Google Docs 中捕获文本选择的主要内容,如果未能解决你的问题,请参考以下文章