【问题标题】:New line is not working in editable div新行在可编辑的 div 中不起作用
【发布时间】:2015-02-01 19:10:44
【问题描述】:

这是HTML代码:

<div id="messageBox" contenteditable="true" class="message"></div>

这是 jquery:

$('#messageBox').keydown(function(e) {
        if (e.ctrlKey && e.keyCode == 13)
        {
            $(this).html($(this).html() + "<br>");
        }
    }).keypress(function(e) {
        if(e.keyCode == 13)
        {
            $('#send').trigger('click');
            return false;
        }
    });

我想按 Ctrl+Enter 创建一个新行,但它不起作用。光标没有移动。
JS FIDDLE

【问题讨论】:

  • 那是因为&lt;br&gt;后面什么都没有。它被插入,但浏览器不显示它。您可以通过将"&lt;br&gt;" 更改为"&lt;br&gt;foo" 来验证这一点。
  • 它对我来说工作正常,刚刚在 Chrome 和 Firefox 中尝试过你的小提琴
  • 光标不动。
  • 更改元素的整个 HTML 有点粗鲁。您可以在 contenteditable 中的任何位置使用 Range 对象来add a new-line

标签: javascript jquery html


【解决方案1】:

有一种方法可以为您服务,我将在下面提供。我建议您使用&lt;br /&gt; 预先填充您的&lt;div&gt;

<div id="messageBox" contenteditable="true" class="message">
    <br />
</div>

虽然看起来很奇怪,但它为浏览器提供了一个“锚点”,可以将光标置于启动位置。如果您删除它并第一次尝试“添加新行”,您会注意到奇怪的行为。此外,正如 cmets 所建议的那样,您每次都在覆盖您的 html,这可能会产生大量开销和不良行为,具体取决于您的项目的参与程度,因此对于这个示例,我只是简单地附加 $(this).append('&lt;br /&gt;')

JSFiddle Link

function placeCaretAtEnd(el) {
    el.focus();
    if (typeof window.getSelection != 'undefined'
            && typeof document.createRange != 'undefined') {
        var range = document.createRange();
        range.selectNodeContents(el);
        range.collapse(false);
        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else if (typeof document.body.createTextRange != 'undefined') {
        var textRange = document.body.createTextRange();
        textRange.moveToElementText(el);
        textRange.collapse(false);
        textRange.select();
    }
}

$('#messageBox')
    .keydown(function(e) {
        if (e.ctrlKey && e.keyCode == 13) {            
            $(this).append('<br />');    
            placeCaretAtEnd($('#messageBox').get(0));
        }
    }).keypress(function(e) {
        if(e.keyCode == 13) {
            $('#send').trigger('click');
            return false;
        }
});

【讨论】:

    【解决方案2】:

    示例对我来说很好用。确保您的浏览器支持 contenteditable。以下是支持它的浏览器列表。

    Chrome  4.0+
    Safari  3.1+
    Mobile Safari   5.0+
    Firefox 3.5+
    Opera   9.0+
    Opera Mini/Mobile   N/A
    Internet Explorer   5.5+
    Android 3.0+
    

    此外,在相同情况下,您可能需要将其包装在具有 contenteditable="false" 的容器中。

    光标不会移动,因为您只是在附加文本。检查这里如何将光标移动到末尾How can you move the cursor to the last position of a textarea in Javascript?

    【讨论】:

    • 新行已创建,但光标不移动,第一行将写入文本。
    • 检查我更新的答案,显示如何将光标移动到行尾
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多