Disabilita l'incolla del testo nel modulo HTML


96

Esiste un modo utilizzando JavaScript per disabilitare la possibilità di incollare il testo in un campo di testo su un modulo HTML?

Ad esempio, ho un semplice modulo di registrazione in cui l'utente è tenuto a inserire la propria email due volte. La seconda voce di posta elettronica serve per verificare che non siano presenti errori di battitura nella prima voce di posta elettronica. Tuttavia, se l'utente copia / incolla la propria email, ciò vanifica lo scopo e ho riscontrato problemi con gli utenti perché hanno inserito l'email sbagliata e l'hanno copiata / incollata.

Forse non ero chiaro sulla mia domanda, ma non sto cercando di impedire alle persone di copiare (o trascinare la selezione) del testo sul proprio browser. Voglio solo impedire loro di incollare l' input in un campo di testo per ridurre al minimo l'errore dell'utente.

Forse invece di usare questo "hack" puoi suggerire un'altra soluzione al problema centrale di quello che sto cercando di risolvere qui? Ho eseguito meno di una mezza dozzina di test utente e questo è già successo due volte. Il mio pubblico non ha un alto livello di competenza informatica.


111
Impedire alle persone di copiare / incollare il proprio indirizzo e-mail dalla rubrica al browser. Andrà bene.
Quentin

28
Non posso fare molto quando è un cliente che insiste sul cambiamento. goditi il ​​tuo drink :)
justinl

15
Potrebbe andare benissimo se disabilita l'incollaggio nel campo di verifica solo quando l'email NON è stata incollata nel campo originale. In altre parole, l'utente dovrà incollare l'email in entrambi i campi o in nessuno dei due.
GJ.

25
Se un cliente lo richiede, digli quanto sia pessima un'idea. È un ottimo modo per far incazzare un cliente proprio nel punto in cui è più probabile che se ne vada (al momento della registrazione). Non vuoi che una relazione con il cliente inizi con il cliente alienato. Questa pratica sta diventando sempre più comune e sempre più discutibile poiché sempre più persone utilizzano gestori di password. Vedi anche: ux.stackexchange.com/q/21062/9529 e ob. xkcd: xkcd.com/970
Mark Booth

Ho trovato questa domanda mentre cercavo come sconfiggere questa "funzionalità" con l'ispettore di elementi. Ha funzionato!
SVD

Risposte:


53

Recentemente ho dovuto disabilitare a malincuore l'incollaggio in un elemento del modulo. Per farlo, ho scritto un'implementazione cross-browser * del gestore di eventi onpaste di Internet Explorer (e di altri). La mia soluzione doveva essere indipendente da qualsiasi libreria JavaScript di terze parti.

Ecco cosa mi è venuto in mente. Non disabilita completamente l'incollaggio (l'utente può incollare un singolo carattere alla volta, ad esempio), ma soddisfa le mie esigenze ed evita di avere a che fare con i keyCodes, ecc.

// Register onpaste on inputs and textareas in browsers that don't
// natively support it.
(function () {
    var onload = window.onload;

    window.onload = function () {
        if (typeof onload == "function") {
            onload.apply(this, arguments);
        }

        var fields = [];
        var inputs = document.getElementsByTagName("input");
        var textareas = document.getElementsByTagName("textarea");

        for (var i = 0; i < inputs.length; i++) {
            fields.push(inputs[i]);
        }

        for (var i = 0; i < textareas.length; i++) {
            fields.push(textareas[i]);
        }

        for (var i = 0; i < fields.length; i++) {
            var field = fields[i];

            if (typeof field.onpaste != "function" && !!field.getAttribute("onpaste")) {
                field.onpaste = eval("(function () { " + field.getAttribute("onpaste") + " })");
            }

            if (typeof field.onpaste == "function") {
                var oninput = field.oninput;

                field.oninput = function () {
                    if (typeof oninput == "function") {
                        oninput.apply(this, arguments);
                    }

                    if (typeof this.previousValue == "undefined") {
                        this.previousValue = this.value;
                    }

                    var pasted = (Math.abs(this.previousValue.length - this.value.length) > 1 && this.value != "");

                    if (pasted && !this.onpaste.apply(this, arguments)) {
                        this.value = this.previousValue;
                    }

                    this.previousValue = this.value;
                };

                if (field.addEventListener) {
                    field.addEventListener("input", field.oninput, false);
                } else if (field.attachEvent) {
                    field.attachEvent("oninput", field.oninput);
                }
            }
        }
    }
})();

Per utilizzarlo per disabilitare l'incollaggio:

<input type="text" onpaste="return false;" />

* So che oninput non fa parte delle specifiche DOM W3C, ma tutti i browser con cui ho testato questo codice — Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 — supportano oninput o onpaste. Di tutti questi browser, solo Opera non supporta onpaste, ma supporta oninput.

Nota: non funzionerà su una console o un altro sistema che utilizza una tastiera su schermo (supponendo che la tastiera su schermo non invii i tasti al browser quando ogni tasto è selezionato). Se è possibile che la tua pagina / app possa essere utilizzata da qualcuno con una tastiera su schermo e Opera (ad esempio: Nintendo Wii, alcuni telefoni cellulari), non utilizzare questo script a meno che tu non abbia testato per assicurarti che la tastiera su schermo invia le chiavi al browser dopo ogni selezione di chiave.


58
Per impedire a Firefox di obbedire a questa stupida regola, vai a about: config e cambia dom.event.clipboardevents.enabled in false
lolesque

1
anche se non includo il js che hai scritto, sono in grado di impedire all'utente di incollare qualsiasi cosa semplicemente includendo onpaste="return false", c'è qualche problema se seguo questo approccio
viveksinghggits

@viveksinghggits Il codice viene implementato onpastenei browser che non lo forniscono già. Dici " Sono in grado di impedire all'utente di incollare qualsiasi cosa ", ma in quali browser l'hai testato?
AnnanFay

Per quanto riguarda l'implementazione vedo due evidenti miglioramenti: 1) esegui il codice solo nei browser in cui onpaste non è già supportato, 2) riesegui quando il DOM viene modificato - attualmente non verrà applicato agli input aggiunti dinamicamente.
AnnanFay

@ Rick, quindi stai bene con le aree di testo in cui gli utenti possono incollare qualsiasi cosa? Perché si aspetteranno che appaia esattamente lo stesso in altre schermate in cui vengono visualizzati i dati incollati e si aspetteranno che sia esattamente lo stesso quando i dati vengono inseriti in un'e-mail. Per me, non voglio le telefonate e le e-mail di supporto che arriveranno con quello. Per disabilitare l'incollaggio in un particolare campo è un'opzione e una domanda praticabili, IMHO. Il problema che la maggior parte di noi ha è quando usiamo "Rich Text Editors" - queste cose sembrano sovrascrivere qualsiasi comando javascript o jquery sia presente per evitare di incollare.
McAuley

144

Non farlo. Non scherzare con il browser dell'utente. Copiando e incollando in un campo di conferma di posta elettronica, l'utente si assume la responsabilità di ciò che digita. Se sono così stupidi da copiare e incollare un indirizzo difettoso (è successo a me), allora è colpa loro.

Se vuoi assicurarti che la conferma dell'e-mail funzioni, chiedi all'utente di controllare la propria posta mentre il tuo sito attende ("Per favore apri il tuo programma di webmail in una nuova finestra"). Mostra l'indirizzo e-mail in grandi lettere grosse ("L'e-mail di conferma è stata inviata a .... ha fatto un errore? Fare clic qui per modificare).

Ancora meglio, se puoi, lascia che l'utente abbia un accesso limitato senza confermare. In questo modo potranno accedere immediatamente e tu aumenterai le tue possibilità di restare in contatto con il visitatore anche se la mail di conferma è bloccata per altri motivi (es. Filtri antispam).


6
Sono d'accordo con la tua risposta per uno scenario in cui gli utenti inseriscono i dati stessi. Tuttavia, quando un utente immette un indirizzo e-mail per conto di qualcun altro, ad esempio un sistema CRM o simile, non è possibile implementare la soluzione. In questi casi, l'utente non sta inserendo il proprio indirizzo e-mail, quindi è probabile che lo scriva in modo errato. Se consenti di incollare nella casella di conferma dell'e-mail, riceverai molti dati errati, quindi non c'è nulla di sbagliato nell'impedire l'incolla. In qualità di sviluppatore devi mitigare gli utenti "abbastanza stupidi" da proteggere i dati aziendali.
theyetiman

12
C'è anche il caso comune in cui lo sviluppatore che esamina questa domanda ha poco o nessun controllo sui requisiti del progetto su cui sta lavorando. Questa non è una risposta alla domanda che viene posta qui, quindi -1.
Nick

4
Dire di non farlo non risponde alla domanda. Al momento ho un requisito in cui la pasta deve essere disabilitata.
Darian Everett

13
se ti viene mai dato un requisito come questo, è il tuo lavoro di professionista respingerlo. sei più di un paio di mani che sanno scrivere codice.
Dan Pantry

2
Ma ci sono ragioni valide per quasi tutto e non rispondere alla domanda di qualcuno perché non pensi che il LORO motivo sia valido è irritante. Supponiamo che tu abbia un quiz che stavi cercando di implementare con risposte complesse. Disabilitare l'incolla e costringere lo studente a digitare l'intera risposta invece di copiare incolla gli farebbe impegnare la risposta in memoria, mentre solo un copia incolla sarebbe probabilmente inutile. C'è un motivo valido per farlo. Avvisa qualcuno che quello che sta cercando di fare non è una buona idea nella maggior parte dei casi, ma dai una risposta ... o è meglio non preoccuparti di rispondere.
Halfhoot

69

Aggiungi una classe di 'disablecopypaste' agli input su cui desideri disabilitare la funzionalità di copia incolla e aggiungi questo script jQuery

  $(document).ready(function () {
    $('input.disablecopypaste').bind('copy paste', function (e) {
       e.preventDefault();
    });
  });

1
Funziona bene per me, carri armati!
Gabriel Glauber

26

Appena ottenuto, possiamo realizzarlo usando onpaste:"return false", grazie a: http://sumtips.com/2011/11/prevent-copy-cut-paste-text-field.html

Abbiamo varie altre opzioni disponibili come elencato di seguito.

<input type="text" onselectstart="return false" onpaste="return false;" onCopy="return false" onCut="return false" onDrag="return false" onDrop="return false" autocomplete=off/><br>

16

Puoi ..... ma non farlo.

Non dovresti alterare il comportamento predefinito del browser di un utente. È davvero una cattiva usabilità per la tua applicazione web. Inoltre, se un utente desidera disabilitare questo hack, può semplicemente disabilitare javascript sul proprio browser.

Basta aggiungere questi attributi alla casella di testo

ondragstart=”return false onselectstart=”return false

6
la domanda riguarda la disabilitazione dell'incolla. questa tecnica renderebbe solo la copia difficile e non avrà alcun effetto sull'incollaggio.
bendman

10

Idea folle: richiedi all'utente di inviarti un'e-mail come parte del processo di registrazione. Questo sarebbe ovviamente scomodo quando fare clic su un collegamento mailto non funziona (se usano la webmail, ad esempio), ma lo vedo come un modo per garantire contemporaneamente contro gli errori di battitura e confermare l'indirizzo email.

Andrebbe così: compilano la maggior parte del modulo, inserendo il loro nome, password e quant'altro. Quando inviano push, in realtà fanno clic su un collegamento per inviare posta al tuo server. Hai già salvato le loro altre informazioni, quindi il messaggio include solo un token che dice a quale account è destinato.


Ah, è un'idea geniale.
justinl

7

Che ne dici di inviare un'e-mail di conferma all'indirizzo e-mail che l'utente ha appena inserito due volte in cui è presente un collegamento a un URL di conferma sul tuo sito, quindi sai che hanno ricevuto il messaggio?

Chiunque non faccia clic per confermare la ricezione dell'e-mail potrebbe aver inserito il proprio indirizzo e-mail in modo errato.

Non una soluzione perfetta, ma solo alcune idee.


4
Al momento ho questa implementazione. Il problema è che l'utente pensa di non ricevere l'email a causa di un nostro errore perché controlla il proprio indirizzo email che pensa di aver inserito e non ha l'email. Inoltre, ciò che accade è che quando provano a registrarsi nuovamente, il nome utente che hanno utilizzato ora non è disponibile perché è bloccato con quell'indirizzo email errato.
justinl

Tnen potrebbe aggiungere un flusso di lavoro / codice che esegue tutti i giorni ripulendo i nomi utente che non sono stati confermati per diciamo 2 giorni.
Colin

1
Grazie per il commento. Il mio pensiero è che se provassi a creare un account su un sito web e dicessi che il tuo nome utente è stato preso, torneresti di nuovo tra 2 giorni e proveresti di nuovo? Molto probabilmente i miei pensieri non lo sono. O hai creato un nuovo account con un nome utente diverso lo stesso giorno o non ti sei preso la briga di tornare sul sito perché non riuscivi a capire come registrarti e il sito era "troppo complicato".
justinl

8
Per continuare quello che sta dicendo Colin, potresti presumere che quando qualcuno sta tentando di registrarsi nuovamente con lo stesso nome utente e un indirizzo e-mail diverso e non ha risposto al messaggio di conferma, probabilmente è giusto che lo faccia. Potresti scoprire che le persone leggono correttamente il loro dominio nella loro e-mail ma scrivono male il loro nome utente e potresti usarlo per determinare ulteriormente quando qualcuno ha commesso un errore?
Richard Lucas il

1
Mi piace molto l'idea di consentire agli utenti di registrarsi nuovamente che non hanno ancora confermato le informazioni sull'account. Penso che questa soluzione progettuale sia migliore della mia soluzione tecnica proposta originale. Sentire da tutti gli altri che cambiare questa funzionalità del browser predefinito era una cattiva idea era ciò di cui avevo bisogno per trovare una soluzione migliore.
justinl

7

Puoi usare jquery

File HTML

<input id="email" name="email">

codice jquery

$('#email').bind('copy paste', function (e) {
        e.preventDefault();
    });

6

Estendendo la risposta di @boycs , consiglierei di usare anche "on".

$('body').on('copy paste', 'input', function (e) { e.preventDefault(); });

Questo metodo è utile se si prevede di applicare lo script a elementi del modulo aggiunti dinamicamente.
Matteo

3

se devi utilizzare 2 campi e-mail e sei preoccupato che l'utente incolli in modo errato la stessa e-mail errata dal campo 1 al campo 2, direi che mostra un avviso (o qualcosa di più sottile) se l'utente incolla qualcosa nel secondo campo e-mail

document.querySelector('input.email-confirm').onpaste = function(e) {
    alert('Are you sure the email you\'ve entered is correct?');
}

in questo modo non disabiliti l'incolla, dai loro un semplice promemoria per controllare che ciò che hanno presumibilmente digitato nel primo campo e poi incollato nel secondo campo sia corretto.

tuttavia, forse è sufficiente un singolo campo di posta elettronica con il completamento automatico attivato. è probabile che prima o poi abbiano compilato correttamente la loro email su un altro sito e il browser suggerirà di riempire il campo con quell'email

<input type="email" name="email" required autocomplete="email">

2

È possibile allegare un listener "keydown" alla casella di input per rilevare se vengono premuti o meno i tasti Ctrl + V e, in tal caso, interrompere l'evento o impostare il valore della casella di input su "".

Tuttavia, ciò non gestirà il clic con il pulsante destro del mouse e incollare o incollare dal menu Modifica del browser. Potrebbe essere necessario aggiungere un contatore "ultima lunghezza" al listener keydown e utilizzare un intervallo per controllare la lunghezza corrente del campo per vedere se aumenta dall'ultima pressione di un tasto.

Nessuno dei due è consigliato, però. I campi modulo con incolla disabilitata sono estremamente frustranti. Sono in grado di digitare correttamente la mia email la prima volta, quindi mi riservo il diritto di incollarla nella seconda casella.


Non fare clic con il pulsante destro del mouse o anche qualsiasi cosa da Apple, Unix o ctrl-in e che ne dici di iPhone?
Martlark

Inoltre, non sono un grande fan della disabilitazione del campo di input in quanto lo trovo frustrante. Ma quali sono le altre opzioni per fermare questo tipo di errore dell'utente? O quale soluzione finirà con le registrazioni degli utenti completate meno in modo errato? Sembra un po 'fastidioso dover digitare di nuovo manualmente un indirizzo e-mail, ma se salverà potenziali clienti frustrati, preferirei costringere gli utenti a digitare manualmente qualcosa in un campo di input. Penso che non sia un grosso inconveniente e la quantità di frustrazione che potrebbe salvare qualcuno da un semplice errore potrebbe essere la cosa giusta. Pensieri?
justinl

2

Aggiungi un secondo passaggio al processo di registrazione. Prima pagina come al solito, ma al ricaricamento, visualizza una seconda pagina e chiedi di nuovo l'email. Se è così importante, l'utente può gestirlo.


1

a partire dal

Alcuni potrebbero suggerire di utilizzare Javascript per acquisire le azioni degli utenti, come fare clic con il pulsante destro del mouse o le combinazioni di tasti Ctrl + C / Ctrl + V e quindi interrompere l'operazione. Ma questa ovviamente non è la soluzione migliore o più semplice. La soluzione è integrata nelle proprietà del campo di input stesso insieme ad alcuni eventi che catturano utilizzando Javascript.

Per disabilitare il completamento automatico dei browser, è sufficiente aggiungere l'attributo al campo di input. Dovrebbe assomigliare a qualcosa di simile a questo:

<input type="text" autocomplete="off">

E se vuoi negare Copia e Incolla per quel campo, aggiungi semplicemente l'evento Javascript che cattura le chiamate oncopy, onpaste e oncut e rendile false, in questo modo:

<input type="text" oncopy="return false;" onpaste="return false;" oncut="return false;">

Il passaggio successivo consiste nell'usare onselectstart per negare all'utente la selezione del contenuto del campo di input, ma attenzione: funziona solo per Internet Explorer. Il resto di quanto sopra funziona alla grande su tutti i principali browser: Internet Explorer, Mozilla Firefox, Apple Safari (su Windows OS, almeno) e Google Chrome.


Sebbene questo possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento per riferimento.
Kev

yaah, mi prenderò cura la prossima volta in poi
vaichidrewar

1
Perché non iniziare ora descrivendo ciò che è "spiegato molto bene", è così che ottieni voti positivi e una migliore rappresentanza :)
Kev

Quale giustificazione può esserci per (provare a) disattivare il completamento automatico? "Odiamo i nostri utenti!" ? Se stai cercando di essere il nemico dell'utente, ti odieranno mentre alla fine vinceranno ancora, perché controllano il browser.
Jan Hertsens

1

Verifica la validità del record MX dell'host dell'email fornita. Questo può eliminare gli errori a destra del segno @.

È possibile farlo con una chiamata AJAX prima dell'invio e / o lato server dopo l'invio del modulo.


1

Usando jquery, puoi evitare di copiare, incollare e tagliare usando questo

$('.textboxClass').on('copy paste cut', function(e) {
    e.preventDefault();
});

Grazie. Funzionava davvero come dovrebbe.
Juergen

1

Uso questa soluzione JS vanigliata:

const element = document.getElementById('textfield')
element.addEventListener('paste', e =>  e.preventDefault())



0

Soluzione semplice: basta invertire il processo di registrazione: invece di richiedere la conferma alla fine del processo di registrazione, richiedere la conferma all'inizio di esso! Cioè il processo di registrazione è iniziato con un semplice modulo che richiedeva l'indirizzo e-mail e nient'altro. Al momento dell'invio, un'e-mail con collegamento a una pagina di conferma univoca all'indirizzo e-mail inviato. L'utente va su quella pagina, quindi verranno richieste le altre informazioni per la registrazione (nome utente, nome completo, ecc.).

Questo è semplice poiché il sito Web non ha nemmeno bisogno di memorizzare nulla prima della conferma, l'indirizzo e-mail può essere crittografato con una chiave e allegato come parte dell'indirizzo della pagina di conferma.


0

Ho fatto qualcosa di simile a questo per http://bookmarkchamp.com - lì volevo rilevare quando un utente ha copiato qualcosa in un campo HTML. L'implementazione che mi è venuta in mente è stata di controllare costantemente il campo per vedere se in qualsiasi momento c'era improvvisamente un sacco di testo lì dentro.

In altre parole: se una volta milisecondo fa non c'era testo, e ora ci sono più di 5 caratteri ... allora l'utente probabilmente ha incollato qualcosa nel campo.

Se vuoi vederlo funzionare in Bookmarkchamp (devi essere registrato), incolla un URL nel campo URL (o trascina e rilascia un URL lì dentro).


0

Il modo in cui risolverei il problema della conferma di un indirizzo email è il seguente:

  1. Prima di eseguire il processo principale, ad esempio la registrazione dell'utente, chiedigli di inserire il proprio indirizzo e-mail.
  2. Genera un codice univoco e invialo a quell'indirizzo email.
  3. Se l'utente ha inserito l'indirizzo email corretto, riceverà il codice.
  4. L'utente deve inserire tale codice insieme al proprio indirizzo e-mail e alle altre informazioni richieste, in modo da poter completare la registrazione. - Si prega di notare che se questa volta viene inserito un indirizzo e-mail (o un codice errato) sbagliato, perché non corrisponde al codice, la registrazione non andrà a buon fine e l'utente verrà immediatamente informato.
  5. Se l'indirizzo e-mail, il codice e altre informazioni di registrazione sono stati inseriti correttamente, la registrazione è completa e l'utente può iniziare a utilizzare il sistema immediatamente. - non è necessario rispondere a qualsiasi altro indirizzo email per attivare il proprio account

Per una maggiore sicurezza, il codice dovrebbe avere una durata limitata e dovrebbe essere consentito solo una volta nel processo di registrazione. Inoltre, per prevenire eventuali applicazioni robotiche dannose, è meglio accompagnare il primo passaggio con captcha o un meccanismo simile.


0

Puoi disabilitare l'opzione copia incolla di jQuery tramite lo script seguente. jQuery ("input"). attr ("onpaste", "return false;");

o utilizzando l' attributo oppaste sotto nei campi di input.

onpaste = "return false;"


-1
Hope below code will work :

<!--Disable Copy And Paste-->
<script language='JavaScript1.2'>
function disableselect(e){
return false
}
function reEnable(){
return true
}
document.onselectstart=new Function ("return false")
if (window.sidebar){
document.onmousedown=disableselect
document.onclick=reEnable
}
</script>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.