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


173

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

我需要限制粘贴在我的文本区域中,最终用户不应复制和粘贴内容,用户只能在文本区域中键入文本。

如何实现呢?


3
这样做的目的是什么?我能想到的仅有的两种合法情况是密码字段(无论如何都不能复制出来)和输入速度测试。我相信您可以检测到可疑的快速键入。
Paul Butcher,2010年

9
@Paul Butcher,@ Propeng:在某些情况下,您需要此。非常简单的示例:学习外语的网站。如果您手动输入单词而不是使用复制和粘贴,则会增强学习效果。
back2dos

2
另一个合法的情况可能是需要重复输入以检测错误(例如,两次键入您的电子邮件,以便我们知道它没有错字)。尽管如此,这样的用户可能会保留一个随机生成的电子邮件地址列表(例如,snepemail),并且可能希望粘贴它以确保准确性。
Paul Butcher 2010年

40
@Paul Butcher-根本不是一个合理的情况,我讨厌这样做的网站,而且我总是将我的(长)电子邮件地址从一个输入复制/粘贴到另一个输入。破坏复制/粘贴是一个主要的可用性问题。它确实使用户不满意,因为它对于他们的心理模型非常重要,以至于他们希望它“起作用”。好像您试图拉一扇门,它从您身边而不是向您摆开!
EMP 2010年

4
每当这样的副本将其粘贴到页面中时,我所要做的就是将文本粘贴到其他地方(我使用URL栏),然后按Ctrl + A(选择刚刚粘贴在url中的文本),然后将浏览器中的字段,其中粘贴被禁用。我猜想,到目前为止,这是无法避免的。
Janakiram

Answers:


180

我只是出于兴趣而这样做。我同意这是不正确的事情,但我认为它应该是OP的决定......另外,代码可以很容易地扩展到增加功能,而不是把它拿走(如更先进的剪贴板,或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");
    });
});
<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>

还要澄清一下,该脚本需要jQuery库。

Codepen示范

编辑:由于蒂姆·唐纳(Tim Down)的建议,删除了3条多余的线(涉及e.which)(请参阅评论)

编辑:添加了对Macs的支持(用cmd键代替ctrl


4
为什么在keydownkeyup处理程序上document?您可以在$(".no-copy-paste").keydown处理程序中测试Ctrl键。此外,也不需要e.keyCode || e.whiche.keyCode在所有可使用的浏览器中e.which运行,因此e.which永远不会使用。也许您正在考虑如何从keypress事件中获取字符代码?最后,这不会对上下文或编辑菜单中的粘贴产生任何影响,但我想OP并没有直接询问。
Tim Down'5

@Tim:文档上的Ctrl键处理程序是通用的-因为他们可能不希望将ctrlDown变量专门链接到无复制粘贴输入。这也许是OTT。感谢您的e。哪一个技巧-从那以后,我花了半小时研究e.keyCode和e。哪个用例的keydown()和keypress()的不同用例,真是一团糟(尤其是在firefox中)!
jackocnr

1
jackocnr:我推荐Jan Wolter的JavaScript密钥处理文章:unixpapa.com/js/key.html我已经多次使用它作为参考,但是没有发现错误。
蒂姆·唐

3
杜德!谢谢!这正是我需要的,它使用户能够在我正在编写的Web应用程序中选择一个“元素”(日历条目),按ctrl + c进行“复制”,然后按ctrl + v进行“粘贴”,而无需实际上与全能的祝福剪贴板进行交互。ctrl + c我记得他们点击了什么,ctrl + v我复制了它,每个人都赢了。
Dan F

2
我不是一个专家或什么,但我想它可能会是更好的测试e.metaKeye.ctrlKey正在true而不是在按键分配数值和测试这些。
sluther

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!')
});

此处提供更多信息:http : //www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/


1
不幸的是,只有选择了文本,此方法才会在Firefox上触发
Yassir Ennazk 2014年

44

虽然将其用作反盗版措施可能很烦人,但我可以看到在某些情况下它是合法的,因此:

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
}

我使用过event.ctrlKey而不是像在Mac OS X上的大多数浏览器中那样检查密钥代码Ctrl/ Alt从未触发过“ down”和“ up”事件,因此唯一的检测方法是event.ctrlKeyCtrl密钥为按住。我也ctrlKeymetaKeyMac 代替了。

此方法的局限性:

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

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

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

  • 对于具有不同键盘布局/区域设置的用户,也不能保证复制/粘贴/剪切的键码相同(尽管布局通常遵循与英语相同的标准),但是总括的“禁用所有控制键”意味着选择全部等。也将被禁用,所以我认为这是一个折衷方案。

14

有这样做的另一种方法: onpasteoncopyoncut事件可以注册并在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
}

Safari使用此方法仍存在一些小问题(防止默认设置时,它会清除剪贴板中的剪切/复制内容),但该错误似乎已在Chrome中修复。

另请参阅: http : //www.quirksmode.org/dom/events/cutcopypaste.html和关联的测试页http://www.quirksmode.org/dom/events/tests/cutcopypaste.html了解更多信息。


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!');
        }
    });

}); 

8

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

jQuery(document).bind("cut copy contextmenu",function(e){
    e.preventDefault();
});

另外在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;
}

4

如果使用该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.
      } 
    }

这是正确的答案!如果已按下该键,则该事件的属性ctrlKey = true。我们不需要任何额外的事件。
JanBrus

3

我写了一个jQuery插件,可以捕获击键。它可以用于在没有操作系统的情况下以html形式启用多种语言脚本输入(字体除外)。它大约有300行代码,也许您想看看:

通常,请谨慎进行此类更改。我为客户端编写了插件,因为没有其他解决方案。


3

您可以使用此代码进行右键单击,CTRL+ CCTRL+ VCTRL+ X检测并阻止其行为

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

3

代替onkeypress,使用onkeydown。

<input type="text" onkeydown="if(event.ctrlKey && event.keyCode==86){return false;}" name="txt">


0

别忘了,尽管您可能能够检测和阻止Ctrl+ C/ V,但是仍然可以更改某个字段的值。
最好的示例是Chrome的Inspect Element函数,它使您可以更改字段的值属性。


0

我已经遇到了您的问题,并通过以下代码解决了它..仅接受数字

$('#<%= 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;
            }
        });

你可以检测到CtrlIDe.which == 17


-1

您可以侦听keypress事件,如果它与特定的键码匹配,则停止默认事件(输入文本)


-1

重要的提示

我使用e.keyCode了一段时间,我检测到当我按ctrl+时.,此属性返回错误的数字190,而ASCII码.为46!

因此,您应该使用e.key.toUpperCase().charCodeAt(0)而不是e.keyCode


-4

有一些预防方法。

但是,用户将始终可以关闭javascript或仅查看页面的源代码。

一些示例(需要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;});

编辑:Tim Down怎么说,所有浏览器都依赖此功能。


2
这有很多问题:首先,它无法在没有paste事件的浏览器中使用,该浏览器包括版本3之前的所有Firefox版本。其次,window.clipboardData它仅是IE,并且我认为现在默认情况下已在IE中将其禁用。第三,禁用所有keydown按下Ctrl键的事件是过多的:您将阻止有用的键盘快捷键,例如Ctrl-A(全选)和Ctrl-Z(撤消)。第四,正如其他人所提到的,这确实是一件坏事。
Tim Down'5

您是正确的,因为它不能在所有浏览器上正常工作。没有人ctrl块确实很烦人。当客户想要阻止“确认电子邮件和密码”字段时,它非常方便。
古斯塔沃·卡多佐
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.