2011-05-04 16 views
20

Tengo un área de texto y un div con valores. Cuando hago clic en un valor, lo inserto en textarea. Necesito que se inserte donde estaba mi cursor en textarea. ¿Por qué digo WAS? Porque cuando lo muevo y hago clic en un valor para insertarlo, supongo que pierde el foco en el área de texto.Insertar valor en TEXTAREA donde el cursor era

Entonces, mi pregunta es, ¿hay alguna manera de "recordar" la última posición del cursor dentro de textarea y luego insertar mis valores en esa posición? ?

quizás podría ser un número caracter en una cadena .. Actualmente agrego así:

input.val(function(i, val) { return val + " " + myInsert + " "; }); 

También utilizo jQuery, tal vez podría utilizarlo?

+1

Hace un tiempo hice la misma pregunta: http://stackoverflow.com/questions/5605401/insert-link-in-contennted-element – PeeHaa

Respuesta

17

He escrito un complemento de jQuery multiproveedor para tratar con el cursor/selección en textareas y entradas de texto llamado Rangy inputs (terrible nombre, realmente debería pensar en uno mejor).Una combinación de métodos de esta y las técnicas de Edgar Villegas Alvarado's answer debe hacer el truco, si bien en IE, los focusout desencadena el evento demasiado tarde y tendrá que utilizar la propiedad beforedeactivate evento en su lugar: texto

var $textBox = $("#foo"); 

function saveSelection(){ 
    $textBox.data("lastSelection", $textBox.getSelection()); 
} 

$textBox.focusout(saveSelection); 

$textBox.bind("beforedeactivate", function() { 
    saveSelection(); 
    $textBox.unbind("focusout"); 
}); 

Al insertar más adelante , lo siguiente será insertar texto en la posición del cursor anterior (o sobrescribir el texto seleccionado previamente, si el usuario había seleccionado cualquier):

var selection = $textBox.data("lastSelection"); 
$textBox.focus(); 
$textBox.setSelection(selection.start, selection.end); 
$textBox.replaceSelectedText("Some new text"); 

Ver ejemplo jsFiddle aquí: http://jsfiddle.net/rQXrJ/1/

+0

Esto es genial! Sin embargo, en IE la etiqueta se inserta al principio de la cadena. Funciona muy bien en FF. – santa

+0

Eso es porque 'focusout' es demasiado tarde en IE: necesitas usar 'beforedeactivate'. Enmendar ... –

+2

@santa: ... Hecho. –

1

Si el cursor (el cursor) está en algún lugar del campo de texto, se registra en Javascript como una selección vacía. Es decir, los atributos selectionStart y selectionEnd son los mismos. Puede usar esos atributos para detectar la posición del cursor.

+0

Todavía no estoy seguro de cómo insertaré mi valor si conozco la posición de intercalación? Estoy desesperado por algunos ejemplos. Gracias. – santa

1

Puede usar el jQuery Caret plugin para obtener/ajustar la posición del cursor. el uso
Ejemplo:

var cursorPosition = $("#textbox").caret().start); 

Se podría 'tienda' esta posición así:

$("#textbox").focusout(function(){ 
    var cursorPosition = $(this).caret().start); 
    $(this).data("lastCursorPos", cursorPosition); 
}); 

para recuperarlo (en su evento click div), hacer esto:

var lastCursorPosition = $("#textbox").data("lastCursorPos"); 

Espero que esto ayude. Saludos

+0

Eso suena prometedor, gracias. ¿Cómo insertaría el valor en esta posición? – santa

+0

no parece funcionar en Chrome :-( –

2

Aquí es un ejemplo práctico de lo que está tratando de hacer echarle un vistazo en: http://jsfiddle.net/J5Z2n/1/

 
Hello there my good friend.... 
how do you do 

el jQuery:

 
function insertAt (myField, myValue, startSel, endSel) { 
    if (startSel || startSel == '0') { 
     var startPos = startSel; 

     var endPos = endSel; 

     myField.val(myField.val().substring(0, startPos)+ myValue+ myField.val().substring(endPos, myField.val().length)); 

    } 
    else { 

     myField.val() += myValue; 

    } 
} 

// calling the function 
var targetBox = $('textarea#insert'), 
    startSel, 
    endSel; 
targetBox.bind('focusout', function() { 
    //insertAtCursor(this, 'how do you do'); 
    startSel = this.selectionStart; 
    endSel = this.selectionEnd; 
}); 

    $("#myvalue").click(function() { 
     var myValue = $(this).text(); 
     insertAt(targetBox, myValue, startSel, endSel); 

    });  

La función original fue tomado de este post http://alexking.org/blog/2003/06/02/inserting-at-the-cursor-using-javascript

Eso debería darte una buena ventaja, espero. Cheers

+0

no funciona en el último firefox –

Cuestiones relacionadas