文本选择并在上下文菜单chrome扩展中显示

时间:2010-12-07 11:38:37

标签: google-chrome google-chrome-extension

我一直在研究一个小的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());

到目前为止,上下文菜单创建工作正常,但根本不显示所选文本。 如果有人对如何解决这个问题以及简化脚本有任何建议,我将非常感谢您的意见。

非常感谢。

1 个答案:

答案 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);
}