2011-01-17 20 views
34

Estoy escribiendo un complemento de Firefox que se activa cada vez que se resalta una palabra. Sin embargo, necesito un script que detecte cuándo se resalta una palabra, y estoy atascado. Un ejemplo sería nytimes.com (cuando estás leyendo un artículo y resaltas una palabra, aparece el ícono de referencia). Sin embargo, el script de nytimes.com es súper complejo. Tengo 16 años y no soy programador, así que definitivamente es una forma fuera de mi alcance.Javascript: Cómo detectar si una palabra está resaltada

Respuesta

2

Aquí es una secuencia de comandos:

<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> 

Cortesía del Código de sapo:

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

En su caso, que se quiere llamar a este script cuando se hace la selección, y luego puede procesarlo como lo desee, con una solicitud de AJAX para obtener información relevante, por ejemplo, como NYtimes probablemente lo haga.

+3

sigo viendo este código en SO, y que está mal: 'ventana. getSelection() 'devuelve un objeto' Selection', no una cadena. –

+0

@tim no toda la verdad. El objeto tiene un método toString(). Cuando se espera una cadena, se devuelve una cadena, de lo contrario, como señala, se devuelve un objeto. https://developer.mozilla.org/en-US/docs/Web/API/Window/getSelection –

+0

@TedCohen: Es cierto que un objeto 'Selection' tiene una implementación' toString() 'sensible, pero el resto de su el comentario no tiene sentido: siempre se devuelve un objeto 'Selection' si' window.getSelection' existe (lo cual ocurre en todos los navegadores modernos). –

51

La forma más fácil de hacerlo es detectar los eventos mouseup y keyup en el documento y comprobar si se ha seleccionado algún texto. Lo siguiente funcionará en todos los principales navegadores.

Ejemplo: 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

Pero, ¿qué ocurre si quieres detectar si se selecciona una palabra específica? Digamos que tiene 'foo' en la página varias veces y el usuario selecciona' foo' ¿cómo sabe cuál de las palabras seleccionó el usuario? – Jespertheend

0

Usando rangy.js y jQuery:

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

Uso siguiente código

(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); 
     } 

})(); 
Cuestiones relacionadas