Как определить 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;});
Изменить: как сказал Тим Даун, эти функции являются зависимыми от браузера.