Evitar saltos de línea/párrafo en contentEditable

5 minutos de lectura

Avatar de usuario de Daniel Cassidy
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

avatar de usuario de andyrandy
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 use evt.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


avatar de usuario de frogatto
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

Avatar de usuario de Maor Oz
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;
    });
    

Haga clic aquí para ver un ejemplo en vivo

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>

Avatar de usuario de Patrick Desjardins
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; 
});   

avatar de usuario de adir kandel
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 un div elemento automáticamente para iniciar la nueva línea actual. Mediante el uso display: flexhace que los DIV aparezcan horizontalmente en la misma línea, a diferencia de display: 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 presionando shift+enter.

    – Solo Mohit

    1 de agosto de 2022 a las 6:01

¿Ha sido útil esta solución?