Comment détecter ctrl+v, ctrl+c utiliser Javascript?
Je dois limiter le collage dans mes zones de texte, l'utilisateur final ne doit pas copier et coller le contenu, l'utilisateur ne doit taper que du texte dans textarea.
Comment y parvenir?
Je viens de faire cela par intérêt. Je suis d'accord que ce n'est pas la bonne chose à faire, mais je pense que cela devrait être la décision de l'op ... De plus, le code pourrait facilement être étendu pour ajouter des fonctionnalités, plutôt que de le supprimer (comme un presse-papier plus avancé, ou Ctrl+s déclencher une sauvegarde côté serveur).
$(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>
Également pour clarifier, ce script nécessite la bibliothèque jQuery.
EDIT: suppression de 3 lignes redondantes (impliquant e.which) grâce à la suggestion de Tim Down (voir commentaires)
EDIT: ajout du support pour les Mac (touche cmd au lieu de ctrl)
Avec jQuery, vous pouvez facilement détecter les copies, colles, 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/
Bien que cela puisse être agaçant quand il est utilisé comme mesure anti-piratage, je peux voir qu'il pourrait y avoir des cas où cela serait légitime, alors:
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.ctrlKey
plutôt que de rechercher le code de clé comme sur la plupart des navigateurs sous Mac OS X Ctrl/Alt Les événements "down" et "up" ne sont jamais déclenchés, la seule façon de détecter consiste à utiliser event.ctrlKey
dans le fichier exemple. c événement après le Ctrl la touche est maintenue enfoncée. J'ai également substitué ctrlKey
par metaKey
pour macs.
Limitations de cette méthode:
edit
-> copy
dans par exemple Firefox peut toujours autoriser le copier/coller. Il existe un autre moyen de procéder: _, les événements onpaste
, oncopy
et oncut
peuvent être enregistrés et annulés dans IE, Firefox, Chrome, Safari. (avec quelques problèmes mineurs), le seul navigateur majeur qui ne permet pas d'annuler ces événements est Opera.
Comme vous pouvez le voir dans mon autre réponse, intercepter Ctrl+v et Ctrl+c vient avec beaucoup d'effets secondaires, et il n'empêche pas les utilisateurs de coller en utilisant le menu Firefox Edit
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 (elle efface le presse-papiers au lieu de couper/copier en empêchant l'utilisation 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.
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!');
}
});
});
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();
});
Désactiver également la sélection de texte en CSS peut 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;
}
au lieu de onkeypress, utilisez onkeydown.
<input type="text" onkeydown="if(event.ctrlKey && event.keyCode==86){return false;}" name="txt">
J'ai écrit un plugin jQuery, qui intercepte des frappes au clavier. Il peut être utilisé pour permettre la saisie de scripts multilingues dans des formulaires HTML sans le système d'exploitation (à l'exception des polices). Ses environ 300 lignes de code, peut-être que vous aimez jeter un oeil:
En règle générale, soyez prudent avec ce genre de modifications. J'ai écrit le plugin pour un client car d'autres solutions n'étaient pas disponibles.
Vous pouvez utiliser ce code pour rightclick, CTRL+C, CTRL+V, CTRL+X détecter et prévenir 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();
});
Une autre approche (aucun plugin nécessaire) consiste à utiliser simplement la propriété ctrlKey
de l'objet événement à transmettre. Elle indique si Ctrl était 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 une combinaison similaire) .
Si vous utilisez la propriété ctrlKey
, vous n'avez pas besoin de conserver 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.
}
}
j'ai déjà votre problème et je l'ai résolu par le code suivant .. qui n'accepte que des 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 Ctrl id e.which == 17
N'oubliez pas cela, alors que vous pourrez peut-être détecter et bloquer Ctrl+C/V, vous pouvez toujours modifier la valeur d’un certain champ.
Le meilleur exemple à cet égard est la fonction Inspect Element de Chrome, qui vous permet de modifier la propriété value d'un champ.
J'utilisais e.keyCode
pendant un moment et j'ai détecté que lorsque j'appuyais sur ctrl + ., Cet attribut retourne un nombre incorrect, 190, alors que le code ASCII de .
est 46!
Vous devez donc utiliser e.key.toUpperCase().charCodeAt(0)
au lieu de e.keyCode
.
Vous pouvez écouter l'événement de frappe et arrêter l'événement par défaut (saisir le texte) s'il correspond aux codes de clé spécifiques.