如何检测ctrl+ v, ctrl+c使用 Javascript?
我需要限制在我的 textarea 中粘贴,最终用户不应复制和粘贴内容,用户只能在 textarea 中键入文本。
如何实现这一目标?
如何检测ctrl+ v, ctrl+c使用 Javascript?
我需要限制在我的 textarea 中粘贴,最终用户不应复制和粘贴内容,用户只能在 textarea 中键入文本。
如何实现这一目标?
我只是出于兴趣这样做。我同意这不是正确的做法,但我认为这应该是操作员的决定......此外,代码可以轻松扩展以添加功能,而不是将其删除(例如更高级的剪贴板,或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)
使用 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“向下”和“向上”事件永远不会被触发,因此检测的唯一方法是event.ctrlKey
在Ctrl键之后在 eg c 事件中使用按住。我也ctrlKey
用metaKey
for macs代替。
这种方法的局限性:
edit
->copy
菜单项仍然可以允许复制/粘贴。有这样做的另一种方法: onpaste
,oncopy
和oncut
事件可以注册并在IE,火狐,Chrome,Safari浏览器取消了(有一些小问题),唯一的主要的浏览器不允许取消这些活动是Opera。
正如您在我的其他答案中看到的那样,拦截Ctrl+v和Ctrl+c会带来许多副作用,但它仍然无法阻止用户使用 FirefoxEdit
菜单等进行粘贴。
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!');
}
});
});