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

如何检测ctrl + vctrl + c使用Javascript?

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

如何做到这一点?

我只是出于兴趣。 我同意这不是正确的做法,但我认为这应该是操作的决定…此外代码可以很容易地扩展到添加function,而不是把它拿走(如更高级的剪贴板,或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; }); }); 

也只是为了澄清,这个脚本需要jQuery库。

Codepen演示

编辑:删除3多余的线(涉及e.which)感谢蒂姆·唐的build议(见评论)

编辑:增加了对Mac的支持(cmd键代替ctrl)

与jQuery的你可以很容易地检测复制,粘贴等绑定function:

 $("#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/

虽然用作反盗版措施可能会令人讨厌,但我可以看到,在某些情况下它可能是合法的,所以:

 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 “向下”和“向上”事件从来没有触发,所以唯一的方法来检测是使用event.ctrlKey 按住Ctrl键后的eg事件。 我也已经用metaKey代替了ctrlKey

这种方法的局限性:

  • Opera不允许禁用右键单击事件
  • 据我所知,在浏览器窗口之间拖放不能被阻止。
  • 例如Firefox中的edit – > copy菜单项仍然可以复制/粘贴。
  • 也不能保证对于具有不同键盘布局/区域设置的复制/粘贴/剪切的人是相同的键码(尽pipe布局通常遵循与英语相同的标准),但是全部“禁用所有控制键”意味着select所有等也将被禁用,所以我认为这是一个妥协,需要作出。

还有另外一种方法: onpasteoncopyoncut事件可以在IE,Firefox,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和相关的testing页面http://www.quirksmode.org/dom/events/tests/cutcopypaste.html

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

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

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

在CSS中禁用文本select可能会得心应手:

 .noselect { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } 

我写了一个jQuery插件,捕获击键。 它可以用来启用多种语言脚本input的HTMLforms没有操作系统(除字体)。 它的约300行代码,也许你想看看:

一般来说,要小心这种改变。 我为客户编写插件,因为其他解决scheme不可用。

而不是onkeypress,使用onkeydown。

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

您可以使用此代码右键, 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(); }); 

您可以聆听按键事件,并在与特定键码匹配时停止默认事件(input文本)

不要忘了,虽然你可能能够检测并阻止Ctrl + C / V ,但你仍然可以改变某个字段的值。
Chrome的Inspect Elementfunction就是最好的例子,它允许你改变字段的值属性。

我已经有你的问题,我解决了以下代码..只接受数字

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

你可以检测Ctrl id e.which == 17

 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; } 

现在要在文本框中引用那些你想限制的方法:

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

有一些方法来防止它。

但是,用户将始终能够closuresJavaScript,或者只是查看页面的源代码。

一些例子(需要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说,这个function都是浏览器依赖。