daniel cassidy
Al usar contentEditable en Firefox, ¿hay alguna forma de evitar que el usuario inserte saltos de párrafo o de línea presionando Intro o Mayús+Intro?
Puede adjuntar un controlador de eventos al evento keydown o keypress para el campo contentEditable y cancelar el evento si el código clave se identifica como enter (o shift+enter).
Esto deshabilitará enter/shift+enter completamente cuando el foco esté en el campo contentEditable.
Si usa jQuery, algo como:
$("#idContentEditable").keypress(function(e){ return e.which != 13; });
… que devolverá falso y cancelará el evento de pulsación de tecla al entrar.
-
Tenga en cuenta que esto no funcionará al copiar y pegar texto con saltos de línea en el área contentEditable.
– Mathias Bynens
29 de junio de 2011 a las 18:57
-
No cubre los casos para pegar (desde el portapapeles) o soltar contenido.
– Kafoso
13 oct 2016 a las 14:01
-
será útil para manejar múltiples
contenteditable
elementos en la página, pero no solo uno– Reiniciador de sistemas
4 de mayo de 2020 a las 6:35
-
@SystemsRebooter Simplemente hágalo en diferentes elementos o use un bucle
– RixTheTyrunt
16 de diciembre de 2022 a las 11:07
andyrandy
Esto es posible con Vanilla JS, con el mismo esfuerzo:
document.getElementById('idContentEditable').addEventListener('keypress', (evt) => {
if (evt.which === 13) {
evt.preventDefault();
}
});
No debe usar jQuery para las cosas más simples. Además, es posible que desee utilizar “clave” en lugar de “cuál”: https://developer.mozilla.org/en-US/docs/Web/Events/keypress
Actualización, desde keypress
es obsoleto:
document.getElementById('idContentEditable').addEventListener('keydown', (evt) => {
if (evt.keyCode === 13) {
evt.preventDefault();
}
});
-
Estoy de acuerdo, y FWIW no estaba usando JQuery en el proyecto que generó esta pregunta. Me molesta un poco que las respuestas de JavaScript en SO supongan que todos usan JQuery, pero es muy probable que los principiantes de OTOH usen JQuery y que todos los demás sean capaces de traducir las respuestas para usar sus bibliotecas preferidas o la falta de ellas :).
– Daniel Cassidy
18 de enero de 2016 a las 23:22
-
Veo como un gran problema que los principiantes siempre intenten usar jquery para todo. ya ni siquiera aprenden vainilla js.
– Andy Randy
19 de enero de 2016 a las 10:08
-
Ahora
keyCode
también está en desuso, así que useevt.key === "Enter"
. No puedo hablar de compatibilidad con versiones anteriores aquí. docs.– cbednarski
27 de julio de 2019 a las 17:26
-
Y en el sabor de jquery: $(“.
“).keypress(function(e) { if (e.which === 13) e.preventDefault(); }); – OritK
9 de septiembre de 2019 a las 8:59
-
Hay un error tipográfico: evt.preventDefault debería ser event.preventDefault. Además, la sintaxis lambda no funciona en todos los navegadores. Este código me funcionó: name.addEventListener(‘keydown’, function( event ) { if ( event.keyCode === 13 ) { event.preventDefault(); } } );
– cskwg
20 de octubre de 2019 a las 8:45
rana
Agregue la siguiente regla CSS a esconder saltos de línea. Esta es solo una configuración de estilo, debe agregar algunos controladores de eventos a prevenir insertando saltos de línea:
.your_editable br {
display: none
}
-
Chrome inserta algunos
<DIV>
s también, por lo que podría agregar.your_editable * { display: inline }
antes de que.–Eugène Ryabtsev
7 de febrero de 2014 a las 4:34
-
molesto, de hecho
– RixTheTyrunt
6 jun 2022 a las 15:30
-
Qué enfoque único. Tuve un problema no relacionado en el que el texto con estilo personalizado solía moverse hacia arriba debido a la eliminación del salto de línea insertado en cromo. Curiosamente, el problema se resolvió solo al actualizar la hoja de estilo de las herramientas de desarrollo. Perdí la esperanza hasta que encontré tu solución. Ahora funciona.
– McRaZick
1 de diciembre de 2022 a las 2:31
Maor Oz
Además de agregar saltos de línea, el navegador agrega etiquetas y estilos adicionales (cuando pega texto, el navegador también agrega su estilo de texto pegado).
El siguiente código lo cubre todo.
- Cuando presione enter, no se agregarán saltos de línea.
-
Cuando pega texto, todos los elementos agregados por el navegador se eliminan del texto.
$('[contenteditable]').on('paste', function(e) { //strips elements added to the editable tag when pasting var $self = $(this); setTimeout(function() {$self.html($self.text());}, 0); }).on('keypress', function(e) { //ignores enter key return e.which != 13; });
otra opción es permitir que se introduzcan pausas pero eliminarlas cuando se desenfoquen. esto tiene la ventaja de tratar con contenido pegado. sus usuarios lo amarán o lo odiarán (dependiendo de sus usuarios).
function handle_blur(evt){
var elt=evt.target; elt.innerText=elt.innerText.replace(/\n/g,' ');
}
entonces, en html:
<span onblur="handle_blur(event)" contenteditable>editable text</span>
patricio desjardins
Si está utilizando el marco JQuery, puede configurarlo con el en método que le permitirá tener el comportamiento deseado en todos los elementos, incluso si este se agregó recientemente.
$(document).on('keypress', '.YourClass', function(e){
return e.which != 13;
});
adir kandel
Agregar:
display: flex;
En el elemento html editable
-
Agregue una explicación adecuada de cómo su solución aborda la pregunta.
– Jens
5 de abril de 2020 a las 8:09
-
¡Simple pero perfecto!
– David Chávez
31 de diciembre de 2020 a las 18:56
-
bonito y perfecto!
– EaBengaluru
15 de junio de 2021 a las 11:23
-
No funciona cuando se usa shift+enter
– Solo Mohit
1 de agosto de 2022 a las 5:56
-
Esto funciona de la siguiente manera: cuando agrega un salto de línea en un elemento editable de contenido, el navegador envuelve automáticamente sus líneas dentro de un
div
elemento. Cuando la línea se rompe, agrega undiv
elemento automáticamente para iniciar la nueva línea actual. Mediante el usodisplay: flex
hace que los DIV aparezcan horizontalmente en la misma línea, a diferencia dedisplay: block
que se aplica por defecto. Esto no impide la adición de nuevas líneas. Simplemente los hace aparecer directamente uno al lado del otro. Puede confirmar este comportamiento utilizando DevTools o presionandoshift
+enter
.– Solo Mohit
1 de agosto de 2022 a las 6:01