2011-07-24 37 views
19

La aplicación: Tengo un elemento textarea en mi página. Se transforma usando CodeMirror, porque necesito aplicar sangría y resaltar el código html. Pic está en el enlace: [área de texto usando CodeMirror]Cuando edito el código en un TextArea usando CodeMirror cómo reflejar esto en otro textarea con js o jQuery

http://uploadingit.com/file/gxftd2cps9wm7zhp/cm.png

Aquí es el código de área de texto usando CodeMirror:

</textarea> 
    <button type="submit">Post</button>  
</form> 
<script> 

    var editor = CodeMirror.fromTextArea(document.getElementById("code"), { 
    mode: { name: "xml", htmlMode: true }, 
    lineNumbers: true, 
    tabMode: "indent", 
    matchBrackets: true, 
    path: 'js/', 
    searchMode: 'inline', 
    onCursorActivity: function() { 
     editor.setLineClass(hlLine, null); 
     hlLine = editor.setLineClass(editor.getCursor().line, "activeline"); 
    } 
    }); 

    var hlLine = editor.setLineClass(0, "activeline"); 
    </script> 

Cómo hacerlo ?: Cuando hago clic Botón de enviar, todo el código debe transmitirse a otro área de texto. Necesito esto para hacer javascript o jQuery, pero tengo problemas para hacerlo. ¿Alguna ayuda?

Para la aplicación del mundo real el código en este textarea (de la foto de arriba) debería afectar a la API de Html Designer. Es decir, cualquier cambio en el diseñador de Html debe reflejarse en este área de texto (que usó codemirror para legibilidad) y todo lo contrario. Cuando edito en el área de texto, los cambios deben reflejarse en HtmlDesigner, pero en este caso de simulación -> en el segundo textarea.

Ejemplo: como Visual Studio .Net Editor de Código WebPage que tiene el modo Designer + Source. ¿Ahora está claro?

estoy pidiendo cómo implementar el mecanismo descrito anteriormente usando javascript o jQuery. ¡Muchas gracias!

Respuesta

1

¿Desea copiar el texto de un TextArea (por cierto, como un control input) a otro?

//Set the button to call a Javascript function when it is clicked 
<button type="submit" onclick="copyText();">Post</button> 

<script type="text/javascript"> 
    function copyText() { 
     //Get the text in the first input 
     var text = document.getElementById("firstTextArea").getValue(); 
     //Can't use .value here as it returns the starting value of the editor 

     //Set the text in the second input to what we copied from the first 
     document.getElementById("secondTextArea").value = text; 
    } 
</script> 
+0

Gracias.Eso funciona, pero el comportamiento: –

+0

El código aparece en el segundo textarea desde el principio solo cuando pongo código dentro de textarea en Visual Studio. Pero en un mundo real, el usuario del sitio insertará algún código en el primer área de texto y eso debería aparecer en el segundo área de texto para poder editarlo al presionar el botón Publicar. Debería ir al primero. Entonces, ¿cómo detectar qué usuario insertó y cómo tomar el control con JS de eso? :) Gracias. –

+0

Eh, eso es interesante ... ¿Estás haciendo clic en el botón mientras el texto todavía está seleccionado? Si es así, intente hacer clic fuera del área de texto (para que se borre) antes de hacer clic en el botón. Si todavía no funciona correctamente, supongo que es una característica CodeMirror que devuelve el valor anterior en lugar del nuevo; es probable que probar getValue(), tal como sugirió Marijn, sea una buena idea. –

28

pasar una opción onChange a CodeMirror que se ve algo como esto:

onChange: function (cm) { 
    mySecondTextArea.value = cm.getValue(); 
} 

Editado a tener en cuenta: Desde CodeMirror versión 2.0, no pasa una opción onChange más para registrar un controlador cambio, pero llama al instance.on("change", function(cm, change) { ... }). http://codemirror.net/doc/manual.html#event_change

+1

¡Guau! Tan contento de escucharlo del autor :) Pero todavía malentendido: 1. Tengo que escribir otra esta nueva función (cm)? 2. mySecondTextArea puede ser un área de texto simple o incluso otra usando cm para funcionar. –

+0

El escenario: inserto el código en un área de texto simple. Cuando presiono el botón Publicar, ese código debe ir al área de texto que usa el espejo de código para que se pueda editar muy bien. Después de la edición, nuevamente, al presionar otro botón Guardar cambios, el código debería aparecer modificado en el primer área de texto (como en un patio de juegos IDE :)). –

+0

Lo siento por la pregunta de novato. ¿Pero cuáles son las funciones y el código para este mecanismo en js? Navego por la web y libros para js, pero esta vez lo necesito más rápido. :) Gracias. –

2

onChange manejo en el espejo código no se desea:

onChange: function(cm) { mySecondTextArea.value = cm.getValue(); } 

usted tiene que utilizar:

$.fn.buildCodeMirror = function(){ 
    var cmOption {...}; 
    var cm = CodeMirror($("MyDomObjectSelector")[0],cmOption); 
    cm.on("change",$.fn.cmChange); 
} 

$.fn.cmChange = function(cm,cmChangeObject){ 
    alert("code mirror content has changed"); 
} 
19

pasado lanzó la versión en el momento (v 3.15) trabaja con esta solución:

// on and off handler like in jQuery 
CodemirrorInstance.on('change',function(cMirror){ 
    // get value right from instance 
    yourTextarea.value = cMirror.getValue(); 
}); 
0

se puede utilizar este ...

var editor_js = CodeMirror.fromTextArea(document.getElementById("js"), { 
    mode: 'text/javascript', 
    theme: 'icecoder', 
    styleActiveLine: true, 
    lineNumbers: true, 
    lineWrapping: true, 
}); 

y obtener datos con editor_js.getValue()

1

Esto funciona trabajo CodeMirror 5.22.0:

CodeMirror.fromTextArea(document.getElementById('grammar'), { 
    lineNumbers: true, 
    mode: 'pegjs', 
}).on('change', editor => { 
    console.log(editor.getValue()); 
});