如何使用JavaScript检测Ctrl + V,Ctrl + C?

Ram*_*nan 158 html javascript jquery

如何使用Javascript 检测ctrl+ v,ctrl+ c

我需要限制粘贴在我的textareas中,最终用户不应该复制和粘贴内容,用户应该只在textarea中键入文本.

怎么做到这一点?

jac*_*cnr 172

我出于兴趣而这样做了.我同意这不是正确的事情,但我认为这应该是操作的决定......而且代码可以很容易地扩展到添加功能,而不是把它带走(比如更高级的剪贴板,或Ctrl+ s触发服务器 - 边保存).

$(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");
    });
});
Run Code Online (Sandbox Code Playgroud)

另外,澄清一下,这个脚本需要jQuery库.

Codepen演示

编辑:删除3条冗余线(涉及e.which)感谢Tim Down的建议(见评论)

编辑:添加了对Mac的支持(cmd键而不是ctrl)

  • 为什么`keydown`和`keyup`处理程序在`document`上?您可以在`$(".no-copy-paste").keydown`处理程序中测试Ctrl键.此外,不需要`e.keyCode || e.which`位:`e.keyCode`适用于所有'e.which`工作的浏览器,因此永远不会使用`e.which`.也许您正在考虑如何从`keypress`事件中获取字符代码?最后,这对上下文或编辑菜单中的粘贴无效,但我认为OP没有直接询问这一点. (4认同)
  • 好家伙!谢谢!这正是我需要让用户在我正在编写的web应用程序中选择"元素"(日历条目),按ctrl + c"复制"它,然后按ctrl + v"粘贴"它,所有没有实际上与全能的祝福剪贴板进行交互.ctrl + c我记得他们点击了什么,ctrl + v我复制它,每个人都赢了. (3认同)
  • 我不是专家或任何东西,但我认为最好测试 `e.metaKey` 或 `e.ctrlKey` 是否为 `true`,而不是为键分配数值并测试它们。 (2认同)

Chr*_*son 52

使用jquery,您可以通过绑定函数轻松检测复制,粘贴等:

$("#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!')
});
Run Code Online (Sandbox Code Playgroud)

更多信息请访问:http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/

  • 不幸的是,如果选择了文本,此方法只会在 Firefox 上触发 (2认同)

cry*_*ryo 38

虽然在用作反盗版措施时可能会很烦人,但我可以看到可能存在一些合法的情况,因此:

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
}
Run Code Online (Sandbox Code Playgroud)

我已经使用event.ctrlKey而不是检查密钥代码,因为在Mac OS X上的大多数浏览器Ctrl/ Alt"向下"和"向上"事件从未被触发,因此检测的唯一方法是event.ctrlKeyCtrl密钥后使用例如c事件压制住了.我也ctrlKeymetaKeymac 代替了.

此方法的局限性:

  • Opera不允许禁用右键单击事件

  • 据我所知,无法阻止浏览器窗口之间的拖放.

  • 例如Firefox中的edit- > copy菜单项仍然可以允许复制/粘贴.

  • 对于具有不同键盘布局/区域设置的人来说,复制/粘贴/剪切是相同的密钥代码也不能保证(尽管布局通常只遵循与英语相同的标准),但是"禁用所有控制键"意味着选择全部等也将被禁用,所以我认为这是一个需要做出的妥协.


cry*_*ryo 13

有这样做的另一种方法: onpaste,oncopyoncut事件可以注册并在IE,火狐,Chrome,Safari浏览器(有一些小问题)取消,唯一的主要的浏览器不允许取消这些活动是Opera.

你可以在我的另一个答案中看到截取Ctrl+ vCtrl+ c有很多副作用,它仍然不会阻止用户使用Firefox Edit菜单粘贴等.

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
}
Run Code Online (Sandbox Code Playgroud)

Safari仍然存在一些使用此方法的小问题(当防止默认时,它会清除剪贴板而不是剪切/复制)但是现在Chrome中已经修复了该错误.

另请参阅: http ://www.quirksmode.org/dom/events/cutcopypaste.html以及相关的测试页面http://www.quirksmode.org/dom/events/tests/cutcopypaste.html以获取更多信息.


Abd*_*UMI 9

现场演示: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!');
        }
    });

}); 
Run Code Online (Sandbox Code Playgroud)


小智 8

防止用户使用上下文菜单,复制和剪切jQuery的简短解决方案:

jQuery(document).bind("cut copy contextmenu",function(e){
    e.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

同样禁用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;
}
Run Code Online (Sandbox Code Playgroud)


Cra*_*lot 7

如果您使用该ctrlKey属性,则不需要维护状态。

   $(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.
      } 
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

另一种方法(不需要插件)它只使用传入的事件对象ctrlKey的属性。它指示事件发生时是否被按下,如下所示:Ctrl

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

另请参见jquery:按键、ctrl+c (或类似的组合)