如何使用JavaScript检测Ctrl + V,Ctrl + C?
如何检测ctrl + v , ctrl + 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所有等也将被禁用,所以我认为这是一个妥协,需要作出。
还有另外一种方法: onpaste
, oncopy
和oncut
事件可以在IE,Firefox,Chrome,Safari中注册和取消(有一些小问题),唯一不允许取消这些事件的主要浏览器是Opera。
正如你可以看到我的另一个答案拦截Ctrl + V和Ctrl + 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 + C , CTRL + V , CTRL + 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都是浏览器依赖。