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

Как обнаружить ctrl+v, ctrl+c использование JavaScript?

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

Как достигнуть этого?

157
задан fifi finance 30 July 2015 в 10:44
поделиться

8 ответов

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

Ctrl + c Ctrl + v отключено



Ctrl + c Ctrl + v разрешено

Также для пояснения, для этого скрипта требуется библиотека jQuery.

Демонстрация Codepen

РЕДАКТИРОВАТЬ: удалены 3 избыточные строки (включая e.which) благодаря предложению Тима Дауна (см. Комментарии)

РЕДАКТИРОВАТЬ: добавлена ​​поддержка Mac (клавиша cmd вместо ctrl)

171
ответ дан 23 November 2019 в 21:45
поделиться
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);"  />
-2
ответ дан 23 November 2019 в 21:45
поделиться

Есть несколько способов предотвратить это.

Однако пользователь всегда сможет отключить 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;});

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

-4
ответ дан 23 November 2019 в 21:45
поделиться

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

0
ответ дан 23 November 2019 в 21:45
поделиться

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

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

3
ответ дан 23 November 2019 в 21:45
поделиться

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

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 в, например, c после нажатия клавиши Ctrl . Я также заменил ctrlKey на metaKey для Mac.

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

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

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

  • Пункт меню редактировать -> копировать , например, в Firefox по-прежнему может разрешать копирование / вставку.

  • Также нет никакой гарантии, что для людей с разными раскладками / языками клавиатуры, которые копируют / вставляют / вырезают одни и те же коды клавиш (хотя раскладки часто просто следуют тому же стандарту, что и английский), но бланк «отключить все клавиши управления» означает, что выбрать все и т. д. также будут отключены, поэтому я думаю, что необходимо пойти на компромисс.
38
ответ дан 23 November 2019 в 21:45
поделиться

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

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

0
ответ дан 23 November 2019 в 21:45
поделиться

Есть другой способ сделать это: 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 по-прежнему имеет некоторые незначительные проблемы с этим методом (он очищает буфер обмена вместо вырезания / копирования при предотвращении по умолчанию), но похоже, что эта ошибка исправлена ​​в Chrome.

См. Также: http://www.quirksmode.org/dom/events/cutcopypaste.html и соответствующую тестовую страницу http://www.quirksmode.org/dom/events /tests/cutcopypaste.html для получения дополнительной информации.

13
ответ дан 23 November 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: