Выделение текста и отображение в контекстном меню расширения Chrome - PullRequest
19 голосов
/ 07 декабря 2010

Я работал над небольшим расширением 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);

Plus selection.js :

chrome.extension.sendResponse(window.getSelection().toString());

Пока что создание контекстного меню работает нормально, но выделенный текст вообще не отображается.Если у кого-то есть какие-либо предложения по решению этой проблемы, а также по упрощению сценария, я был бы признателен за ваш вклад.

Большое спасибо.

1 Ответ

58 голосов
/ 07 декабря 2010

ОБНОВЛЕНИЕ

Я только что посмотрел на документы , и все это можно сделать намного проще без каких-либо сценариев контента и обратных вызовов:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...