javascript - contenteditable'in ENTER tuşuna basıldığında <div> eklemesini önleme - Chrome


Bir contenteditable öğem var ve ne zaman bir şeyler yazıp ENTER tuşuna bassam yeni bir <div> oluşturuyor ve yeni satırdaki metni oraya yerleştiriyor. Bunu bir türlü sevmiyorum.

Bunun olmasını önlemek ya da en azından sadece <br> ile değiştirmek mümkün mü?

İşte demo http://jsfiddle.net/jDvau/

Not: Bu Firefox'ta bir sorun değildir.

Cevap #1

Bunu dene:

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

Demo için buraya tıklayın

Cevap #2

contenteditable öğesine display:inline-block; stilini ekleyin, Chrome'da otomatik olarak div, p ve span oluşturmaz.

Cevap #3

Bunu sadece bir CSS değişikliği ile yapabilirsiniz:

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

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

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

Cevap #4

Bu tüm major tarayıcılarda (Chrome, Firefox, Safari, Edge) çalışır

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>

Bir rahatsızlık var. Düzenlemeyi bitirdikten sonra, öğelerin içinde son <br> etiketi bulunabilir. Ancak gerekirse bunu kısaltmak için kod ekleyebilirsiniz.

Sonraki <br> öğesini kaldırmak için bu cevabı kontrol edin https://stackoverflow.com/a/61237737/670839

Cevap #5

document.execCommand('defaultParagraphSeparator', false, 'p');

Varsayılan davranışın yerine paragrafa sahip olmayı sağlar.

Chrome'da enter tuşunun varsayılan davranışı şudur:

<div>
    <br>
</div>

O komutla olacak

<p>
    <br>
</p>

Artık daha lineer olduğu için, sadece <br> kullanmanız yeterli olur.

Cevap #6

Bunu dene:

$('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/

Cevap #7

W3C Editör Taslağında, ContentEditable içine durum eklemekle ilgili bazı bilgiler var ve enter tuşuna basıldığında tarayıcının yeni eleman eklemesini önlemek için plaintext-only kullanabilirsiniz.

<div contentEditable="plaintext-only"></div>

Cevap #8

enter yerine sadece tek bir <br> etiketi eklemek için veya metninizi <p> etiketleriyle sarmak için shift+enter kullanın.

İlgili makaleler