Как определить ctrl + v, ctrl + c с помощью Javascript?
Мне нужно ограничить вставку в свои текстовые поля, конечный пользователь не должен копировать и вставлять содержимое, пользователь должен набирать текст только в textarea.
Как это сделать?
Как определить ctrl + v, ctrl + c с помощью Javascript?
Мне нужно ограничить вставку в свои текстовые поля, конечный пользователь не должен копировать и вставлять содержимое, пользователь должен набирать текст только в 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 вы можете легко обнаружить копирование, вставку и т.д., связывая функцию:
$("#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
вместо проверки на key code, как на большинстве браузеров в Mac OS X Ctrl/Alt "down", а события "up" никогда не запускаются, поэтому единственный способ обнаружить - использовать event.ctrlKey
в eg c после нажатия клавиши Ctrl. Я также заменил ctrlKey
на metaKey
для macs.
Ограничения этого метода:
edit
→ copy
, например. Firefox все еще позволяет копировать/вставлять. Другой способ сделать это: 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 все еще есть некоторые незначительные проблемы с этим методом (он очищает буфер обмена вместо cut/copy при предотвращении по умолчанию), но эта ошибка, похоже, теперь исправлена в Chrome.
См. также: http://www.quirksmode.org/dom/events/cutcopypaste.html и связанная с ним тестовая страница http://www.quirksmode.org/dom/events/tests/cutcopypaste.html для получения дополнительной информации.
Live Demo: 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;
}
Я написал плагин jQuery, который ловит нажатия клавиш. Его можно использовать для включения ввода нескольких языков script в html-формах без ОС (кроме шрифтов). Его около 300 строк кода, возможно, вам нравится смотреть:
Как правило, будьте осторожны с такими изменениями. Я написал плагин для клиента, потому что другие решения не были доступны.
вместо 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();
});
Другой подход (без плагинов) - просто использовать свойство ctrlKey
объекта , который передается. Он указывает, если Ctrl было нажата во время события, например:
$(document).keypress("c",function(e) {
if(e.ctrlKey)
alert("Ctrl+C was pressed!!");
});
См. также jquery: keypress, ctrl + c (или некоторые комбо-подобные).
Вы можете прослушать событие нажатия клавиши и остановить событие по умолчанию (ввод текста), если оно соответствует определенным кодам клавиш
У меня уже есть ваша проблема, и я решил ее по следующему коду.., которые принимают только числа
$('#<%= 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
Не забывайте, что, хотя вы можете обнаружить и заблокировать Ctrl + C/V, вы все равно можете изменить значение определенного поля.
Лучший пример для этого - функция Chrome Inspect Element, это позволяет вам изменять значение-свойство поля.
Если вы используете свойство 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.
}
}
e.keyCode
время я использовал e.keyCode
и обнаружил, что когда я нажимаю ctrl + ., этот атрибут возвращает неправильный номер 190, тогда как код ascii равен .
это 46!
Поэтому вы должны использовать e.key.toUpperCase().charCodeAt(0)
вместо e.keyCode
.
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);" />
Есть несколько способов предотвратить это.
Однако пользователь всегда сможет отключить 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;});
Изменить: как сказал Тим Даун, эти функции являются зависимыми от браузера.