如何使用JavaScript检测Ctrl+V、Ctrl+C?
我需要限制在文本区域内粘贴,请用户不要复制和粘贴内容,用户只能在文本区域中输入文本。
我该如何实现这个功能?
如何使用JavaScript检测Ctrl+V、Ctrl+C?
我需要限制在文本区域内粘贴,请用户不要复制和粘贴内容,用户只能在文本区域中输入文本。
我该如何实现这个功能?
我只是出于兴趣这样做了,我同意这不是正确的做法,但我认为应该由操作者自行决定...此外,代码可以很容易地扩展以添加功能,而不是减少功能(例如更高级的剪贴板或通过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)
编辑:增加对Mac的支持(CMD 键代替 Ctrl)
document
上使用keydown
和keyup
处理程序?您可以在$(".no-copy-paste").keydown
处理程序中测试Ctrl键。另外,没有必要使用e.keyCode || e.which
代码:e.keyCode
适用于所有支持e.which
的浏览器,因此e.which
永远不会被使用。也许您正在考虑如何从keypress
事件获取字符代码?最后,这将对从上下文或编辑菜单粘贴的内容无效,但我想OP并没有直接问到这个。 - Tim Downe.metaKey
或 e.ctrlKey
是否为 true
,而不是将数字值分配给键并测试它们。 - sluther使用 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下和上事件不会被触发,所以唯一检测的方法是在按住Ctrl键后在例如事件中使用event.ctrlKey
。我还将ctrlKey
替换为metaKey
适用于Mac。
这种方法的限制:
edit
->copy
菜单项仍然可以允许复制/粘贴。如果您使用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.
}
}
还有另一种方法:可以在IE、Firefox、Chrome和Safari(存在一些小问题)中注册并取消onpaste
、oncopy
和oncut
事件。唯一不允许取消这些事件的主要浏览器是Opera。
正如您在我的另一个回答中所看到的,拦截Ctrl+V和Ctrl+C会带来许多副作用,而且仍然无法防止用户使用Firefox 编辑
菜单等进行粘贴操作。
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中仍然存在一些小问题(阻止默认操作时它会清空剪贴板而不是剪切/复制),但这个 bug 看起来现在已经在 Chrome 中修复了。
另请参阅:有关更多信息,请访问http://www.quirksmode.org/dom/events/cutcopypaste.html以及相关的测试页面http://www.quirksmode.org/dom/events/tests/cutcopypaste.html。
使用jQuery防止用户使用上下文菜单、复制和剪切的简短解决方案:
jQuery(document).bind("cut copy contextmenu",function(e){
e.preventDefault();
});
在IT技术方面,禁用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;
}
在线演示: 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!');
}
});
});
ctrlKey
属性。它指示在事件发生时是否按下了Ctrl,如下所示:$(document).keypress("c",function(e) {
if(e.ctrlKey)
alert("Ctrl+C was pressed!!");
});
您可以使用这段代码来检测并防止右键点击、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();
});
element.addEventListener('keydown', function (e) {
if (e.key == 'c' && e.ctrlKey) {
e.preventDefault(); // prevent from copying
}
if (e.key == 'v' && e.ctrlKey) {
e.preventDefault(); // prevent from pasting
}
}