2012-03-31 58 views
12

Bien, he estado buscando en toda la web para encontrar una solución, pero no pude encontrar una, ¿hay alguna manera de obtener la palabra antes de la posición de intercalación en un div editable un poco como:JavaScript obtener la palabra antes del cursor

This is some| demo texts 

esto debería devolver la palabra "algo" ... no sé si esto es posible, me alegraría por cualquier ayuda, gracias :).

+0

¿Tiene algún requisito del navegador? La gente también querrá saber si jquery está bien. – Hemlock

+0

sí, use todos los idiomas que desee, preferiblemente todos los navegadores, pero principalmente firefox :) –

Respuesta

18

Con el uso del método de buscador de posición Caret siempre here esto hará lo que quiera.

function GetCaretPosition(ctrl) { 
     var CaretPos = 0; // IE Support 
     if (document.selection) { 
      ctrl.focus(); 
      var Sel = document.selection.createRange(); 
      Sel.moveStart('character', -ctrl.value.length); 
      CaretPos = Sel.text.length; 
     } 
     // Firefox support 
     else if (ctrl.selectionStart || ctrl.selectionStart == '0') 
      CaretPos = ctrl.selectionStart; 
     return (CaretPos); 
    } 

    function getWordAtPos(s, pos) { 
     var preText = s.substring(0, pos); 
     if (preText.indexOf(" ") > 0 || preText.indexOf("\n") > 0) { 
      var words = preText.split(" "); 
      words = words[words.length - 1].split("\n"); 
      return words[words.length - 1]; //return last word 
     } 
     else { 
      return preText; 
     } 
    } 

    function AlertPrevWord() { 
     var text = document.getElementById("textArea"); 
     var caretPos = GetCaretPosition(text) 
     var word = ReturnWord(text.value, caretPos); 
     if (word != null) { 
      alert(word); 
     } 
    } 

Implementación

<input id="textArea" type="text" /> 
<br /> 
<input id="Submit" type="submit" value="Test" onclick="AlertPrevWord()" /> 

http://jsfiddle.net/arrwP/2/

+0

¿Podría hacer un jsfiddle? Porque no sé cómo implementar esto en un área de texto ... –

+0

'textarea' o' div' editable? – Hemlock

+0

Por '|' el OP significa posición de intercalación, no el carácter de línea vertical real presente en la cadena fuente. –

9

Aquí es un método en bruto utilizando los Selection y Range objetos.

function getWord() { 
    var range = window.getSelection().getRangeAt(0); 
    if (range.collapsed) { 
     text = range.startContainer.textContent.substring(0, range.startOffset+1); 
     return text.split(/\b/g).pop(); 
    } 
    return ''; 
} 

Puedes verlo en acción aquí: http://jsfiddle.net/ggfFw/1/. Esto no funcionará en IE. Si necesita soporte de IE, mire la biblioteca de Rangy.

+0

¿Cómo se puede hacer que esto funcione en un '