Quiero ejecutar una función cuando un usuario edita el contenido de un atributo div
con contenteditable
. ¿Cuál es el equivalente de un onchange
evento?
Estoy usando jQuery, por lo que se prefiere cualquier solución que use jQuery. ¡Gracias!
javascript
jquery
html
contenteditable
Jourkey
fuente
fuente
document.getElementById("editor").oninput = function() { ...}
.Respuestas:
Yo sugeriría oyentes correspondientes a los eventos clave disparados por el elemento editable, aunque es necesario tener en cuenta que
keydown
ykeypress
eventos es despedido antes de que el contenido en sí se cambia. Esto no cubrirá todos los medios posibles para cambiar el contenido: el usuario también puede usar cortar, copiar y pegar desde los menús Editar o contextual del navegador, por lo que es posible que también desee manejar los eventoscut
copy
ypaste
. Además, el usuario puede soltar texto u otro contenido, por lo que hay más eventos allí (mouseup
por ejemplo). Es posible que desee sondear el contenido del elemento como reserva.ACTUALIZACIÓN 29 de octubre de 2014
El evento HTML5
input
es la respuesta a largo plazo. Al momento de escribir, es compatible concontenteditable
elementos en los navegadores actuales de Mozilla (de Firefox 14) y WebKit / Blink, pero no IE.Manifestación:
Demostración: http://jsfiddle.net/ch6yn/2691/
fuente
cut
,copy
ypaste
eventos en los navegadores que las soportan (IE 5+, Firefox 3.0+, Safari 3+, Chrome)input
evento HTML5 .Aquí hay una versión más eficiente que utiliza
on
para todos los contentables. Se basa en las mejores respuestas aquí.El proyecto está aquí: https://github.com/balupton/html5edit
fuente
document.getElementById('editor_input').innerHTML = 'ssss'
. El inconveniente es que requiere IE11Considere usar MutationObserver . Estos observadores están diseñados para reaccionar a los cambios en el DOM y como un reemplazo eficaz para eficaz de los eventos de mutación .
Pros:
Contras:
Aprende más:
fuente
input
evento HTML5 (que es compatible concontenteditable
todos los navegadores WebKit y Mozilla que admiten observadores de mutación), ya que la mutación DOM podría ocurrir a través del script y la entrada del usuario, pero es una solución viable para esos navegadores. Me imagino que también podría dañar el rendimiento más que elinput
evento, pero no tengo pruebas contundentes de esto.input
evento HTML5 se dispara en cada una de estas situaciones (específicamente arrastrar y soltar, cursiva, copiar / cortar / pegar a través del menú contextual). También probé negrita w / cmd / ctrl + b y obtuve los resultados esperados. También verifiqué y pude verificar que elinput
evento no se dispara en los cambios programáticos (lo que parece obvio, pero podría decirse que es contrario a algún lenguaje confuso en la página MDN relevante; vea la parte inferior de la página aquí para ver lo que quiero decir: desarrollador .mozilla.org / es-es / docs / Web / Events / input )He modificado la respuesta de lawwantsin así y esto funciona para mí. Uso el evento keyup en lugar de presionar teclas, lo que funciona muy bien.
fuente
no jQuery respuesta rápida y sucia :
fuente
Dos opciones:
1) Para navegadores modernos (de hoja perenne): el evento "input" actuaría como un evento alternativo de "cambio".
https://developer.mozilla.org/en-US/docs/Web/Events/input
o
o (con jQuery)
2) Para tener en cuenta los navegadores IE11 y modernos (perennes): Esto busca cambios en los elementos y su contenido dentro del div.
https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver
fuente
fuente
Esto es lo que funcionó para mí:
fuente
Este hilo fue muy útil mientras investigaba el tema.
Modifiqué parte del código disponible aquí en un complemento jQuery para que sea reutilizable, principalmente para satisfacer mis necesidades, pero otros pueden apreciar una interfaz más simple para iniciar usando etiquetas contentables.
https://gist.github.com/3410122
Actualizar:
Debido a su creciente popularidad, el complemento ha sido adoptado por Makesites.org
El desarrollo continuará desde aquí:
https://github.com/makesites/jquery-contenteditable
fuente
Aquí está la solución que terminé usando y funciona fabulosamente. En su lugar, uso $ (this) .text () porque solo estoy usando un div de una línea que tiene contenido editable. Pero también puede usar .html () de esta manera, no tiene que preocuparse por el alcance de una variable global / no global y lo anterior está realmente unido al editor div.
fuente
Para evitar temporizadores y botones "guardar", puede usar un evento de desenfoque que se dispara cuando el elemento pierde el foco. pero para asegurarse de que el elemento haya cambiado realmente (no solo enfocado y desenfocado), su contenido debe compararse con su última versión. o use el evento keydown para establecer una bandera "sucia" en este elemento.
fuente
Una respuesta simple en JQuery, acabo de crear este código y pensé que sería útil para otros también
fuente
$("div [contenteditable=true]")
seleccionará todos los niños de un div, directa o indirectamente, que sean contentables.Respuesta no JQuery ...
Para usarlo, invoque (digamos) un elemento de encabezado con id = "myHeader"
Ese elemento ahora será editable por el usuario hasta que pierda el foco.
fuente
El evento onchange no se activa cuando se cambia un elemento con el atributo contentEditable, un enfoque sugerido podría ser agregar un botón, para "guardar" la edición.
Marque este complemento que maneja el problema de esa manera:
fuente
El uso de DOMCharacterDataModified en MutationEvents conducirá a lo mismo. El tiempo de espera está configurado para evitar el envío de valores incorrectos (por ejemplo, en Chrome tuve algunos problemas con la tecla de espacio)
Ejemplo JSFIDDLE
fuente
DOMCharacterDataModified
no se activará cuando el usuario modifique el texto existente, por ejemplo, aplicando negrita o cursiva.DOMSubtreeModified
Es más apropiado en este caso. Además, las personas deben recordar que los navegadores heredados no admiten estos eventos.Construí un complemento jQuery para hacer esto.
Simplemente puedes llamar
$('.wysiwyg').wysiwygEvt();
También puede eliminar / agregar eventos si lo desea
fuente
innerHTML
es costoso). Recomendaría usar elinput
evento donde existe y recurrir a algo como esto pero con algún tipo de rebote.En Angular 2+
fuente
Siga la siguiente solución simple
En .ts:
en .html:
fuente
Mira esta idea. http://pastie.org/1096892
Creo que está cerca. HTML 5 realmente necesita agregar el evento de cambio a la especificación. El único problema es que la función de devolución de llamada evalúa if (before == $ (this) .html ()) antes de que el contenido se actualice realmente en $ (this) .html (). setTimeout no funciona, y es triste. Déjame saber lo que piensas.
fuente
Basado en la respuesta de @ balupton:
fuente