Chrome Extension: comment capturer le texte sélectionné et l'Envoyer à un service web

pour L'extension Google Chrome, je dois capturer le texte sélectionné dans une page web et l'Envoyer à un service web. Je suis coincé!

D'abord j'ai essayé un bookmarklet, mais Chrome sur Mac semble avoir quelques bogues bookmarklet alors j'ai décidé d'écrire une extension.

j'utilise ce code dans mon ext:

function getSelText(){
    var txt = 'nothing';
    if (window.getSelection){
        txt = "1" + window.getSelection();
    } else if (document.getSelection) {
        txt = "2" + document.getSelection();
    } else if (document.selection) {
        txt = "3" + document.selection.createRange().text;
    } else txt = "wtf";
    return txt;
}
var selection = getSelText();
alert("selection = " + selection);

quand je clique sur mon icône d'extension, j'obtiens un "1". Donc je pense que le fait de sélectionner en dehors de la fenêtre du navigateur fait que le texte n'est pas vu par le navigateur comme "sélectionné".

Juste une théorie....

pensées?

32
demandé sur mattbasta 2010-04-13 07:48:56

5 réponses

Vous pouvez le faire en utilisant Extensions Messagerie. Fondamentalement, votre "page d'arrière-plan" enverra la demande à votre service. Par exemple, disons que vous avez un "popup" et une fois que vous cliquez dessus, il fera une "recherche Google" qui est votre service.

content_script.js

Dans votre contenu script, nous avons besoin d'écouter pour une demande venant de votre extension, de sorte que nous l'envoyer sélectionnés texte:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    if (request.method == "getSelection")
      sendResponse({data: window.getSelection().toString()});
    else
      sendResponse({}); // snub them.
});

arrière-plan.html

maintenant dans la page de fond vous pouvez gérer le popup événement onclick pour qu'on sache qu'on a cliqué sur le popup. Une fois que nous avons cliqué dessus, le rappel se déclenche, et alors nous pouvons envoyer une demande au script de contenu en utilisant "Messaging" pour récupérer le texte sélectionné.

chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.sendRequest(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});
}

Heureusement, vous pouvez utiliser ce que j'ai expliqué ci-dessus et l'appliquer à votre scénario. Je dois juste vous prévenir que le code écrit ci-dessus n'est pas testé, donc il pourrait y avoir des fautes d'orthographe ou de syntaxe. Mais ceux-ci peuvent facilement être trouvé en regardant votre Inspecteur :)

43
répondu Mohamed Mansour 2014-06-02 15:10:06

le contenu du script

document.addEventListener('mouseup',function(event)
{
    var sel = window.getSelection().toString();

    if(sel.length)
        chrome.extension.sendRequest({'message':'setText','data': sel},function(response){})
})

Page D'Arrière-Plan

<script>
var seltext = null;

chrome.extension.onRequest.addListener(function(request, sender, sendResponse)
{
    switch(request.message)
    {
        case 'setText':
            window.seltext = request.data
        break;

        default:
            sendResponse({data: 'Invalid arguments'});
        break;
    }
});


function savetext(info,tab)
{
    var jax = new XMLHttpRequest();
    jax.open("POST","http://localhost/text/");
    jax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    jax.send("text="+seltext);
    jax.onreadystatechange = function() { if(jax.readyState==4) { alert(jax.responseText);  }}
}

var contexts = ["selection"];
for (var i = 0; i < contexts.length; i++)
{
    var context = contexts[i];
    chrome.contextMenus.create({"title": "Send to Server", "contexts":[context], "onclick": savetext});  
}

</script>

manifeste.json

{
  "name": "Word Reminder",
  "version": "1.0",
  "description": "Word Reminder.",
  "browser_action": {
    "default_icon": "images/stick-man1.gif",
    "popup":"popup.html"
  },

  "background_page": "background.html",

  "content_scripts": [
    {
        "matches": ["<all_urls>"],
      "js": ["js/myscript.js"]
    }
  ],

  "permissions": [
    "http://*/*",
    "https://*/*",
    "contextMenus",
    "tabs"
  ]
}

et voici le lien où j'ai tous dans une extension à télécharger. après avoir lu ceci j'ai essayé de mon propre et ai publié.

et voici la source

http://vikku.info/programming/chrome-extension/get-selected-text-send-to-web-server-in-chrome-extension-communicate-between-content-script-and-background-page.htm

Profitez de

6
répondu Jayapal Chandran 2012-01-31 14:46:43

L'utilisation d'un content_scripts n'est pas une bonne solution car il injection à tous les documents, y compris iframe-ads, etc. Je reçois une sélection de texte vide d'autres pages que celle que j'attends la moitié des fois sur les sites Web désordonnés.

une meilleure solution est d'injecter du code uniquement dans l'onglet sélectionné, car c'est l'endroit où votre texte sélectionné vit de toute façon. Exemple de section jQuery doc ready:

$(document).ready(function() {
    // set up an event listener that triggers when chrome.extension.sendRequest is fired.
    chrome.extension.onRequest.addListener(
        function(request, sender, sendResponse) {
            // text selection is stored in request.selection
            $('#text').val( request.selection );
    });

    // inject javascript into DOM of selected window and tab.
    // injected code send a message (with selected text) back to the plugin using chrome.extension.sendRequest
    chrome.tabs.executeScript(null, {code: "chrome.extension.sendRequest({selection: window.getSelection().toString() });"});
});
3
répondu user1231157 2012-02-24 16:20:23

il n'est pas clair d'après votre code où il se trouve. Ce que je veux dire, c'est que si ce code est soit en HTML popup ou html background alors les résultats que vous voyez sont corrects, rien dans ces fenêtres ne sera sélectionné.

vous aurez besoin de placer ce code dans un script de contenu pour qu'il ait accès au DOM de la page, et ensuite quand vous cliquez sur l'action de votre navigateur, vous aurez besoin d'envoyer un message au script de contenu pour récupérer la sélection de document actuelle.

1
répondu Kinlan 2010-04-13 08:07:51

Vous n'avez pas besoin D'API Google pour quelque chose d'aussi simple que cela...

je vais utiliser le service en ligne de Bing comme exemple. Notez que l'URL est configuré pour accepter un paramètre:

var WebService='http://www.bing.com/translator/?text='; 


frameID.contentWindow.document.body.addEventListener('contextmenu',function(e){

 T=frameID.contentWindow.getSelection().toString();

 if(T!==''){e.preventDefault(); Open_New_Tab(WebService+encodeURIComponent(T)); return false;} 

},false);

NB: la fonction "Open_New_Tab()" utilisée ci-dessus est une fonction imaginaire qui accepte L'URL du service Web avec le texte sélectionné comme paramètre.

C'est l'idée de base.

0
répondu user4723924 2017-12-06 23:38:08