Estoy tratando de crear un área de texto de sangría automática y hasta ahora funciona con el siguiente código. El problema que estoy teniendo es que actualmente estoy evitando la acción predeterminada de presionar enter para calcular las pestañas en la línea y luego insertar la nueva línea.Sangría automática de área de texto "inteligente"
Esto funciona, pero quiero tener la acción predeterminada del área de texto, en el sentido de que si mantienes presionada la tecla enter, no desplaza el área de texto hasta que el símbolo de intercalación toca la fila inferior y luego la barra de desplazamiento permanece presionada en la fila inferior El código actual a continuación mantiene el cursor en el campo de visión si se utiliza en cualquier parte del área de texto, pero hace que el contenido por encima del cursor se desplace hacia arriba, lo cual es un compromiso ya que el cursor ya no desaparece. Si no hay otra solución, funcionará bien, pero espero que haya otras ideas.
var start = this.selectionStart-1;
var end = this.selectionEnd;
var sT = this.scrollTop;
var sH = this.scrollHeight;
var vH = $(this).height();
var x = (sH - sT) - vH;
// Check if hitting enter on the first line as no newline will be found
if (this.value.lastIndexOf('\n',start)==-1)
var startSubstr = 0;
else
var startSubstr = this.value.lastIndexOf('\n',start)+1;
var endFirst = end - startSubstr;
var valueToScan = this.value.substr(startSubstr,endFirst);
var count = 0;
// Count only \t at the beginning of the line, none in the code
while (valueToScan.indexOf('\t')!=-1) {
if (valueToScan.indexOf('\t')!=0)
break;
count++;
valueToScan = valueToScan.substr(valueToScan.indexOf('\t')+1);
}
// Command to isert the newline, and then add the \t's found in previously
$(this).insertAtCaret('\n');
for (var i=0;i<count;count--) {
$(this).insertAtCaret('\t');
}
var sH = this.scrollHeight;
this.scrollTop = (sH - x) - vH;
EDITAR Como una actualización, para eliminar cualquier confusión, Estoy intentando crear un cuadro de texto estilo IDE, así por ejemplo, en la mayoría de entornos de desarrollo si escribe el siguiente
function example(whatever) {
Example Stuff // And then hit enter here
Quiero que te lleve a la misma distancia de tabulación desde el borde izquierdo como "Ejemplo de cosas" para mantener tu código más fácil de leer. Actualmente tengo esa funcionalidad, pero el problema es que estoy interceptando la tecla enter, lo que significa que tengo que proporcionar esa funcionalidad. Tengo dificultades para replicar la funcionalidad exacta de no desplazar el cuadro de texto hasta que el cursor toque el borde inferior. Entonces, si tuviera que mantener enter en la parte superior del área de texto, el cursor simplemente desplaza hacia abajo el área de texto, moviendo cualquier texto hasta que toque el borde inferior, y luego la barra de desplazamiento para el área de texto seguirá el cursor. ¿Tener sentido?
EDITAR 2etiquetas actualiza para indicar el código es con PHP
He estado trabajando en esto, mientras que este post ha estado sentado. Creo que otra opción que voy a explorar cuando tengo la oportunidad es, en lugar de evitar, solo permitir la acción predeterminada de presionar enter y leer la cadena desde lastIndexOf('\n')-1
hasta la más reciente \n
para cualquier \t
. Creo que me daría la cadena que estoy buscando, pero sin estropear el comportamiento del área de texto. Se actualizará nuevamente después de la prueba.
EDITAR 3 resuelve, según mi anterior actualización decidí explorar la cadena después de pulsar la tecla, preservando el comportamiento natural (Cambio la sección añadió a continuación para los interesados) y el único problema que realmente queda es que si Si mantienes presionada la tecla enter, no contará la sangría del origen de la tecla enter, lo cual está bien para mí. Voy a darle este a http://stackoverflow.com/users/15066/matyr'>matyr, aunque lo descubrí antes de que él respondiera que todavía era el más cercano.
if (this.value.lastIndexOf('\n',start-2)==-1) {
var startSubstr = 0;
} else {
var startSubstr = this.value.lastIndexOf('\n',start-1)+1;
}
var valueToScan = this.value.substr(startSubstr,start);
Mantener la posición de desplazamiento no es el problema, es permitir que el cursor continúe hasta la parte inferior del área de texto antes de seguirlo con cada nueva línea. Intentaré utilizar la tecla en lugar de la tecla de acceso según mi más reciente upate. – Robert
if usted usa KEYUP significa que disparará cada botón, en realidad necesitamos a veces mantener presionado un botón para tener múltiples eventos. En ese caso, KEYDOWN es mejor. También el evento KEYDOWN se dispara antes de que se actualice el personaje textarea, por lo que quiere usar el.keydown (función (e) {setTimeout (función (e) {/ * SU ACCIÓN DE LLAVE PRINCIPAL * /}, 1)}); – kami