with - w3schools javascript window




Como detectar Ctrl+V, Ctrl+C usando JavaScript? (12)

Como detectar ctrl + v , ctrl + c usando JavaScript?

Eu preciso restringir a colagem em minhas textareas, o usuário final não deve copiar e colar o conteúdo, o usuário deve digitar apenas texto na textarea.

Como conseguir isso?


Nota importante

Eu estava usando e.keyCode por um tempo e eu detectei que quando eu pressiono ctrl + . Esse atributo retorna um número errado, 190, enquanto o código ascii de . é 46!

Portanto, você deve usar e.key.toUpperCase().charCodeAt(0) vez de e.keyCode .


Com jquery você pode facilmente detectar copiar, colar, etc, ligando a função:

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

Mais informações aqui: http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/


Embora possa ser irritante quando usado como uma medida antipirataria, posso ver que pode haver alguns casos em que isso seria legítimo, portanto:

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
}

Eu usei event.ctrlKey vez de verificar o código de chave como na maioria dos navegadores no Mac OS X Ctrl / Alt "para baixo" e "para cima" eventos nunca são acionados, então a única maneira de detectar é usar event.ctrlKey em o evento eg c após a tecla Ctrl ser pressionada. Eu também substitui ctrlKey por metaKey para macs.

Limitações deste método:

  • O Opera não permite a desativação de eventos com cliques com o botão direito

  • Arrastar e soltar entre as janelas do navegador não pode ser impedido, tanto quanto eu sei.

  • O item de menu copy > copy por exemplo, no Firefox, ainda pode permitir copiar / colar.

  • Também não há garantia de que para pessoas com diferentes layouts de teclado / locais que copiem / colem / cortem são os mesmos códigos-chave (embora os layouts geralmente sigam o mesmo padrão do inglês), mas "desabilitar todas as teclas de controle" significa selecionar também será desativado, então acho que é um compromisso que precisa ser feito.

Eu acabei de fazer isso por interesse. Concordo que não é a coisa certa a fazer, mas acho que deveria ser a decisão do op ... Além disso, o código poderia ser facilmente estendido para adicionar funcionalidade, em vez de removê-la (como uma área de transferência mais avançada ou o acionamento de Ctrl + s) um save do lado do servidor).

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

Também só para esclarecer, este script requer a biblioteca jQuery.

Demo codepen

EDIT: removido 3 linhas redundantes (envolvendo e.which), graças à sugestão de Tim Down (ver comentários)

EDIT: adicionado suporte para Macs (tecla cmd em vez de ctrl)


Eu já tenho o seu problema e eu resolvi pelo seguinte código .. que aceitam apenas 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;
            }
        });

você pode detectar Ctrl id e.which == 17


Existem algumas maneiras de evitar isso.

No entanto, o usuário sempre será capaz de desligar o javascript ou apenas olhar o código-fonte da página.

Alguns exemplos (requerem 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: Como Tim Down disse, essas funções são todos os dependentes do navegador.


Outra abordagem (nenhum plugin necessário) é apenas usar a propriedade ctrlKey do objeto de evento que é passado. Isso indica se o Ctrl foi pressionado no momento do evento, assim:

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

Veja também jquery: keypress, ctrl + c (ou algum combo assim) .


Se você usar a propriedade ctrlKey , não precisará manter o 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.
      } 
    }

Você pode ouvir o evento de pressionamento de tecla e interromper o evento padrão (inserindo o texto) se ele corresponder aos códigos de teclas específicos.


Você pode usar este código para CTRL + C , CTRL + V , Ctrl + V , CTRL + X detectar e impedir sua ação

$(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();
    });

Existe outra maneira de fazer isso: os onpaste , oncopy e oncut podem ser registrados e cancelados no IE, Firefox, Chrome, Safari (com alguns pequenos problemas), o único navegador principal que não permite o cancelamento desses eventos é o Opera.

Como você pode ver na minha outra resposta interceptando Ctrl + v e Ctrl + c vem com muitos efeitos colaterais, e ainda não impede que os usuários colem usando o menu Edit 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
}

O Safari ainda tem alguns pequenos problemas com este método (ele limpa a área de transferência no lugar do corte / cópia ao impedir o padrão), mas esse bug parece ter sido corrigido no Chrome agora.

Veja também: http://www.quirksmode.org/dom/events/cutcopypaste.html e a página de teste associada http://www.quirksmode.org/dom/events/tests/cutcopypaste.html para mais informações.


function noCopyMouse(e) {
    if (event.button == 2 || event.button == 3) {
        alert('You are prompted to type this twice for a reason!');
        return false;
    }
    return true;
}

function noCopyKey(e) {
    var forbiddenKeys = new Array('c','x','v');
    var isCtrl;

        if(window.event) {
        if(window.event.ctrlKey)
            isCtrl = true;
        else
            isCtrl = false;
        }
        else {
                if(e.ctrlKey)
                    isCtrl = true;
                else
                    isCtrl = false;
        }

    if(isCtrl) {
        for(i=0; iif(forbiddenKeys[i] == String.fromCharCode(window.event.keyCode).toLowerCase()) {
                alert('You are prompted to type this twice for a reason!');
                return false;
            }
            }
    }
    return true;
}

E agora para referenciar esses métodos nas caixas de texto que você deseja restringir:

<input name="txtTest" id="txtTest" type="textbox" onmousedown="javascript:return noCopyMouse(event);" onkeykown="javascript:return noCopyKey(event);"  />




html