防止contentEditable中的行/段落中断

Dan*_*idy 43 javascript firefox contenteditable

在Firefox中使用contentEditable时,是否可以通过按Enter或shift + enter来阻止用户插入段落或换行符?

kam*_*ens 64

您可以将事件处理程序附加到contentEditable字段的keydown或keypress事件,如果keycode将自身标识为enter(或shift + enter),则取消该事件.

当焦点位于contentEditable字段中时,这将完全禁用enter/shift + enter.

如果使用jQuery,例如:

$("#idContentEditable").keypress(function(e){ return e.which != 13; });
Run Code Online (Sandbox Code Playgroud)

...将返回false并取消输入时的按键事件.

  • 请注意,将带换行符的文本复制粘贴到contentEditable区域时,这将不起作用. (42认同)

lus*_*chn 25

这可以通过Vanilla JS实现,同样的努力:

document.getElementById('idContentEditable').addEventListener('keypress', (evt) => {
    if (evt.which === 13) {
        evt.preventDefault();
    }
});
Run Code Online (Sandbox Code Playgroud)

你不应该使用jQuery来做最简单的事情.此外,您可能希望使用"key"而不是"which":https://developer.mozilla.org/en-US/docs/Web/Events/keypress

  • 现在 `keyCode` 也已被弃用,因此请使用 `evt.key === "Enter"`。这里不能谈论向后兼容性。[文档](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values) (4认同)
  • 我确实认为初学者总是尝试将 jquery 用于所有事情是一个大问题。他们甚至不再真正学习 vanilla js。 (3认同)
  • 我同意,并且FWIW我没有在提出这个问题的项目中使用JQuery.它确实让我烦恼,因为JavaScript上的答案通常假设每个人都使用JQuery,但是OTOH初学者绝对有可能使用JQuery,其他人都能够翻译答案以使用他们喜欢的库或缺少它们:). (2认同)

fro*_*tto 17

添加以下CSS规则以隐藏换行符.这只是一个样式设置,您应该添加一些事件处理程序以防止插入换行符:

.your_editable br {
    display: none
}
Run Code Online (Sandbox Code Playgroud)

  • Chrome也会插入一些`<DIV>`,因此可能会在此之前添加`.your_editable*{display:inline}`. (8认同)

Pat*_*ins 6

如果您正在使用JQuery框架,则可以使用on方法设置它,这将使您在所有元素上具有所需的行为,即使最近添加了此元素也是如此.

$(document).on('keypress', '.YourClass', function(e){
    return e.which != 13; 
});   
Run Code Online (Sandbox Code Playgroud)


amw*_*ter 6

另一种选择是允许输入中断但在模糊时删除它们.这具有处理粘贴内容的优点.您的用户会喜欢它还是讨厌它(取决于您的用户).

function handle_blur(evt){
  var elt=evt.target; elt.innerText=elt.innerText.replace(/\n/g,' ');
}
Run Code Online (Sandbox Code Playgroud)

那么,在html中:

<span onblur="handle_blur(event)" contenteditable>editable text</span>
Run Code Online (Sandbox Code Playgroud)


Mao*_* Oz 5

除了添加换行符之外,浏览器还会添加其他标签和样式(当您粘贴文本时,浏览器还会附加您的粘贴文本样式).

以下代码涵盖了所有内容.

  • 按Enter键时,不会添加换行符.
  • 粘贴文本时,浏览器添加的所有元素都将从文本中删除.

    $('[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;
    });
    
    Run Code Online (Sandbox Code Playgroud)

点击此处查看实时示例


小智 5

添加:

display: flex;
Run Code Online (Sandbox Code Playgroud)

关于 contenteditable html 元素

  • 请添加正确的解释,说明您的解决方案如何解决该问题。 (2认同)
  • 它的工作原理如下:当您在内容可编辑元素中添加换行符时,浏览器会自动将您的行换行到“div”元素内。当换行时,它会自动添加一个“div”元素以开始当前的新行。通过使用“display: flex”,您可以使 DIV 水平显示在同一行中,这与默认应用的“display: block”不同。这不会阻止添加新行。它只是让它们看起来直接相邻。您可以使用 DevTools 或按 `shift`+`enter` 来确认此行为。 (2认同)