2010-08-23 12 views
51

Puede parecer una pregunta novato pero quería saber cómo puedo activar una función de JavaScript personalizado cuando alguien selecciona un fragmento de texto que figura en una página a través del ratón. ¿También hay alguna forma de encontrar la posición del texto seleccionado en la página web?seleccionada evento de disparo de texto en Javascript

Actualización: Para ser más claros, el fragmento de texto puede ser parte de una oración o una palabra o una frase o un párrafo entero.

Respuesta

53

No hay "texto fue seleccionado" (DOM), pero se le puede obligar a un evento mouseup a la document.body. Dentro de ese controlador de eventos, que sólo podría comprobar los

document.selection.createRange().text 

o

window.getSelection() 

métodos. Hay varios temas en Stackoverflow, como este javascript to get paragraph of selected text in web page.

No estoy seguro de lo que quiere decir con "encontrar la posición", pero para permanecer en mi mundo de ejemplo, podría usar el event propertys para las posiciones X + Y del mouse.

Ejemplo: http://www.jsfiddle.net/2C6fB/1/

+0

Gracias Andy, Ya que lo mejor que podemos conseguir piensa es x + y posiciones del ratón. –

+4

También debe considerar la selección a través del teclado. –

+0

Gracias por los comentarios Tim. cualquier punteros a la selección a través del teclado? –

46

Aquí hay un mashup rápida:

$('div').mouseup(function() { 
    var text=getSelectedText(); 
    if (text!='') alert(text); 
}); 

function getSelectedText() { 
    if (window.getSelection) { 
     return window.getSelection().toString(); 
    } else if (document.selection) { 
     return document.selection.createRange().text; 
    } 
    return ''; 
}​ 

<div>Here is some text</div> 

Demostración: http://jsfiddle.net/FvnPS/11/

+3

Parece haber una idea generalizada de que' window.getSelection(); 'es equivalente al' document.selection.createRange(). Text; 'de IE. ¿Las personas están copiando de la misma fuente inexacta? De todos modos, 'window.getSelection()' devuelve un objeto 'Selection' mientras' document.selection.createRange(). Text; 'devuelve una cadena, que es un objeto muy diferente. La confusión surge del hecho de que el método 'toString' del objeto' Selection' devuelve el texto seleccionado, lo que significa que 'alert (window.getSelection());' alertará al texto seleccionado. –

+0

Reparado. Los documentos de mozilla dicen: "Esto hace que el objeto de selección aparezca como una cadena, cuando en realidad es un objeto con sus propias propiedades y métodos. Específicamente, se pasa el valor de retorno de llamar al método toString() del objeto Selection". :) https://developer.mozilla.org/en/window.getSelection – karim79

+2

Heh. No había visto eso antes. Lamento bromear con tu respuesta: como habrás deducido, he corregido esto algunas veces antes. –

1

yo sepa, no existe tal caso usted describió. Pero puedes emular esa función.

Mire here para obtener el código y la demostración.

+1

Gracias ShiVik, es realmente útil. ¿Esta emulación tiene dependencia del navegador? –

+0

@abhishiktiwari - AFAIU el blog - ninguno – vikmalhotra

3

Hay una nueva API experimental que se ocupa de esto:

El evento SelectionChange de la API de selección se activa cuando se modificó el objeto de selección del documento, o cuando la selección asociado a un <input> o un <textarea> cambios . El evento selectionchange se dispara en el documento en el primer caso, en el elemento en el segundo caso.

https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange

Tenga en cuenta que este es el sangrado borde y no se garantiza que funcione a través de incluso los principales navegadores.

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la crítica] (/ review/low-quality-posts/13804253) – eisbehr

+0

He modificado la respuesta –

+0

Bleeding edge desde hace 3 meses? Patético. Como de costumbre, esto ha estado disponible en AS3 durante una década: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flashx/textLayout/events/SelectionEvent.html – Triynko

0

Hay un evento "Texto seleccionado". Pero solo para textarea como lo he conocido.

<textarea onselect="message()" name="summary" cols="60" rows="5"> 
请写入个人简介,不少于200字! 
</textarea> 
0

utilizar el 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); 
    } 

})(); 

Esto es código de ejemplo que utilicé durante uno de mi asignación. Funcionó para mí

Cuestiones relacionadas