JavaScriptを使用してCtrl + V、Ctrl + Cを検出する方法


173

ctrl+ vctrl+ cJavaScriptを使用して検出する方法は?

テキストエリアへの貼り付けを制限する必要があります。エンドユーザーはコンテンツをコピーして貼り付けないでください。ユーザーはテキストエリアにテキストを入力するだけです。

これを達成する方法は?


3
これの目的は何ですか?私が考えることができる唯一の2つの正当なシナリオは、パスワードフィールド(とにかくコピーすることはできません)と入力速度テストです。疑わしい高速タイピングを検出できると思います。
ポールブッチャー

9
@Paul Butcher、@ Propeng:これが必要なシナリオがあります。非常に単純な例:外国語を学習するためのサイト。コピー&ペーストを使用する代わりに手で単語を入力すると、学習効果が向上します。
back2dos 2010年

2
もう1つの正当な状況としては、間違いを検出するために二重入力が必要な場合があります(たとえば、メールを2回入力して、タイプミスがないことを確認します)。それでも、そのようなユーザーはランダムに生成された電子メールアドレス(sneakemailなど)のリストを保持している可能性があり、正確性を保つために貼り付けたいと思うでしょう。
ポールブッチャー

40
@Paul Butcher-それは合法的な状況ではありません。私そのようサイトを嫌い、私は常に(長い)メールアドレスをある入力から別の入力にコピー/ペーストします。コピー/貼り付けを壊すことは、主要なユーザビリティの問題です。それは彼らのメンタルモデルにとって非常に基本的であり、彼らがそれが「ただ働く」ことを期待するので、それは本当にユーザーを捨てます。ドアを引こうとしたとき、ドアが手前ではなく手前に振られたようです。
EMP

4
そのようなコピーがページで許可されていない場合はいつでも、私は何をしますか?テキストをどこかに貼り付け(私はURLバーを使用します)、次にCtrl + A(URLに貼り付けたばかりのテキストを選択します)、ドラッグアンドドロップします貼り付けが無効になっているブラウズのフィールド。おそらくこれは今日では防止できないものです。
Janakiram、

回答:


180

興味がないのでこれをやった。私はそれが正しいことではないことに同意しますが、それは運用者の決定であると思います...また、コードを拡張して機能を追加するのではなく、簡単に拡張できます(より高度なクリップボードやCtrl+ sサーバーのトリガーなど) -side save)。

$(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ライブラリが必要です。

Codepenデモ

編集:ティムダウンの提案のおかげで(e.whichを含む)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:ドキュメントのCtrlキーハンドラーを一般的なものにする-ctrlDown変数をコピー/貼り付けなしの入力に排他的にリンクしたくない場合があるため。これはおそらくOTTです。e.whichのヒントをありがとう-私はそれ以来、e.keyCodeとe.whichのkeydown()とkeypress()を使用したさまざまな使用例を調査するのに30分費やしました。
jackocnr

1
jackocnr:Jan WolterのJavaScriptキー処理に関する記事をお勧めします:unixpapa.com/js/key.htmlこれを何度も参照に使用しましたが、エラーは見つかりませんでした。
Tim Down、

3
おい!ありがとう!これは、私が書いているWebアプリで「要素」(カレンダーエントリ)をユーザーが選択できるようにするために必要なもので、Ctrl + Cを押して「コピー」し、Ctrl + Vを押して「貼り付け」ます。実際に全能の祝福されたクリップボードを操作します。ctrl + c私は彼らがクリックしたものを覚えています、ctrl + v私はそれを複製します、誰もが勝ちます。
Dan F

2
私はエキスパートでも何でもありませんが、数値をキーに割り当ててテストするのではなく、テストするe.metaKeyか、テストする方が良いでしょう。e.ctrlKeytrue
痴女

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
残念ながら、このメソッドはテキストが選択されている場合にのみFirefoxで
起動し

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.ctrlKeyというのMac OS X上のほとんどのブラウザ上のようにキーコードをチェックするよりもCtrl/ Altイベントがトリガされることはありません「UP」を検出する唯一の方法は使用することですので、「ダウン」とevent.ctrlKeyした後、例えば、CイベントにCtrlキーがあります押したまま。Mac でも代用ctrlKeymetaKeyています。

このメソッドの制限:

  • Operaは右クリックイベントを無効にすることを許可していません

  • ブラウザウィンドウ間でのドラッグアンドドロップは、私の知る限り防止できません。

  • Firefoxなどのedit-> copyメニュー項目でも、コピー/貼り付けを許可できます。

  • キーボードレイアウト/ロケールが異なる人々がコピー/貼り付け/カットするキーコードが同じであるという保証はありません(ただし、レイアウトは多くの場合英語と同じ標準に従うだけです)。無効になるので、妥協が必要だと思います。

14

そこにこれを行うための別の方法があります: onpasteoncopyおよびoncutイベントは(いくつかのマイナーな問題を持つ)IE、Firefoxの、クロム、サファリに登録してキャンセルすることができ、これらのイベントをキャンセルすることはできません唯一の主要なブラウザはOperaのです。

他の回答でわかるように、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も参照してください。



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+ CCTRL+ VCTRL+を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のInspect Element関数です。これにより、フィールドの値プロパティを変更できます。


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

keypressイベントをリッスンし、特定のキーコードと一致する場合はデフォルトのイベント(テキストの入力)を停止できます


-1

重要な注意点

e.keyCodeしばらく使用していて、ctrl+を押すと.、この属性が誤った数値190を返すのを検出しました。ASCIIコード.は46です。

したがって、のe.key.toUpperCase().charCodeAt(0)代わりに使用する必要がありますe.keyCode


-4

それを防ぐ方法はいくつかあります。

ただし、ユーザーはいつでも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;});

編集:Tim Downの発言によると、この機能はすべてブラウザに依存しています。


2
これにはいくつかの問題があります。1つpaste目は、バージョン3より前のすべてのバージョンのFirefoxを含む、イベントのないブラウザーでは機能しません。2つ目は、window.clipboardDataIEのみで、IEではデフォルトで無効になっていると思います。 。3番目に、keydownCtrlキーが押されたすべてのイベントを無効にすることは過剰です。Ctrl-A(すべて選択)やCtrl-Z(元に戻す)などの便利なキーボードショートカットを使用できなくなります。第四に、他の人が述べたように、これは本当に悪いことです。
Tim Down、

あなたはそれがすべてのブラウザで機能しないことについて正しいです。誰もctrlブロックは本当に迷惑です。クライアントが「確認メールとパスワード」フィールドをブロックしたいと思ったときに便利でした。
Gustavo Cardoso
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.