我一直在研究一个小的Chrome扩展程序,但是我似乎无法解决这个问题。我希望有人能够以全新的视角来看待它。
目标是创建一个chrome扩展程序,使您可以选择任何给定网站上的文本,并显示一个选项,使用上下文菜单项将选择发送到另一个网站。
我的 manifest.json 如下所示:
{
"name": "Context Menu Search",
"description": "Opens the selected text as keyword in a new window",
"version": "0.1",
"permissions": ["contextMenus"],
"background_page": "background.html"
}
然后 background.html :
<script src="rightclick.js"></script>
rightclick.js :
var selection_callbacks = [];
function getSelection(callback) {
selection_callbacks.push(callback);
chrome.tabs.executeScript(null, { file:"selection.js" });
};
chrome.extension.onRequest.addListener(function (request) {
var callback = selection_callbacks.shift();
callback(request);
});
function sendSearch(selectedText) {
var serviceCall = 'http://www.google.com/search?q=' + selectedText;
chrome.tabs.create({url: serviceCall});
}
var tx = getSelection();
var title = "Test '" + tx + "' menu item";
var id = chrome.contextMenus.create({"title": title, "contexts":[selection],
"onclick": sendSearch(tx)});
console.log("selection item:" + id);
加 selection.js :
chrome.extension.sendResponse(window.getSelection().toString());
到目前为止,上下文菜单创建工作正常,但根本不显示所选文本。 如果有人对如何解决这个问题以及简化脚本有任何建议,我将非常感谢您的意见。
非常感谢。
答案 0 :(得分:57)
<强>更新强>
我只是看了docs,所有这些都可以在没有任何内容脚本和回调的情况下更简单地完成:
chrome.contextMenus.create({
title: "Test %s menu item",
contexts:["selection"],
onclick: function(info, tab) {
sendSearch(info.selectionText);
}
});
这就是您所需要的,因为您可以在菜单标题中使用%s
来获取所选文字。
(不再需要以下所有内容)
您的getSelection()
方法不返回所选文本,只是将内容脚本注入页面。稍后在onRequest
中收到所选文本,然后将其作为参数传递给回调数组中的回调函数。
所以这一部分:
var tx = getSelection();
var title = "Test '" + tx + "' menu item";
var id = chrome.contextMenus.create({"title": title, "contexts":[selection],
"onclick": sendSearch(tx)});
console.log("selection item:" + id);
需要更改为:
getSelection(function(tx) {
var title = "Test '" + tx + "' menu item";
var id = chrome.contextMenus.create({"title": title, "contexts":["selection"],
"onclick": sendSearch(tx)});
console.log("selection item:" + id);
})
但是我会完全摆脱那个selection_callbacks
数组,因为我认为不需要它:
chrome.extension.onRequest.addListener(function (request) {
var tx = request;
var title = "Test '" + tx + "' menu item";
var id = chrome.contextMenus.create({"title": title, "contexts":["selection"],
"onclick": sendSearch(tx)});
console.log("selection item:" + id);
});
另请注意,"contexts":[selection]
必须为"contexts":["selection"]
,"onclick": sendSearch(tx)
必须是这样的:
"onclick": function(info, tab) {
sendSearch(info.selectionText);
}