我有一个contenteditable
元素,每当我输入一些内容并按下ENTER
键时,它就会创建一个新的<div>
并将新行文本放在里面。我不喜欢这个方式。
是否有可能阻止这种情况发生,或者至少用<br>
替换它?
这里是演示http://jsfiddle.net/jDvau/
注意:在firefox中不存在此问题。
我有一个contenteditable
元素,每当我输入一些内容并按下ENTER
键时,它就会创建一个新的<div>
并将新行文本放在里面。我不喜欢这个方式。
是否有可能阻止这种情况发生,或者至少用<br>
替换它?
这里是演示http://jsfiddle.net/jDvau/
注意:在firefox中不存在此问题。
试试这个:
$('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/>');
// prevent the default behaviour of return key pressed
return false;
}
});
display:inline-block;
添加到contenteditable
,它将不会自动生成div
,p
和span
标签在Chrome浏览器中。*[contenteditable="true"]{display: inline-block;}
- ericjbasti你可以仅通过 CSS 修改来实现此操作:
div{
background: skyblue;
padding:10px;
display: inline-block;
}
pre{
white-space: pre-wrap;
background: #EEE;
}
此功能在所有主要浏览器(Chrome,Firefox,Safari,Edge)中均可使用。
document.addEventListener('keydown', event => {
if (event.key === 'Enter') {
document.execCommand('insertLineBreak')
event.preventDefault()
}
})
<div class="element" contenteditable="true">Sample text</div>
<p class="element" contenteditable="true">Sample text</p>
有一个不便之处是,在编辑完成后,元素内可能会包含一个结尾的<br>
。但如果需要,您可以添加代码来修剪它。
查看此答案以删除结尾的<br>
https://dev59.com/C13Ua4cB1Zd3GeqP8gjw#61237737
contentEditable="plaintext-only"
的浏览器非常有效,并且几乎可以被所有浏览器使用。 - KeitelDOGdocument.execCommand('defaultParagraphSeparator', false, 'p');
它覆盖了默认行为,以使段落成为默认行为。
在 Chrome 上,默认的回车键行为是:
<div>
<br>
</div>
有了那个命令,它就会变成这样
<p>
<br>
</p>
现在它更线性了,只需要<br>
就可以了。
br
而没有额外的 p
标签。 - Max试试这个:
$('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;
});
$(this).trigger('input')
的内容。 - LarsWW3C编辑草案中提供了一些关于将状态添加到可编辑内容( ContentEditable )的信息,为了防止在按下回车键时浏览器添加新元素,可以使用plaintext-only
。
<div contentEditable="plaintext-only"></div>
使用shift+enter代替enter,只能插入一个单一的<br>
标签,或者将文本包装在<p>
标签中。
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);
}
}
});
}
我希望这篇文章能够帮助到你,如果我的英语不够清晰,对此我感到抱歉。
编辑:移除了jQuery函数jQuery.browser
的修正。
jQuery.browser
不再是 jQuery 的一部分。 - iConnornavigator.userAgent.indexOf("msie") > 0
和 navigator.userAgent.indexOf("webkit") > 0
这样的东西。 - Elieif( ( e.keyCode || e.witch ) == 13 ) { ... }
改为 if (e.keyCode === 13 || e.which === 13) { ... }
。 - Sebastian Sandqvist<p>
标签,而不是使用<br>
标签,这样可以获得更好的浏览器兼容性。<p>
标签。<div contenteditable></div>
使用:
<div contenteditable>
<p>Replace this text with something awesome!</p>
</div>
在Chrome,Firefox和Edge中测试,第二个在每个浏览器中都可以正常工作。
然而,第一个在Chrome中创建div,在Firefox中创建换行符,在Edge中创建div并且光标被放回到当前div的开头而不是移动到下一个div。
在Chrome,Firefox和Edge中测试过。