Sto tentando di rendere contenteditable che accetta solo testo normale.Contenteditable che consente solo il testo semplice
Quello che voglio è ascoltare l'evento incolla e quindi rimuovere tutto il codice HTML e incollarlo sul contenteditable solo come testo normale.
Per fare ciò ho già provato due diversi approcci, basato su risposte a domande simili, ma questi due approcci hanno problemi.
Primo: Questo non sta usando "incolla" ascoltatore, è invece in ascolto per l'input (non è l'ideale per questo caso), questo era una soluzione per evitare l'uso di Clipboard API.
Problema: Questo funziona bene su Chrome, ma non su Firefox e IE, quando si copia e si incolla il codice html rimuove con successo html e solo incollare il testo, ma quando continuando a scrivere il testo, il cursore viene sempre presa all'inizio del contenteditable.
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);
});
Si può provare qui/code su cui basandomi I:http://jsbin.com/moruseqeha/edit?html,css,js,output
Secondo: Dal momento che il primo non è riuscita e non è l'ascolto di "incollare" evento unico, io' Ho quindi deciso di provarlo utilizzando Clipboard API. Il problema qui è che su IE document.execCommand ("insertHTML", false, text); non sembra funzionare. Funziona su chrome, firefox (testato su v41 e v42) e 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);
});
Si può provare qui: http://jsfiddle.net/marinagon/461uye5p/
Qualcuno può aiutarmi a trovare una soluzione per alcuni di questi problemi o chiunque ha una soluzione migliore di quelli presentati qui?
Sono consapevole che potrei usare textarea, ma ho motivi per non usarlo.
Update - soluzione trovata
ho trovato una soluzione per il secondo approccio. dal document.execCommand ("insertHTML", false, text); non funziona su IE Ho cercato altre soluzioni e ho trovato questo https://stackoverflow.com/a/2925633/4631604.
Qui potete vedere secondo approccio con la soluzione di funzionare bene in tutti i browser http://jsfiddle.net/marinagon/1v63t05q/
Ho utilizzato il 2 ° approccio. (Ti consiglierei auto-risposta e segnalo correttamente). Avevo bisogno di una modifica, che doveva anche controllare 'else if (ev.originalEvent.clipboardData ...' quando 'ev.clipboardData' non è impostato. –
Bella soluzione! Tieni presente che tramite il trascinamento della selezione puoi ancora aggiungi contenuto HTML alla tua area. – Markus
Per i miei scopi, disabilitare la funzione di trascinamento è ok, l'API per questo è ottusa, ma puoi fare qualcosa di simile: 'function blockDragDrop (ev) {ev.dataTransfer.effectAllowed = 'none'; ev.dataTransfer.dropEffect = 'none'; ev.preventDefault(); return false;} el.addEventListener ('dragstart', blockDragDrop); el.addEventListener ('dragover', blockDragDrop); ' (Don Non dimenticare di provvedere alla rimozione degli eventi, se necessario) –