2016-01-13 15 views
14

Ich versuche, eine contenteditable zu machen, die nur reinen Text akzeptiert.Contenteditable erlaubt nur Klartext

Was ich will, ist zu hören, um Ereignis einfügen und dann entfernen Sie alle HTML-und fügen Sie es auf den Contentable nur als Nur-Text.

Um dies zu tun, habe ich bereits zwei verschiedene Ansätze ausprobiert, basierend auf Antworten auf ähnliche Fragen, aber diese beiden Ansätze haben Probleme.

Erstens: Dies nicht „Einfügen“ Hörer verwendet, anstatt für die Eingabe hört (nicht ideal für diesen Fall), dies war eine Lösung zu vermeiden Clipboard API verwenden.

Problem: Dies funktioniert gut auf Chrom aber nicht auf Firefox und IE, wenn Sie kopieren und fügen Sie den HTML es erfolgreich html und nur Einfügen von Text entfernt, aber wenn der Text zu schreiben, weiterhin wird die caret immer genommen bis zum Anfang der Zufriedenheit.

function convertToPlaintext() { 
    var textContent = this.textContent; 
    this.textContent = textContent; 
} 

var contentEditableNodes = document.querySelectorAll('.plaintext[contenteditable]'); 

[].forEach.call(contentEditableNodes, function(div) { 
    div.addEventListener("input", convertToPlaintext, false); 
}); 

Sie können es versuchen, hier/Code auf dem ich zugrunde:http://jsbin.com/moruseqeha/edit?html,css,js,output

Zweitens: Da die erste ausgefallen und hören nicht auf „Einfügen“ Ereignis nur, ich Ich habe dann beschlossen, es mit zu versuchen. Das Problem hier ist, dass auf IE document.execCommand ("insertHTML", false, Text); scheint nicht zu funktionieren. Dies funktioniert auf Chrome, Firefox (getestet auf V41 und V42) und Edge.

document.querySelector(".plaintext[contenteditable]").addEventListener("paste", function(e) { 
    e.preventDefault(); 
    var text = ""; 
    if (e.clipboardData && e.clipboardData.getData) { 
    text = e.clipboardData.getData("text/plain"); 
    } else if (window.clipboardData && window.clipboardData.getData) { 
    text = window.clipboardData.getData("Text"); 
    } 
    document.execCommand("insertHTML", false, text); 
}); 

Sie können es hier versuchen: http://jsfiddle.net/marinagon/461uye5p/

Kann mir jemand helfen, eine Lösung für einige dieser Probleme zu finden oder jemand eine bessere Lösung als die hier Beschenkten?

Ich bin mir bewusst, dass ich textarea verwenden konnte, aber ich habe Gründe, es nicht zu verwenden.


Update - Lösung gefunden

ich eine Lösung für den zweiten Ansatz gefunden. Seit document.execCommand ("insertHTML", false, text); funktioniert nicht auf IE Ich habe nach anderen Lösungen gesucht und diese https://stackoverflow.com/a/2925633/4631604 gefunden.

Hier können Sie zweite Ansatz mit Lösung funktioniert gut in allen Browsern sehen http://jsfiddle.net/marinagon/1v63t05q/

+1

Ich habe Ihren zweiten Ansatz verwendet. (Ich würde Ihnen empfehlen, sich selbst zu antworten, und markieren Sie es richtig). Ich brauchte eine Änderung, die auch auf 'else if (ev.originalEvent.clipboardData ... 'überprüfen sollte, wenn' ev.clipboardData' nicht gesetzt ist. –

+0

Schöne Lösung! Bedenken Sie, dass Sie per Drag and Drop immer noch können fügen Sie HTML-Inhalt zu Ihrem Bereich hinzu – Markus

+0

Für meine Zwecke war das Deaktivieren von Drag & Drop in Ordnung, die API dafür ist stumpf, aber Sie können so etwas tun: 'function blockDragDrop (ev) {ev.dataTransfer.effectAllowed = 'none'; ev.dataTransfer.dropEffect = 'keine'; ev.preventDefault(); return false;} el.addEventListener ('dragstart', blockDragDrop); el.addEventListener ('dragover', blockDragDrop); ' (Don Vergessen Sie nicht, die Ereignisse bei Bedarf zu entfernen. –

Antwort

3

Verwenden Sie ein textarea Element anstelle eines contentEditable Element: (Hervorhebung von mir)

Das textarea Element darstellt eine mehrzeilige Nur-Text-Bearbeitung Steuerelement für den Rohwert des Elements.

Beispiel:

/* Auto resize height */ 
 
var textarea = document.querySelector('textarea'); 
 
(textarea.oninput = function() { 
 
    textarea.style.height = 0; 
 
    textarea.style.height = textarea.scrollHeight + 'px'; 
 
})();
textarea { width: 100%; }
<textarea>Hello! You can edit my content. But only plain-text!!!</textarea>

+3

Danke, aber ich versuche, textarea zu vermeiden, da ich einen Textbereich, der autogrow/autosize möchte, wie der Benutzer Text eingibt, ohne die Notwendigkeit von externen Abhängigkeiten und selbst diese Abhängigkeiten haben sich als nicht so gut arbeiten. – Marina

+3

@Marina AutoSizing ein Textfeld ist wahrscheinlich viel einfacher als Hijacking Paste. – Oriol

+4

noch einmal für Ihre Antwort, aber ich entschied mich für die Lösung, die bei der Frage Update gefunden werden.Der Grund ist die Seite zu vermeiden, jedes Mal neu zu malen, wenn der Benutzer etwas eingibt : http://jsfiddle.net/marinagon/z1uxL23p/ – Marina

4

Schmutzige Hack die eingefügten Daten zu reinigen.

function onpaste(e, el){ 
     setTimeout(function(){ 
      el.innerText = el.innerText; 
     }, 10); 
} 
Verwandte Themen