Как обнаружить Ctrl + V, Ctrl + C с помощью JavaScript?

Как определить ctrl + v, ctrl + c с помощью Javascript?

Мне нужно ограничить вставку в свои текстовые поля, конечный пользователь не должен копировать и вставлять содержимое, пользователь должен набирать текст только в textarea.

Как это сделать?

Ответ 1

Я просто сделал это из интереса. Я согласен, что это не правильно, но я думаю, что это должно быть операционное решение... Также код можно легко расширить, чтобы добавить функциональность, а не убирать его (например, более продвинутый буфер обмена или 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>

Ответ 2

С помощью 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/

Ответ 3

Хотя это может быть раздражающим при использовании в качестве меры борьбы с пиратством, я вижу, что могут быть некоторые случаи, когда это было бы законно, поэтому:

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.

Ограничения этого метода:

  • Opera не позволяет отключать события правого клика

  • Невозможно предотвратить перетаскивание между окнами браузера, насколько я знаю.

  • Пункт меню editcopy, например. Firefox все еще позволяет копировать/вставлять.

  • Также нет гарантии, что для людей с разными раскладками клавиатуры/локалями, которые копируют/вставляют/вырезают, одни и те же коды клавиш (хотя макеты часто следуют тому же стандарту, что и английский), но одеяло "отключить все клавиши управления" означает, что выберите все и т.д., также будут отключены, поэтому я считаю, что компромисс должен быть выполнен.

Ответ 4

Другой способ сделать это: 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 для получения дополнительной информации.

Ответ 5

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!');
        }
    });

}); 

Ответ 6

Краткое решение для предотвращения использования пользователем контекстного меню, копирования и вырезания в 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;
}

Ответ 7

Я написал плагин jQuery, который ловит нажатия клавиш. Его можно использовать для включения ввода нескольких языков script в html-формах без ОС (кроме шрифтов). Его около 300 строк кода, возможно, вам нравится смотреть:

Как правило, будьте осторожны с такими изменениями. Я написал плагин для клиента, потому что другие решения не были доступны.

Ответ 8

вместо onkeypress, используйте onkeydown.

<input type="text" onkeydown="if(event.ctrlKey && event.keyCode==86){return false;}" name="txt">

Ответ 9

Вы можете использовать этот код для правого клика, 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();
    });

Ответ 11

Вы можете прослушать событие нажатия клавиши и остановить событие по умолчанию (ввод текста), если оно соответствует определенным кодам клавиш

Ответ 12

У меня уже есть ваша проблема, и я решил ее по следующему коду.., которые принимают только числа

$('#<%= 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

Ответ 13

Не забывайте, что, хотя вы можете обнаружить и заблокировать Ctrl + C/V, вы все равно можете изменить значение определенного поля.
Лучший пример для этого - функция Chrome Inspect Element, это позволяет вам изменять значение-свойство поля.

Ответ 14

Если вы используете свойство 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.
      } 
    }

Ответ 15

Важная заметка

e.keyCode время я использовал e.keyCode и обнаружил, что когда я нажимаю ctrl + ., этот атрибут возвращает неправильный номер 190, тогда как код ascii равен . это 46!

Поэтому вы должны использовать e.key.toUpperCase().charCodeAt(0) вместо e.keyCode.

Ответ 16

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);"  />

Ответ 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;});

Изменить: как сказал Тим Даун, эти функции являются зависимыми от браузера.