Puoi creare un’area di testo che non modifica automaticamente il tuo testo?

Sto scrivendo uno script che prende il testo da un file e aggiunge / modifica un checksum alla fine (usando un editor di testo come Notepad ++ per andare su / da disco rigido).

La textarea del browser traduce sia \n che \r\n in \n quando si copia / incolla in essa e poi si converte in \n o in \r\n quando si passa a un altro programma (a seconda del sistema operativo in cui ci si trova) . Ciò rende il checksum errato (anche se ignori il mangling di qualsiasi carattere non stampabile nel checksum stesso).

Immagino che potrei essere in grado di bypassare questo con la finestra di dialogo di apertura / salvataggio (a patto che non ci siano sorprese simili qui), ma ci sono altri progetti per cui sarebbe anche utile.

Potresti provare a utilizzare un elemento


con l'attributo contenteditable="true" anziché una textarea . Questo dovrebbe teoricamente conservare l'input.


Modifica I

È ansible intercettare l'evento onpaste e normalizzare tutte le istanze di \r\n a \n e quindi generare il checksum. Il codice JavaScript potrebbe assomigliare a questo:

 var input_el = document.querySelector('.your-textarea'); input_el.onpaste = function(e){ typeof e !== 'undefined' && e.preventDefault(); var clipbd_data; // handle IE edge case if (window.clipboardData && window.clipboardData.getData) { clipbd_data = window.clipboardData.getData('Text').replace(/\r\n/g, "\n").replace(/^(.*)\n*$/gm, "$1"); } else if (e.clipboardData && e.clipboardData.getData) { clipbd_data = e.clipboardData.getData('text/plain').replace(/\r\n/g, "\n").replace(/^(.*)\n*$/gm, "$1"); } else { return; // functionality not supported } input_el.value = clipbd_data; return false; }; 

Nota: non ho provato questo.

Fonte per regex


Modifica II

Intercettare l'evento di copia

Innanzitutto, aggiungi il seguente gestore onclick all'area di testo:

   

Questo è importante, perché stiamo intercettando l'evento di copy - non è come se potessimo prendere i dati esatti che l'utente ha copiato, perché non l'hanno ancora copiato, quindi dobbiamo forzare l'utente a selezionare tutto il testo nel textarea automaticamente così possiamo passare l'intero contenuto della textarea negli appunti (dopo la normalizzazione). Questo dovrebbe essere ciò che l'utente vuole fare comunque, quindi non dovrebbe presentare un problema di usabilità ...

Ora, per intercettare copia e aggiungere il tuo testo:

 var txt_area = document.querySelector('.your-textarea'); txt_area.addEventListener('copy', function(e){ // stop the normal copy behaviour typeof e !== 'undefined' && e.preventDefault(); // get the contents of the textarea var txt_before = txt_area.value; // normalise var txt_after = txt_before.replace(/\r\n/g, "\n").replace(/^(.*)\n*$/gm, "$1"); e.clipboardData.setData('text/plain', txt_after); }); 

Sembra che questo possa essere imansible, quindi sto postando un’altra domanda sull’utilizzo di un approccio diverso per ottenere dati da javascript su un file senza che sia danneggiato. Vedi ” Mantieni blob javascript dalla modifica dei dati quando salvi il file ”