2012-05-05 6 views
7

Cada vez que escribe un carácter en un campo de entrada, I analizar la expresión de modo que consiga:¿Cómo puedo aplicar estilo a la entrada de texto mientras escribo?

  1. Una serie de fichas, es decir, tokenArray = [2, *, COS, (, 4,)]
  2. una matriz correspondiente de tipos de tokens, es decir, TokenType = [número, operador, FUNCTION, (, número,)]

necesito el estilo de cada ficha (por ejemplo la asignación de un color diferente para cada token) en función de su tipo de token respectivo.

he podido estilo fácilmente una copia dinámica del texto de entrada en un <div> (en sí misma no es el texto de entrada, que es lo que estoy pidiendo ayuda) diferente de la siguiente manera:

JavaScript:

function processExpression() { 
    var userInput = document.getElementById('inputText').value; 

     var resultOutput = parse(userInput); //this generates the two arrays described above 

     for (i in tokenArray) 
      newHTML += "<span style='color: " + colorMap[ tokenType[i] ] + " '>" + tokenArray[i] + "</span>"; 

      document.getElementById('styledExpression').innerHTML = newHTML; 
} 

HTML:

<input type="text" id="inputText" value="" placeholder="Type expression" size="40" 
     onKeyDown="processExpression();" 
     onKeyUp="processExpression();"/> 

<div id="styledExpression" value=""></div> 

Cómo puedo estilo I del texto de entrada directamente en el campo de entrada donde escribo? ¿Alguna solución de JavaScript?

ACTUALIZACIÓN

respuesta de Tim a la pregunta replace innerHTML in contenteditable div proporciona una buena ayuda.

¿Cómo se modificaría http://jsfiddle.net/2rTA5/2/ para resolver cuando en cada keydown, uno repara todo el editable? Por ejemplo, imagina que escribes "= if" (AND (3 = 2, A1: A4, OR (0,1)), 5,6) "y, en cada keydown, el editable se vuelve a escribir programáticamente (ver la descripción del token arriba)) y pierdo el cursor.

¿Cómo puede esta solución ignorar el tipo de token o carácter o nodo y simplemente guardar y restaurar el cursor absoluto (desde el comienzo de la) posición que estaba antes de la tecla?

+2

De hecho, acabo de empezar a trabajar en algo como esto un par de horas Hace rs! No es fácil, pero lo que tengo hasta ahora podría ayudarlo a comenzar: https://github.com/minitech/OpenEdit – Ryan

+0

Alternativamente, también puede intentar hacer que el '' sea transparente y diseñar cosas detrás de él. Esto funciona mejor para los colores de fondo, pero también puede hacer que el texto sea transparente para obtener efectos de estilo simples. – Ryan

+0

¡Gracias a todos! – Gian

Respuesta

6

Las entradas de texto no son compatibles con el contenido con estilo. Fin de la historia.

Una solución común es usar contenteditable en su lugar.

+0

Buen trabajo al vincularlo, hace toda la diferencia. :) – DanRedux

+0

+1 para ... Matt Ball ... el hombre con un plan (100,000) :) –

4

como dijo Matt, <input> s no son compatibles con el contenido de estilo. Sin embargo, una posible solución podría ser utilizar un segundo <span> que contendrá el valor de la entrada y mostrar el contenido con estilo aquí. Si eso no es aceptable, entonces use contenteditable como sugirió Matt.

+2

Eso es básicamente lo que el OP ya está haciendo. –

2

Puede clasificar el estilo detrás de él si es solo por estética sin importancia.

  • hacer el fondo y el texto de la <input> transparente
  • tener otro <span> detrás de él
  • actualizar el contenido de la <span> (con un estilo apropiado) cuando el contenido del 's del <input> cambian

Here's a quick demo.

+0

Solución simple y efectiva. ¿Hay alguna manera de ver el cursor y evitar el borde azul? Gracias – Gian

+0

@Gian: ¿Borde azul? No estoy seguro de lo que quieres decir allí ... en cuanto al cursor, me temo que no hay una solución de navegador cruzado. Si solo lo necesita para WebKit, use '-webkit-text-fill-color: transparent;'; de lo contrario, tendrás que modelarlo usando colores de fondo y nada más. – Ryan

+0

Quise decir el cielo azul alrededor del campo div (el borde estándar que muestra el foco en el elemento) – Gian

Cuestiones relacionadas