JavaScript를 사용하여 Ctrl + V, Ctrl + C를 감지하는 방법?


173

Javascript를 사용하여 ctrl+ v, ctrl+ 를 감지하는 방법은 c무엇입니까?

텍스트 영역에 붙여 넣기를 제한해야하며 최종 사용자는 내용을 복사하여 붙여 넣어서는 안되고 사용자는 텍스트 영역에만 텍스트를 입력해야합니다.

이것을 달성하는 방법?


3
이것의 목적은 무엇입니까? 내가 생각할 수있는 두 가지 합법적 인 시나리오는 암호 필드 (어쨌든 복사 할 수 없음)와 타이핑 속도 테스트입니다. 의심스러운 빠른 타이핑을 감지 할 수 있습니다.
Paul Butcher

9
@Paul Butcher, @Propeng : 필요한 시나리오가 있습니다. 매우 간단한 예 : 외국어 학습 사이트. 복사 및 붙여 넣기 대신 단어를 직접 입력하면 학습 효과가 향상됩니다.
back2dos

2
또 다른 합법적 인 상황은 실수를 감지하기 위해 이중 입력이 필요한 경우 일 수 있습니다 (예 : 오타가없는 것으로 이메일을 두 번 입력). 그러나 이러한 사용자는 임의로 생성 된 전자 메일 주소 (예 : sneakemail)의 목록을 유지하고 정확성을 위해 붙여 넣기를 원할 수 있습니다.
Paul Butcher

40
@Paul Butcher-그것은 합법적 인 상황이 아니며, 나는 그것을하는 사이트를 싫어 하고 항상 한 입력에서 다른 입력으로 내 (긴) 전자 메일 주소를 복사 / 붙여 넣습니다. 복사 / 붙여 넣기를 끊는 것은 중요한 유용성 문제입니다. 그것은 정신적 모델에 매우 기초적이어서 사용자들이 "정상적으로 작동"하기를 기대하기 때문에 실제로 사용자를 버립니다. 마치 문을 당기려고했던 것처럼 마치 당신 대신에 당신에게서 멀어졌습니다!
EMP

4
이러한 복사 붙여 넣기가 페이지에 허용되지 않을 때마다 내가하는 일은 텍스트를 다른 곳에 붙여 넣은 다음 (URL 표시 줄 사용) Ctrl + A (URL에 붙여 넣은 텍스트 선택)를 드래그 앤 드롭하십시오. 붙여 넣기가 비활성화 된 찾아보기의 입력란 나는 이것이 오늘날 막을 수없는 것 같아요.
Janakiram

답변:


180

방금 관심을 끌지 않았습니다. 나는 그것이 옳은 일이 아니다 동의하지만, 나는 또한 코드가 쉽게 기능을 추가하기보다는 고급 클립 보드처럼 (그것을 빼앗아, 또는 확장 할 수있는 연산의 결정 ...해야한다고 생각 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 줄의 중복 줄을 제거했습니다 (댓글 포함).

편집 : Mac 지원 추가 ( cmd키 대신 키 ctrl)


4
keydown그리고 keyup핸들러에 document? $(".no-copy-paste").keydown핸들러 에서 Ctrl 키를 테스트 할 수 있습니다 . 또한 e.keyCode || e.which비트 가 필요하지 않습니다 . e.keyCode작동하는 모든 브라우저에서 e.which작동하므로 e.which절대 사용되지 않습니다. 아마도 keypress이벤트 에서 캐릭터 코드를 얻는 방법을 생각하고 있었 습니까? 마지막으로 컨텍스트 또는 편집 메뉴의 붙여 넣기에 대해서는 아무 것도 수행하지 않지만 OP가 직접 묻지 않았다고 가정합니다.
Tim Down

@Tim : 문서의 Ctrl 키 핸들러는 일반적입니다. ctrlDown 변수가 복사 방지 붙여 넣기 입력에만 독점적으로 연결되지 않도록 할 수 있습니다. 아마도 OTT 일 것입니다. e. which tip 주셔서 감사합니다-나는 30 분 동안 e.keyCode 및 e.keydown () 및 keypress ()를 사용하는 다른 유스 케이스를 연구하고 혼란 (특히 파이어 폭스)을 연구했습니다!
jackocnr

1
jackocnr : Jan Wolter의 JavaScript 키 처리 기사를 추천합니다 : unixpapa.com/js/key.html 여러 번 참조하기 위해 사용했지만 오류를 찾지 못했습니다.
Tim Down

3
친구! 감사! 이것은 내가 작성한 웹 앱에서 사용자가 "요소"(달력 항목)를 선택하고 ctrl + c를 눌러 "복사"한 다음 ctrl + v를 눌러 "붙여 넣기"하는 데 필요한 것입니다. 전능하신 축복 클립 보드와 실제로 상호 작용합니다. ctrl + c 클릭 한 것을 기억합니다. ctrl + v 복제합니다. 모두 이깁니다.
Dan F

2
나는 전문가 또는 아무것도 아니에요,하지만 난 아마 테스트하기 위해 더 좋을 거라 생각 e.metaKey이나 e.ctrlKey되는 true대신 키에 숫자 값을 할당하고 그 테스트.
sluther

52

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/


1
텍스트를 선택하면 불행하게도,이 방법은 파이어 폭스에서 실행됩니다
야 시르 Ennazk

44

불법 복제 방지 수단으로 사용하면 성가신 일이 있지만 합법적 인 사례가있을 수 있습니다.

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.ctrlKeyMac OS X Ctrl/ Alt"down"및 "up"이벤트는 트리거되지 않으므로 대부분의 브라우저에서 키 코드를 확인 하는 대신 키 코드를 확인 하는 대신 키 를 사용한 event.ctrlKey후 예를 들어 c 이벤트에서 감지하는 것이 유일한 방법 Ctrl입니다. 를 제지하다. 나는 또한 Mac을 대신 ctrlKey했습니다 metaKey.

이 방법의 한계 :

  • Opera는 오른쪽 클릭 이벤트 비활성화를 허용하지 않습니다

  • 내가 아는 한 브라우저 창의 드래그 앤 드롭을 방지 할 수 없습니다.

  • Firefox 의 edit-> copy메뉴 항목은 여전히 ​​복사 / 붙여 넣기를 허용 할 수 있습니다.

  • 복사 / 붙여 넣기 / 잘라내 기가 다른 키보드 레이아웃 / 로케일을 가진 사람들에게 동일한 키 코드 (레이아웃은 종종 영어와 동일한 표준을 따르지만)라는 보장이 없지만 담요 "모든 컨트롤 키 비활성화"는 모든 것을 선택한다는 의미입니다. 또한 비활성화 될 것이므로 그것이 타협해야한다고 생각합니다.

14

:이 이렇게 또 다른 방법이있다 onpaste , oncopy그리고 oncut이러한 이벤트를 취소하는 오페라이다 허용하지 않는 유일한 주요 브라우저, 이벤트 등록 (약간의 문제) IE, 파이어 폭스, 크롬, 사파리에서 취소 할 수 있습니다.

당신이 내 다른 대답에서 볼 수 있듯이 Ctrl+ vCtrl+를 가로채는 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 을 참조하십시오.


9

라이브 데모 : 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!');
        }
    });

}); 

8

사용자가 컨텍스트 메뉴를 사용하지 못하고 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;
}

4

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.
      } 
    }

이것이 정답입니다! 이벤트에는 키를 눌렀을 때 ctrlKey = true 속성이 있습니다. 추가 이벤트가 필요하지 않습니다.
JanBrus

3

키 스트로크를 잡는 jQuery 플러그인을 작성했습니다. OS가없는 html 형식 (글꼴 제외)으로 다중 언어 스크립트 입력을 활성화하는 데 사용할 수 있습니다. 약 300 줄의 코드가 있습니다.

일반적으로 이러한 종류의 변경에주의하십시오. 다른 솔루션을 사용할 수 없으므로 클라이언트 용 플러그인을 작성했습니다.


3

이 코드를 사용하여 마우스 오른쪽 버튼 클릭, 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();
    });

3

onkeypress 대신 onkeydown을 사용하십시오.

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


0

Ctrl+ C/ 를 감지하고 차단할 V수는 있지만 여전히 특정 필드의 값을 변경할 수 있다는 것을 잊지 마십시오 .
이에 대한 가장 좋은 예는 Chrome의 요소 검사 기능입니다.이를 통해 필드의 값 속성을 변경할 수 있습니다.


0

나는 이미 문제가 있고 다음 코드로 해결했습니다 .. 숫자 만 허용합니다.

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

당신은 CtrlID 를 감지 할 수 있습니다e.which == 17


-1

키 누르기 이벤트를 듣고 특정 키 코드와 일치하는 경우 기본 이벤트 (텍스트 입력)를 중지 할 수 있습니다


-1

중요 사항

나는 e.keyCode잠시 동안 사용 하고 있었고 ctrl+를 누를 때이 .속성은 잘못된 숫자 190을 반환하지만 ASCII 코드 .는 46입니다!

따라서 e.key.toUpperCase().charCodeAt(0)대신 사용해야 합니다 e.keyCode.


-4

이를 방지 할 수있는 몇 가지 방법이 있습니다.

그러나 사용자는 항상 자바 스크립트를 끄 거나 페이지의 소스 코드를 볼 수 있습니다.

몇 가지 예 (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;});

편집 : Tim Down의 말에 따르면,이 기능은 모두 브라우저에 따라 다릅니다.


2
여기에는 여러 가지 문제가 있습니다. 첫째, paste버전 3 이전의 모든 Firefox 버전을 포함 하는 이벤트 가없는 브라우저에서는 작동하지 않습니다. 둘째, window.clipboardDataIE 전용이며 IE에서는 기본적으로 비활성화되어 있습니다 . 셋째, keydownCtrl 키를 누르는 모든 이벤트를 비활성화하는 것은 과도합니다. Ctrl-A (모두 선택) 및 Ctrl-Z (실행 취소)와 같은 유용한 키보드 단축키를 방지합니다. 넷째, 다른 사람들이 언급했듯이 이것은 정말 나쁜 일입니다.
Tim Down

모든 브라우저에서 작동하는 것은 아닙니다. 아무도 ctrl 블록은 실제로 성가시다. 클라이언트가 "이메일 및 비밀번호 확인"필드를 차단하려고 할 때 한 번 편리했습니다.
구스타보 카르도소
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.