如何检测ctrl+v使用Javascript,ctrl+ c?
我需要限制粘贴在我的文本区域中,最终用户不应复制和粘贴内容,用户只能在文本区域中键入文本。
如何实现呢?
如何检测ctrl+v使用Javascript,ctrl+ c?
我需要限制粘贴在我的文本区域中,最终用户不应复制和粘贴内容,用户只能在文本区域中键入文本。
如何实现呢?
Answers:
我只是出于兴趣而这样做。我同意这是不正确的事情,但我认为它应该是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库。
编辑:由于蒂姆·唐纳(Tim Down)的建议,删除了3条多余的线(涉及e.which)(请参阅评论)
编辑:添加了对Macs的支持(用cmd键代替ctrl)
keydown
和keyup
处理程序上document
?您可以在$(".no-copy-paste").keydown
处理程序中测试Ctrl键。此外,也不需要e.keyCode || e.which
:e.keyCode
在所有可使用的浏览器中e.which
运行,因此e.which
永远不会使用。也许您正在考虑如何从keypress
事件中获取字符代码?最后,这不会对上下文或编辑菜单中的粘贴产生任何影响,但我想OP并没有直接询问。
e.metaKey
或e.ctrlKey
正在true
而不是在按键分配数值和测试这些。
使用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/
虽然将其用作反盗版措施可能很烦人,但我可以看到在某些情况下它是合法的,因此:
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.ctrlKey
在Ctrl密钥为按住。我也ctrlKey
用metaKey
Mac 代替了。
此方法的局限性:
edit
-> copy
菜单项仍然可以允许复制/粘贴。有这样做的另一种方法: onpaste
,oncopy
和oncut
事件可以注册并在IE,火狐,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和关联的测试页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!');
}
});
});
防止用户使用上下文菜单,在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;
}
如果使用该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.
}
}
我写了一个jQuery插件,可以捕获击键。它可以用于在没有操作系统的情况下以html形式启用多种语言脚本输入(字体除外)。它大约有300行代码,也许您想看看:
通常,请谨慎进行此类更改。我为客户端编写了插件,因为没有其他解决方案。
您可以使用此代码进行右键单击,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();
});
另一种方法(不需要插件)仅使用传入ctrlKey
的事件对象的属性。它指示是否Ctrl在事件发生时按下,例如:
$(document).keypress("c",function(e) {
if(e.ctrlKey)
alert("Ctrl+C was pressed!!");
});
我已经遇到了您的问题,并通过以下代码解决了它..仅接受数字
$('#<%= 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
有一些预防方法。
但是,用户将始终可以关闭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怎么说,所有浏览器都依赖此功能。
paste
事件的浏览器中使用,该浏览器包括版本3之前的所有Firefox版本。其次,window.clipboardData
它仅是IE,并且我认为现在默认情况下已在IE中将其禁用。第三,禁用所有keydown
按下Ctrl键的事件是过多的:您将阻止有用的键盘快捷键,例如Ctrl-A(全选)和Ctrl-Z(撤消)。第四,正如其他人所提到的,这确实是一件坏事。