阻止在ENTER上添加<div> - Chrome

iCo*_*nor 112 html javascript jquery google-chrome contenteditable

我有一个contenteditable元素,每当我输入一些东西并点击ENTER它创建一个新的<div>并将新的行文本放在那里.我不喜欢这一点.

是否有可能防止这种情况发生或至少只是用一个<br>

这是演示http://jsfiddle.net/jDvau/

注意:这不是firefox中的问题.

Ram*_*eya 155

试试这个

$('div[contenteditable]').keydown(function(e) {
    // trap the return key being pressed
    if (e.keyCode === 13) {
      // insert 2 br tags (if only one br tag is inserted the cursor won't go to the next line)
      document.execCommand('insertHTML', false, '<br><br>');
      // prevent the default behaviour of return key pressed
      return false;
    }
  });
Run Code Online (Sandbox Code Playgroud)

在这里演示

  • 答案是不可接受的.解决方案是只有一个<br /> (12认同)
  • 如果你把光标放在字符之间,例如.'Ty [光标] pe某些东西'然后点击进入,你得到1行太多了. (4认同)
  • 这在IE11中不起作用,因为它不支持insertHTML.见下面的答案! (3认同)
  • 这返回 &lt;br&gt; 和 &lt;div&gt; (3认同)

小智 46

只需更改CSS即可完成此操作:

div{
    background: skyblue;
    padding:10px;
    display: inline-block;
}

pre{
    white-space: pre-wrap;
    background: #EEE;
}
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/ayiem999/HW43Q/

  • 很好找.遗憾的是,这不适用于位置:绝对元素或元素,它们是具有display:flex的父元素的直接子元素.尽管记住这一点,你仍然可以破解它.只要确保它不是flex元素的直接子元素.如果你需要它的位置:绝对只是给它一个额外的父母. (5认同)
  • 哇...这解决了 Chrome,但使 Firefox 在进入时开始添加 div,默认情况下它不会。 (2认同)

小智 33

添加样式display:inline-block;contenteditable,也不会产生div,pspan自动在Chrome中.

  • 这是一个很好的解决方案.`*[contenteditable ="true"] {display:inline-block;}` (3认同)
  • 不适用于Chrome 63.0.3239.84版 (2认同)

小智 22

这适用于所有主要浏览器(Chrome、Firefox、Safari、Edge)

document.addEventListener('keydown', event => {
  if (event.key === 'Enter') {
    document.execCommand('insertLineBreak')
    event.preventDefault()
  }
})
Run Code Online (Sandbox Code Playgroud)
<div class="element" contenteditable="true">Sample text</div>
<p class="element" contenteditable="true">Sample text</p>
Run Code Online (Sandbox Code Playgroud)

有一个不便之处。完成编辑后,元素<br>内部可能包含结尾。但是如果需要,您可以添加代码来减少它。

检查此答案以删除尾随<br> /sf/answers/4286641621/

  • 有没有搞错?唯一真正对我有用的解决方案怎么可能在页面这么远的地方?非常感谢。 (4认同)

Ste*_*rya 21

在 W3C 编辑器草稿中,有一些有关将状态添加到ContentEditable中的信息,并防止浏览器在按 Enter 时添加新元素,您可以使用plaintext-only

<div contentEditable="plaintext-only"></div>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!这对我来说效果很好。它不添加 div 或 br。 (2认同)
  • 很棒的解决方案,就像魅力一样。但 Firefox 和 IE 仍然不支持:https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/contenteditable。我可以检查浏览器以加载 FF 和 IE 中的黑客工作。 (2认同)
  • 这是 2022 年常青浏览器的正确答案 (2认同)

And*_*rew 20

试试这个:

$('div[contenteditable="true"]').keypress(function(event) {

    if (event.which != 13)
        return true;

    var docFragment = document.createDocumentFragment();

    //add a new line
    var newEle = document.createTextNode('\n');
    docFragment.appendChild(newEle);

    //add the br, or p, or something else
    newEle = document.createElement('br');
    docFragment.appendChild(newEle);

    //make the br replace selection
    var range = window.getSelection().getRangeAt(0);
    range.deleteContents();
    range.insertNode(docFragment);

    //create a new range
    range = document.createRange();
    range.setStartAfter(newEle);
    range.collapse(true);

    //make the cursor there
    var sel = window.getSelection();
    sel.removeAllRanges();
    sel.addRange(range);

    return false;
});
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/rooseve/jDvau/3/


Ced*_*Ced 17

document.execCommand('defaultParagraphSeparator', false, 'p');
Run Code Online (Sandbox Code Playgroud)

它会覆盖默认行为以改为使用段落.

在chrome上,enter的默认行为是:

<div>
    <br>
</div>
Run Code Online (Sandbox Code Playgroud)

有了这个命令,它就会成功

<p>
    <br>
</p>
Run Code Online (Sandbox Code Playgroud)

现在它更加线性,很容易只有<br>你需要.


Bla*_*umb 9

使用shift+ enter而不是enter只放入一个<br>标签或将文本包装在<p>标签中.

  • **+ 1**谢谢,这是非常方便的知道,但如果你有一个客户正在写一本书,那将是一个痛苦的*** (8认同)
  • 如果您要粘贴内容,这无济于事 (2认同)

Eli*_*lie 6

contenteditable按下时的行为方式enter取决于浏览器,<div>发生在webkit(chrome,safari)和IE上.

几个月前,我一直在努力,我这样纠正了:

//I recommand you trigger this in case of focus on your contenteditable
if( navigator.userAgent.indexOf("msie") > 0 || navigator.userAgent.indexOf("webkit") > 0 ) {
    //Add <br> to the end of the field for chrome and safari to allow further insertion
    if(navigator.userAgent.indexOf("webkit") > 0)
    {
        if ( !this.lastChild || this.lastChild.nodeName.toLowerCase() != "br" ) {
            $(this).html( $(this).html()+'<br />' );
        }
    }

    $(this).keypress( function(e) {
        if( ( e.keyCode || e.witch ) == 13 ) {
            e.preventDefault();

            if( navigator.userAgent.indexOf("msie") > 0 ) {
                insertHtml('<br />');
            }
            else {
              var selection = window.getSelection(),
              range = selection.getRangeAt(0),
              br = document.createElement('br');

              range.deleteContents();
              range.insertNode(br);
              range.setStartAfter(br);
              range.setEndAfter(br);
              range.collapse(false);

              selection.removeAllRanges();
              selection.addRange(range);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

我希望它会有所帮助,如果它不是那么清楚,我会为我的英语感到抱歉.

编辑:删除jQuery函数的更正jQuery.browser


Jos*_*son 5

您可以<p>为每一行设置单独的标签,而不是使用<br>标签,并且开箱即用地获得更大的浏览器兼容性。

为此,请<p>在 contenteditable div 内放置一个带有一些默认文本的标签。

例如,而不是:

<div contenteditable></div>
Run Code Online (Sandbox Code Playgroud)

用:

<div contenteditable>
   <p>Replace this text with something awesome!</p>
</div>
Run Code Online (Sandbox Code Playgroud)

提琴手

在 Chrome、Firefox 和 Edge 中进行了测试,第二个在每个中都相同。

然而,第一个在 Chrome 中创建 div,在 Firefox 中创建换行符,而在 Edge 中创建 div 光标被放回当前 div 的开头而不是移动到下一个。

在 Chrome、Firefox 和 Edge 中测试。


Gau*_*uss 5

我喜欢使用捕鼠器来处理热键:https ://craig.is/killing/mice

然后,我只是拦截 enter 事件,执行命令insertLineBreak

Mousetrap.bindGlobal('enter', (e)=>{
  window.document.execCommand('insertLineBreak', false, null);
  e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

所有命令:https : //developer.mozilla.org/en-US/docs/Web/API/Document/execCommand

它使用 Chrome 75 和以下可编辑元素工作:

<pre contenteditable="true"></pre>
Run Code Online (Sandbox Code Playgroud)

也可以使用insertHTML

window.document.execCommand('insertHTML', false, "\n");
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

79402 次

最近记录:

6 年,3 月 前