¿Cómo detectar ctrl+ v, ctrl+ cusando Javascript?
Necesito restringir el pegado en mis áreas de texto, el usuario final no debe copiar y pegar el contenido, el usuario solo debe escribir texto en el área de texto.
¿Cómo lograr esto?
¿Cómo detectar ctrl+ v, ctrl+ cusando Javascript?
Necesito restringir el pegado en mis áreas de texto, el usuario final no debe copiar y pegar el contenido, el usuario solo debe escribir texto en el área de texto.
¿Cómo lograr esto?
Respuestas:
Acabo de hacer esto por interés. Estoy de acuerdo en que no es lo correcto, pero creo que debería ser la decisión del operador ... Además, el código podría extenderse fácilmente para agregar funcionalidad, en lugar de eliminarlo (como un portapapeles más avanzado o Ctrl+ sactivar un servidor lado guardado).
$(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>
También para aclarar, este script requiere la biblioteca jQuery.
EDITAR: eliminó 3 líneas redundantes (que involucran e.which) gracias a la sugerencia de Tim Down (ver comentarios)
EDITAR: soporte agregado para Mac ( cmdclave en lugar de ctrl)
keydown
y los keyup
controladores en document
? Puede probar la tecla Ctrl en el $(".no-copy-paste").keydown
controlador. Además, no es necesario el e.keyCode || e.which
bit: e.keyCode
funciona en todos los navegadores que e.which
funcionan, por e.which
lo que nunca se utilizará. ¿Quizás estabas pensando en cómo obtienes un código de personaje de un keypress
evento? Finalmente, esto no hará nada sobre las pastas del contexto o los menús de edición, pero supongo que el OP no preguntó directamente sobre eso.
e.metaKey
o e.ctrlKey
ser en true
lugar de asignar valores numéricos a las teclas y probarlos.
Con jquery puede detectar fácilmente copiar, pegar, etc. al vincular la función:
$("#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!')
});
Más información aquí: http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/
Si bien puede ser molesto cuando se usa como una medida contra la piratería, puedo ver que podría haber algunos casos en los que sería legítimo, así que:
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
}
He utilizado en event.ctrlKey
lugar de verificar el código de la clave, ya que en la mayoría de los navegadores en Mac OS X Ctrl/ Alteventos "down" y "up" nunca se activan, por lo que la única forma de detectar es usar event.ctrlKey
en el evento, por ejemplo, c después de que la Ctrlclave es presionado. También he sustituido ctrlKey
con metaKey
para Macs.
Limitaciones de este método:
edit
-> copy
en, por ejemplo, Firefox todavía puede permitir copiar / pegar.Hay otra forma de hacer esto: onpaste
, oncopy
y oncut
los eventos pueden ser registrados y cancelado de IE, Firefox, Chrome, Safari (con algunos problemas menores), la única gran navegador que no permite la cancelación de estos eventos es Opera.
Como puede ver en mi otra respuesta, interceptar Ctrl+ vy Ctrl+ cviene con muchos efectos secundarios, y aún así no impide que los usuarios peguen usando el Edit
menú de 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 todavía tiene algunos problemas menores con este método (borra el portapapeles en lugar de cortar / copiar cuando se evita el valor predeterminado), pero ese error parece haberse solucionado en Chrome ahora.
Consulte también: http://www.quirksmode.org/dom/events/cutcopypaste.html y la página de prueba asociada http://www.quirksmode.org/dom/events/tests/cutcopypaste.html para obtener más información.
Demostración en vivo: 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!');
}
});
});
Solución corta para evitar que el usuario use el menú contextual, copie y corte en jQuery:
jQuery(document).bind("cut copy contextmenu",function(e){
e.preventDefault();
});
También puede ser útil desactivar la selección de texto en CSS:
.noselect {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
Si usa la ctrlKey
propiedad, no necesita mantener el estado.
$(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.
}
}
Escribí un complemento jQuery, que captura las pulsaciones de teclas. Se puede usar para habilitar la entrada de secuencia de comandos de varios idiomas en formularios html sin el sistema operativo (excepto las fuentes). Son alrededor de 300 líneas de código, tal vez te guste echar un vistazo:
En general, tenga cuidado con este tipo de alteraciones. Escribí el complemento para un cliente porque otras soluciones no estaban disponibles.
Puede usar este código para hacer clic derecho, CTRL+ C, CTRL+ V, CTRL+ Xdetectar y prevenir su acción
$(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();
});
Otro enfoque (no se necesita ningún complemento) es usar la ctrlKey
propiedad del objeto de evento que se pasa. Indica si Ctrlse presionó en el momento del evento, de esta manera:
$(document).keypress("c",function(e) {
if(e.ctrlKey)
alert("Ctrl+C was pressed!!");
});
Ver también jquery: keypress, ctrl + c (o algún combo como ese) .
ya tengo tu problema y lo resolví con el siguiente código ... que solo acepta números
$('#<%= 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;
}
});
puedes detectar Ctrlide.which == 17
Hay algunas formas de prevenirlo.
Sin embargo, el usuario siempre podrá desactivar el javascript o simplemente mirar el código fuente de la página.
Algunos ejemplos (requieren 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;});
Editar: como dijo Tim Down, todas estas funciones dependen del navegador.
paste
evento, que incluye todas las versiones de Firefox anteriores a la versión 3. Segundo, window.clipboardData
es solo IE y creo que ahora está deshabilitado por defecto en IE . En tercer lugar, deshabilitar todos los keydown
eventos en los que se presiona la tecla Ctrl es excesivo: evita atajos de teclado útiles como Ctrl-A (seleccionar todo) y Ctrl-Z (deshacer). Cuarto, como lo mencionaron otros, esto es algo realmente malo.