問題描述

我有一個 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><br>');
      // prevent the default behaviour of return key pressed
      return false;
    }
  });

Demo Here

次佳解決方案

你可以通過一個 CSS 更改來做到這一點:

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

pre{
    white-space: pre-wrap;
    background: #EEE;
}

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

第三種解決方案

嘗試這個:

$('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;
});

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

第四種方案

display:inline-block; 的樣式添加到 contenteditable 中,不會在 Chrome 中自動生成 divpspan

第五種方案

使用 shift + enter 代替 enter,將單個<br> 標籤放入或包裝在<p> 標籤中。

第六種方案

我會使用樣式 (Css) 來解決這個問題。

div[contenteditable=true] > div {
  padding: 0;
}

Firefox 確實添加了塊元素中斷,而 Chrome 將每個部分包裝在標籤中。你 css 給 div 一個 10px 的填充以及背景顏色。

div{
  background: skyblue;
  padding:10px;
}

或者,您可以在 jQuery 中複製相同的所需效果:

var style = $('<style>p[contenteditable=true] > div { padding: 0;}</style>');
$('html > head').append(style);

這是你的小提琴 http://jsfiddle.net/R4Jdz/7/的叉子

第七種方案

添加一個防止默認的 div

document.body.div.onkeydown = function(e) {
    if ( e.keycode == 13 ){
        e.preventDefault();
            //add a <br>
        div = document.getElementById("myDiv");
        div.innerHTML += "<br>";
    }
}

第八種方案

嘗試使用 ckeditor 。它也提供像 SOF 這樣的格式。

https://github.com/galetahub/ckeditor

第九種方案

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

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇