Comment détecter Ctrl + V, Ctrl + C en utilisant JavaScript?

173

Comment détecter ctrl+ v, ctrl+ en cutilisant Javascript?

J'ai besoin de restreindre le collage dans mes zones de texte, l'utilisateur final ne doit pas copier et coller le contenu, l'utilisateur ne doit taper du texte que dans la zone de texte.

Comment y parvenir?

Ramakrishnan
la source
3
Quel est le but de cela? Les deux seuls scénarios légitimes auxquels je peux penser sont les champs de mot de passe (que vous ne pouvez pas copier de toute façon) et un test de vitesse de frappe. Je suis sûr que vous pouvez détecter une frappe étrangement rapide.
Paul Butcher
9
@Paul Butcher, @Propeng: Il existe des scénarios où vous en avez besoin. Exemple très simple: un site d'apprentissage des langues étrangères. L'effet d'apprentissage est amélioré si vous tapez les mots à la main au lieu d'utiliser le copier-coller.
back2dos
2
Une autre situation légitime pourrait être celle où une double saisie est nécessaire pour détecter les erreurs (par exemple, tapez votre e-mail deux fois, afin que nous sachions qu'il n'y a pas de faute de frappe). Pourtant, un tel utilisateur pourrait conserver une liste d'adresses e-mail générées aléatoirement (par exemple, sneakemail), et voudrait probablement la coller pour plus de précision.
Paul Butcher
40
@Paul Butcher - ce n'est pas du tout une situation légitime, je déteste les sites qui font ça et je copie / colle toujours mon (longue) adresse e-mail d'une entrée à l'autre. La rupture du copier / coller est un problème majeur de convivialité. Cela dérange vraiment l'utilisateur, car il est si fondamental dans son modèle mental qu'il s'attend à ce qu'il "fonctionne simplement". C'est comme si vous essayiez de tirer une porte et qu'elle s'éloignait de vous plutôt que vers vous!
EMP
4
Chaque fois qu'un tel copier-coller n'est pas autorisé dans une page, ce que je fais est de coller le texte ailleurs (j'utilise la barre d'URL), puis Ctrl + A (sélectionnez le texte qui vient d'être collé dans l'url), faites glisser et déposez le dans le champ de navigation, où le collage est désactivé. Je suppose que c'est quelque chose qui n'est pas évitable à partir d'aujourd'hui.
Janakiram

Réponses:

180

Je viens de faire cela par intérêt. Je suis d' accord ce n'est pas la bonne chose à faire, mais je pense que ce devrait être la décision op ... De plus , le code pourrait facilement être étendu pour ajouter des fonctionnalités, plutôt que de l'enlever (comme un presse - papiers plus avancé, ou Ctrl+ sdéclenchement d' un serveur - sauvegarde latérale).

$(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>

Aussi juste pour clarifier, ce script nécessite la bibliothèque jQuery.

Démo Codepen

EDIT: suppression de 3 lignes redondantes (impliquant e.which) grâce à la suggestion de Tim Down (voir commentaires)

EDIT: prise en charge supplémentaire pour les Mac ( cmdclé au lieu de ctrl)

jackocnr
la source
4
Pourquoi les gestionnaires keydownet keyupsur document? Vous pouvez tester la touche Ctrl dans le $(".no-copy-paste").keydowngestionnaire. En outre, il n'y a pas besoin du e.keyCode || e.whichbit: e.keyCodefonctionne dans tous les navigateurs qui e.whichfonctionnent, donc e.whichne sera jamais utilisé. Peut-être pensiez-vous comment obtenir un code de caractère à partir d'un keypressévénement? Enfin, cela ne fera rien à propos des pâtes du menu contextuel ou des menus d'édition, mais je suppose que l'OP n'a pas posé de questions directement à ce sujet.
Tim Down
@Tim: les gestionnaires de touches Ctrl sur le document doivent être généraux - car ils peuvent ne pas vouloir que la variable ctrlDown soit exclusivement liée aux entrées sans copier-coller. C'est peut-être OTT. Merci pour le conseil e.which - depuis, j'ai passé une demi-heure à rechercher les différents cas d'utilisation de e.keyCode et e.which avec keydown () et keypress (), et quel désordre (surtout dans Firefox)!
jackocnr
1
jackocnr: Je recommande l'article de Jan Wolter sur la gestion des clés JavaScript: unixpapa.com/js/key.html Je l'ai utilisé à titre de référence plusieurs fois et je n'ai pas trouvé d'erreur.
Tim Down
3
Mec! Merci! C'est exactement ce dont j'avais besoin pour permettre aux utilisateurs de sélectionner un «élément» (entrée de calendrier) dans une application Web que j'écris, appuyez sur ctrl + c pour le «copier», puis ctrl + v pour le «coller», le tout sans interagissant réellement avec le presse-papiers béni tout-puissant. ctrl + c Je me souviens sur quoi ils ont cliqué, ctrl + v Je le duplique, tout le monde gagne.
Dan F
2
Je ne suis pas un expert ou quoi que ce soit, mais je pense qu'il serait probablement préférable de tester e.metaKeyou d' e.ctrlKeyêtre trueplutôt que d'attribuer des valeurs numériques aux touches et de les tester.
sluther
52

Avec jquery, vous pouvez facilement détecter les copier, coller, etc. en liant la fonction:

$("#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!')
});

Plus d'informations ici: http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/

Chris Andersson
la source
1
Malheureusement, cette méthode ne se déclenchera sur Firefox que si le texte est sélectionné
Yassir Ennazk
44

Bien que cela puisse être ennuyeux lorsqu'il est utilisé comme mesure anti-piratage, je peux voir qu'il pourrait y avoir des cas où cela serait légitime, donc:

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
}

J'ai utilisé event.ctrlKeyplutôt que de vérifier le code de la clé comme sur la plupart des navigateurs sous Mac OS X Ctrl/ Altles événements "down" et "up" ne sont jamais déclenchés, donc le seul moyen de détecter est d'utiliser event.ctrlKeydans l'événement eg c après la Ctrlclé est maintenu enfoncé. J'ai également remplacé ctrlKeypar metaKeydes macs.

Limitations de cette méthode:

  • Opera ne permet pas de désactiver les événements de clic droit

  • Le glisser-déposer entre les fenêtres du navigateur ne peut pas être empêché pour autant que je sache.

  • L' élément de menu edit-> copydans Firefox, par exemple, peut toujours autoriser le copier / coller.

  • Il n'y a pas non plus de garantie que pour les personnes avec différentes dispositions de clavier / paramètres régionaux qui copient / collent / coupent les mêmes codes de clé (bien que les dispositions suivent souvent le même standard que l'anglais), mais une couverture "désactiver toutes les touches de contrôle" signifie que tout sélectionner, etc. sera également désactivé, donc je pense que c'est un compromis qui doit être fait.
cryo
la source
14

Il y a une autre façon de le faire: onpaste , oncopyetoncut les événements peuvent être enregistrés et annulés dans IE, Firefox, Chrome, Safari (avec quelques problèmes mineurs), le seul grand navigateur qui ne permet pas l' annulation de ces événements est Opera.

Comme vous pouvez le voir dans mon autre réponse, intercepter Ctrl+ vet Ctrl+ ccomporte de nombreux effets secondaires, et cela n'empêche toujours pas les utilisateurs de coller à l'aide du Editmenu Firefox , etc.

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 a encore quelques problèmes mineurs avec cette méthode (il efface le presse-papiers à la place de couper / copier lors de la prévention par défaut) mais ce bogue semble avoir été corrigé dans Chrome maintenant.

Voir aussi: http://www.quirksmode.org/dom/events/cutcopypaste.html et la page de test associée http://www.quirksmode.org/dom/events/tests/cutcopypaste.html pour plus d'informations.

cryo
la source
9

Démo en direct: 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!');
        }
    });

}); 
Abdennour TOUMI
la source
8

Solution courte pour empêcher l'utilisateur d'utiliser le menu contextuel, copier et couper dans jQuery:

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

La désactivation de la sélection de texte dans CSS peut également s'avérer 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;
}
jendarybak
la source
4

Si vous utilisez la ctrlKeypropriété, vous n'avez pas besoin de maintenir l'état.

   $(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.
      } 
    }
Crashalot
la source
CECI est la bonne réponse! L'événement a une propriété ctrlKey = true si une touche a été enfoncée avec elle. Nous n'avons besoin d'aucun événement supplémentaire.
JanBrus
3

J'ai écrit un plugin jQuery, qui capture les frappes. Il peut être utilisé pour activer l'entrée de script dans plusieurs langues dans des formulaires html sans le système d'exploitation (à l'exception des polices). Ses environ 300 lignes de code, peut-être que vous aimeriez y jeter un œil:

En règle générale, soyez prudent avec ce type de modifications. J'ai écrit le plugin pour un client car d'autres solutions n'étaient pas disponibles.

Miku
la source
3

Vous pouvez utiliser ce code pour faire un clic droit, CTRL+ C, CTRL+ V, CTRL+ Xdétecter et empêcher leur action

$(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();
    });
Varun Naharia
la source
3

au lieu de onkeypress, utilisez onkeydown.

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

Une autre approche (aucun plugin nécessaire) consiste à utiliser simplement la ctrlKeypropriété de l' objet événement qui est passé. Cela indique si a Ctrlété pressé au moment de l'événement, comme ceci:

$(document).keypress("c",function(e) {
  if(e.ctrlKey)
    alert("Ctrl+C was pressed!!");
});

Voir aussi jquery: keypress, ctrl + c (ou un combo comme ça) .

Abu Ghufran
la source
0

N'oubliez pas que, même si vous pouvez détecter et bloquer Ctrl+ C/ V, vous pouvez toujours modifier la valeur d'un certain champ.
Le meilleur exemple pour cela est la fonction Inspecter l'élément de Chrome, qui vous permet de modifier la propriété valeur d'un champ.

BlueCacti
la source
0

j'ai déjà votre problème et je l'ai résolu par le code suivant .. qui n'acceptent que les nombres

$('#<%= 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;
            }
        });

vous pouvez détecter l' Ctrlide.which == 17

Amr Badawy
la source
-1

Vous pouvez écouter l'événement de pression de touche et arrêter l'événement par défaut (en entrant le texte) s'il correspond aux codes de touches spécifiques

baloo
la source
-1

Note importante

J'utilisais e.keyCodependant un moment et j'ai détecté que lorsque j'appuie sur ctrl+ ., cet attribut renvoie un mauvais numéro, 190, alors que le code ascii de .est 46!

Vous devriez donc utiliser à la e.key.toUpperCase().charCodeAt(0)place de e.keyCode.

Amir Fo
la source
-4

Il existe des moyens de l'empêcher.

Cependant, l'utilisateur pourra toujours désactiver le javascript ou simplement regarder le code source de la page.

Quelques exemples (nécessitent 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;});

Edit: Comme l'a dit Tim Down, ces fonctions dépendent toutes du navigateur.

Gustavo Cardoso
la source
2
Cela pose un certain nombre de problèmes: d'abord, cela ne fonctionnera pas dans les navigateurs qui n'ont pas d' pasteévénement, ce qui inclut toutes les versions de Firefox antérieures à la version 3. Deuxièmement, window.clipboardDatac'est uniquement IE et je pense qu'il est maintenant désactivé par défaut dans IE . Troisièmement, la désactivation de tous les keydownévénements où la touche Ctrl est enfoncée est excessive: vous évitez les raccourcis clavier utiles tels que Ctrl-A (tout sélectionner) et Ctrl-Z (annuler). Quatrièmement, comme d'autres l'ont mentionné, c'est vraiment une mauvaise chose à faire.
Tim Down
Vous avez raison, cela ne fonctionne pas sur tous les navigateurs. Personne Le bloc ctrl est vraiment ennuyeux. C'était pratique une fois qu'un client voulait bloquer le champ "Confirmation Email and Password".
Gustavo Cardoso