2011-01-17 7 views
34

Sto scrivendo un addon di Firefox che viene attivato ogni volta che una parola viene evidenziata. Tuttavia ho bisogno di uno script che rilevi quando viene evidenziata una parola, e sono bloccato. Un esempio potrebbe essere nytimes.com (quando leggi un articolo e evidenzi una parola, viene visualizzata l'icona di riferimento). Tuttavia, lo script di nytimes.com è super complesso. Ho 16 anni e non un gran programmatore, quindi è decisamente fuori dalla mia portata.Javascript: Come rilevare se una parola è evidenziata

risposta

2

Ecco uno script:

<script language=javascript> 
function getSelText() 
{ 
    var txt = ''; 
     if (window.getSelection) 
    { 
        txt = window.getSelection(); 
             } 
    else if (document.getSelection) 
    { 
        txt = document.getSelection(); 
            } 
    else if (document.selection) 
    { 
        txt = document.selection.createRange().text; 
            } 
    else return; 
document.aform.selectedtext.value = txt; 
} 
</script> 
<input type="button" value="Get selection" onmousedown="getSelText()"> 
<form name=aform > 
<textarea name="selectedtext" rows="5" cols="20"></textarea> 
</form> 

Per gentile concessione di Codice Toad:

http://www.codetoad.com/javascript_get_selected_text.asp

Nel tuo caso, si vorrebbe chiamare questo script quando la selezione è fatta, e poi si può elaborarlo come preferisci, con una richiesta AJAX per ottenere informazioni rilevanti, ad esempio, come probabilmente accade a NYTIME.

+3

continuo a vedere questo codice su SO, ed è sbagliato: 'finestra. getSelection() 'restituisce un oggetto' Selection', non una stringa. –

+0

@tim, non tutta la verità. L'oggetto ha un metodo toString(). Quando è prevista una stringa, viene restituita una stringa, altrimenti, come si indica, viene restituito un oggetto. https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection –

+0

@TedCohen: È vero che un oggetto 'Selection' ha un'implementazione sensibile' toString() 'ma il resto del tuo il commento non ha senso: un oggetto 'Selection' viene sempre restituito se' window.getSelection' esiste (cosa che fa in tutti i browser moderni). –

51

Il modo più semplice per eseguire questa operazione è rilevare gli eventi mouseup e keyup sul documento e controllare se è selezionato alcun testo. Quanto segue funzionerà in tutti i principali browser.

Esempio: http://www.jsfiddle.net/timdown/SW54T/

function getSelectedText() { 
    var text = ""; 
    if (typeof window.getSelection != "undefined") { 
     text = window.getSelection().toString(); 
    } else if (typeof document.selection != "undefined" && document.selection.type == "Text") { 
     text = document.selection.createRange().text; 
    } 
    return text; 
} 

function doSomethingWithSelectedText() { 
    var selectedText = getSelectedText(); 
    if (selectedText) { 
     alert("Got selected text " + selectedText); 
    } 
} 

document.onmouseup = doSomethingWithSelectedText; 
document.onkeyup = doSomethingWithSelectedText; 
+2

Ma cosa succede se vuoi rilevare se una parola specifica è selezionata? Supponi di avere 'pippo' sulla pagina più volte e l'utente seleziona' pippo' come fai a sapere quali parole l'utente ha selezionato? – Jespertheend

0

Utilizzando rangy.js e jQuery:

$('#elem').on('keyup mouseup', function(){ 
    var sel = rangy.getSelection() 
    if (sel.rangeCount === 0 || sel.isCollapsed) return 
    alert(sel.toString()) 
}) 
0

Usa seguente codice

(function() { 
     "use strict"; 
     var showSelectedText = function (e) { 
      var text = ''; 
      if (window.getSelection) { 
       text = window.getSelection(); 
      } else if (document.getSelection) { 
       text = document.getSelection(); 
      } else if (document.selection) { 
       text = document.selection.createRange().text; 
      } 

      console.log(text.toString()); 
     } 

     document.onmouseup = showSelectedText; 
     if (!document.all) { 
      document.captureEvents(Event.MOUSEUP); 
     } 

})(); 
Problemi correlati