¿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)
keydowny los keyupcontroladores en document? Puede probar la tecla Ctrl en el $(".no-copy-paste").keydowncontrolador. Además, no es necesario el e.keyCode || e.whichbit: e.keyCodefunciona en todos los navegadores que e.whichfuncionan, por e.whichlo que nunca se utilizará. ¿Quizás estabas pensando en cómo obtienes un código de personaje de un keypressevento? 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.metaKeyo e.ctrlKeyser en truelugar 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.ctrlKeylugar 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.ctrlKeyen el evento, por ejemplo, c después de que la Ctrlclave es presionado. También he sustituido ctrlKeycon metaKeypara Macs.
Limitaciones de este método:
edit-> copyen, por ejemplo, Firefox todavía puede permitir copiar / pegar.Hay otra forma de hacer esto: onpaste , oncopyy oncutlos 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 Editmenú 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 ctrlKeypropiedad, 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 ctrlKeypropiedad 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.
pasteevento, que incluye todas las versiones de Firefox anteriores a la versión 3. Segundo, window.clipboardDataes solo IE y creo que ahora está deshabilitado por defecto en IE . En tercer lugar, deshabilitar todos los keydowneventos 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.