Come rilevare Ctrl + V, Ctrl + C utilizzando JavaScript?


173

Come rilevare ctrl+ v, ctrl+ cutilizzando Javascript?

Devo limitare l'incollaggio nelle mie aree di testo, l'utente finale non deve copiare e incollare il contenuto, l'utente deve solo digitare il testo nell'area di testo.

Come raggiungere questo obiettivo?


3
Qual è lo scopo di questo? Gli unici due scenari legittimi che mi vengono in mente sono i campi password (che non è possibile copiare comunque) e un test di velocità di battitura. Sono sicuro che puoi rilevare una digitazione sospettosamente veloce.
Paul Butcher,

9
@Paul Butcher, @Propeng: ci sono scenari in cui ne hai bisogno. Esempio molto semplice: un sito per l'apprendimento delle lingue straniere. L'effetto di apprendimento è migliorato se si digitano le parole a mano invece di usare copia e incolla.
back2dos,

2
Un'altra situazione legittima potrebbe essere quella in cui è richiesta una doppia voce per rilevare errori (ad esempio digitare due volte la propria e-mail, in modo da sapere che non contiene errori di battitura). Tuttavia, un tale utente potrebbe tenere un elenco di indirizzi e-mail generati casualmente (ad esempio sneakemail) e probabilmente vorrebbe incollarlo per accuratezza.
Paul Butcher,

40
@ Paolo Butcher - che non è una situazione legittima a tutti, io odio i siti che lo fanno e ho sempre copia / incolla il (lungo) indirizzo e-mail da un ingresso all'altro. La rottura di copia / incolla è un grave problema di usabilità. Elimina davvero l'utente, perché è così fondamentale per il suo modello mentale che si aspettano che "funzioni". È come se cercassi di aprire una porta e si allontanasse da te anziché verso di te!
EMP,

4
Ogni volta che una copia del genere non è consentita in una pagina, ciò che faccio è incollare il testo altrove (utilizzo la barra dell'URL) e quindi Ctrl + A (seleziona il testo appena incollato nell'URL), trascina e rilascia il nel campo Sfoglia, dove incolla è disabilitato. Immagino che questo non sia prevenibile oggi.
Janakiram,

Risposte:


180

L'ho fatto solo per interesse. Sono d'accordo che non è la cosa giusta da fare, ma penso che dovrebbe essere la decisione dell'op ... Anche il codice potrebbe essere facilmente esteso per aggiungere funzionalità, piuttosto che portarlo via (come un blocco appunti più avanzato o Ctrl+ sinnescare un server -side save).

$(document).ready(function() {
    var ctrlDown = false,
        ctrlKey = 17,
        cmdKey = 91,
        vKey = 86,
        cKey = 67;

    $(document).keydown(function(e) {
        if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = true;
    }).keyup(function(e) {
        if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = false;
    });

    $(".no-copy-paste").keydown(function(e) {
        if (ctrlDown && (e.keyCode == vKey || e.keyCode == cKey)) return false;
    });
    
    // Document Ctrl + C/V 
    $(document).keydown(function(e) {
        if (ctrlDown && (e.keyCode == cKey)) console.log("Document catch Ctrl+C");
        if (ctrlDown && (e.keyCode == vKey)) console.log("Document catch Ctrl+V");
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h3>Ctrl+c Ctrl+v disabled</h3>
<textarea class="no-copy-paste"></textarea>
<br><br>
<h3>Ctrl+c Ctrl+v allowed</h3>
<textarea></textarea>

Anche solo per chiarire, questo script richiede la libreria jQuery.

Demo Codepen

EDIT: rimossi 3 righe ridondanti (che coinvolgono e.which) grazie al suggerimento di Tim Down (vedi commenti)

EDIT: aggiunto supporto per Mac ( cmdchiave invece di ctrl)


4
Perché i gestori keydowne keyupsu document? È possibile verificare il tasto Ctrl nel $(".no-copy-paste").keydowngestore. Inoltre, non è necessario per il e.keyCode || e.whichbit: e.keyCodefunziona in tutti i browser in cui e.whichfunziona, quindi e.whichnon verrà mai utilizzato. Forse stavi pensando a come ottenere un codice personaggio da un keypressevento? Infine, questo non farà nulla sulle paste dal contesto o sui menu di modifica, ma suppongo che l'OP non abbia chiesto direttamente questo.
Tim Down,

@Tim: i gestori di tasti Ctrl sul documento sono generici, poiché potrebbero non voler che la variabile ctrlDown sia collegata esclusivamente agli input no-copy-paste. Questo è forse OTT. Grazie per il suggerimento e.which - da allora ho trascorso mezz'ora alla ricerca dei diversi casi d'uso di e.keyCode ed e.ich con keydown () e keypress (), e che casino (specialmente in Firefox)!
jackocnr,

1
jackocnr: Raccomando l'articolo di gestione delle chiavi JavaScript di Jan Wolter: unixpapa.com/js/key.html L'ho usato come riferimento molte volte e non ho trovato un errore.
Tim Down,

3
Tipo! Grazie! Questo è esattamente ciò di cui avevo bisogno per consentire agli utenti di selezionare un "elemento" (voce del calendario) in un'app Web che sto scrivendo, premere ctrl + c per "copiarlo", quindi ctrl + v per "incollarlo", tutto senza interagendo effettivamente con gli onnipotenti appunti benedetti. ctrl + c Ricordo su cosa si fa clic, ctrl + v Lo duplico, tutti vincono.
Dan F,

2
Non sono un esperto o altro, ma penso che probabilmente sarebbe meglio provare e.metaKeyo e.ctrlKeyessere trueinvece di assegnare valori numerici alle chiavi e testarli .
Troia,

52

Con jquery puoi facilmente rilevare copia, incolla, ecc vincolando la funzione:

$("#textA").bind('copy', function() {
    $('span').text('copy behaviour detected!')
}); 
$("#textA").bind('paste', function() {
    $('span').text('paste behaviour detected!')
}); 
$("#textA").bind('cut', function() {
    $('span').text('cut behaviour detected!')
});

Maggiori informazioni qui: http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/


1
Sfortunatamente, questo metodo si attiverà su Firefox solo se viene selezionato il testo
Yassir Ennazk,

44

Mentre può essere fastidioso se usato come misura antipirateria, posso vedere che potrebbero esserci dei casi in cui sarebbe legittimo, quindi:

function disableCopyPaste(elm) {
    // Disable cut/copy/paste key events
    elm.onkeydown = interceptKeys

    // Disable right click events
    elm.oncontextmenu = function() {
        return false
    }
}

function interceptKeys(evt) {
    evt = evt||window.event // IE support
    var c = evt.keyCode
    var ctrlDown = evt.ctrlKey||evt.metaKey // Mac support

    // Check for Alt+Gr (http://en.wikipedia.org/wiki/AltGr_key)
    if (ctrlDown && evt.altKey) return true

    // Check for ctrl+c, v and x
    else if (ctrlDown && c==67) return false // c
    else if (ctrlDown && c==86) return false // v
    else if (ctrlDown && c==88) return false // x

    // Otherwise allow
    return true
}

Ho usato event.ctrlKeypiuttosto che controllare il codice chiave come nella maggior parte dei browser su Mac OS X Ctrl/ gli Alteventi "down" e "up" non vengono mai attivati, quindi l'unico modo per rilevare è utilizzare event.ctrlKeynell'evento c ad es. Dopo che il Ctrltasto è premuto. Ho anche sostituito ctrlKeycon metaKeyMac.

Limitazioni di questo metodo:

  • Opera non consente di disabilitare gli eventi con il tasto destro

  • Il trascinamento della selezione tra le finestre del browser non può essere impedito per quanto ne so.

  • La voce di menu edit-> copyad es. Firefox può ancora consentire la copia / incolla.

  • Inoltre, non esiste alcuna garanzia che per le persone con layout di tastiera / locali diversi che copiano / incollino / taglia siano gli stessi codici chiave (sebbene i layout spesso seguano lo stesso standard dell'inglese), ma la "disattivazione di tutti i tasti di controllo" significa che seleziona tutto ecc. sarà anche disabilitato, quindi penso che sia un compromesso che deve essere fatto.

14

C'è un altro modo di fare questo: onpaste , oncopyeoncut gli eventi possono essere registrati e cancellati in IE, Firefox, Chrome, Safari (con alcuni problemi minori), il browser unica grande che non consente l'annullamento di questi eventi è Opera.

Come puoi vedere nella mia altra risposta, l'intercettazione di Ctrl+ ve Ctrl+ ha cmolti effetti collaterali e non impedisce ancora agli utenti di incollare utilizzando il Editmenu di Firefox, ecc.

function disable_cutcopypaste(e) {
    var fn = function(evt) {
        // IE-specific lines
        evt = evt||window.event
        evt.returnValue = false

        // Other browser support
        if (evt.preventDefault) 
            evt.preventDefault()
        return false
    }
    e.onbeforepaste = e.onbeforecopy = e.onbeforecut = fn
    e.onpaste = e.oncopy = e.oncut = fn
}

Safari ha ancora alcuni problemi minori con questo metodo (cancella gli appunti al posto di taglia / copia quando previene l'impostazione predefinita) ma quel bug sembra essere stato risolto in Chrome ora.

Vedi anche: http://www.quirksmode.org/dom/events/cutcopypaste.html e la pagina di test associata http://www.quirksmode.org/dom/events/tests/cutcopypaste.html per ulteriori informazioni.


9

Demo live: http://jsfiddle.net/abdennour/ba54W/

$(document).ready(function() {

    $("#textA").bind({
        copy : function(){
            $('span').text('copy behaviour detected!');
        },
        paste : function(){
            $('span').text('paste behaviour detected!');
        },
        cut : function(){
            $('span').text('cut behaviour detected!');
        }
    });

}); 

8

Breve soluzione per impedire all'utente di utilizzare il menu di scelta rapida, copiare e tagliare in jQuery:

jQuery(document).bind("cut copy contextmenu",function(e){
    e.preventDefault();
});

Anche disabilitare la selezione del testo nei CSS potrebbe tornare utile:

.noselect {  
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
     user-select: none;
}

4

Se si utilizza la ctrlKeyproprietà, non è necessario mantenere lo stato.

   $(document).keydown(function(event) {
      // Ctrl+C or Cmd+C pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 67) {
         // Do stuff.
      }

      // Ctrl+V or Cmd+V pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 86) {
         // Do stuff.
      }

      // Ctrl+X or Cmd+X pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 88) {
         // Do stuff.
      } 
    }

Questa è la risposta corretta! L'evento ha una proprietà ctrlKey = true se è stato premuto un tasto con esso. Non abbiamo bisogno di eventi extra.
JanBrus

3

Ho scritto un plugin jQuery, che cattura i tasti. Può essere utilizzato per abilitare l'input di script in più lingue in moduli html senza il sistema operativo (tranne i caratteri). Sono circa 300 righe di codice, forse ti piacerebbe dare un'occhiata:

In generale, fai attenzione con questo tipo di alterazioni. Ho scritto il plugin per un client perché non erano disponibili altre soluzioni.


3

Puoi usare questo codice per fare clic con il CTRLtasto destro, + C, CTRL+ V, CTRL+ Xrilevare e impedire la loro azione

$(document).bind('copy', function(e) {
        alert('Copy is not allowed !!!');
        e.preventDefault();
    }); 
    $(document).bind('paste', function() {
        alert('Paste is not allowed !!!');
        e.preventDefault();
    }); 
    $(document).bind('cut', function() {
        alert('Cut  is not allowed !!!');
        e.preventDefault();
    });
    $(document).bind('contextmenu', function(e) {
        alert('Right Click  is not allowed !!!');
        e.preventDefault();
    });

3

invece di onkeypress, usa onkeydown.

<input type="text" onkeydown="if(event.ctrlKey && event.keyCode==86){return false;}" name="txt">


0

Non dimenticare che, mentre potresti essere in grado di rilevare e bloccare Ctrl+ C/ V, puoi comunque modificare il valore di un determinato campo.
Il miglior esempio di ciò è la funzione Inspect Element di Chrome, che consente di modificare la proprietà value di un campo.


0

ho già il tuo problema e l'ho risolto con il seguente codice .. che accetta solo numeri

$('#<%= mobileTextBox.ClientID %>').keydown(function(e) {
            ///// e.which Values
            // 8  : BackSpace , 46 : Delete , 37 : Left , 39 : Rigth , 144: Num Lock 
            if (e.which != 8 && e.which != 46 && e.which != 37 && e.which != 39 && e.which != 144
                && (e.which < 96 || e.which > 105 )) {
                return false;
            }
        });

puoi rilevare Ctrlide.which == 17


-1

È possibile ascoltare l'evento keypress e interrompere l'evento predefinito (immettendo il testo) se corrisponde ai codici chiave specifici


-1

Nota importante

Stavo usando e.keyCodeda un po 'e ho rilevato che quando premo ctrl+ ., questo attributo restituisce un numero errato, 190, mentre il codice ASCII .è 46!

Quindi dovresti usare e.key.toUpperCase().charCodeAt(0)invece di e.keyCode.


-4

Ci sono alcuni modi per prevenirlo.

Tuttavia l'utente sarà sempre in grado di disattivare javascript o semplicemente guardare il codice sorgente della pagina.

Alcuni esempi (richiedono jQuery)

/**
* Stop every keystroke with ctrl key pressed
*/
$(".textbox").keydown(function(){
    if (event.ctrlKey==true) {
        return false;
    }
});

/**
* Clear all data of clipboard on focus
*/
$(".textbox").focus(function(){
    if ( window.clipboardData ) {
        window.clipboardData.setData('text','');
    }
});

/**
* Block the paste event
*/
$(".textbox").bind('paste',function(e){return false;});

Modifica: come ha detto Tim Down, queste funzioni sono tutte dipendenti dal browser.


2
Questo ha una serie di problemi: in primo luogo, non funzionerà nei browser che non hanno un pasteevento, che include tutte le versioni di Firefox precedenti alla versione 3. In secondo luogo, window.clipboardDataè solo IE e credo che ora sia disabilitato di default in IE . Terzo, disabilitare tutti gli keydowneventi in cui è premuto il tasto Ctrl è eccessivo: si impediscono utili scorciatoie da tastiera come Ctrl-A (seleziona tutto) e Ctrl-Z (annulla). In quarto luogo, come menzionato da altri, questa è davvero una brutta cosa da fare.
Tim Down,

Hai ragione sul fatto che non funziona su tutti i browser. Nessuno Il blocco ctrl è davvero fastidioso. Una volta è stato utile quando un client voleva bloccare il campo "Email e password di conferma".
Gustavo Cardoso,
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.