HTMLフォームへのテキストの貼り付けを無効にする


96

JavaScriptを使用して、HTMLフォームのテキストフィールドにテキストを貼り付ける機能を無効にする方法はありますか?

たとえば、ユーザーがメールを2回入力する必要がある単純な登録フォームがあります。2番目の電子メールエントリは、最初の電子メールエントリにタイプミスがないことを確認するためのものです。ただし、ユーザーがメールをコピー/貼り付けすると目的が達成されず、ユーザーが間違ったメールを入力してコピー/貼り付けしたために問題が発生しています。

多分私は私の質問をはっきりしていませんでしたが、私は人々が彼らのブラウザでテキストをコピーする(または選択をドラッグする)ことを防ぐことを試みていません。ユーザーのエラーを最小限に抑えるために、入力をテキストフィールドに貼り付けないようにするだけです。

おそらく、この「ハック」を使用する代わりに、ここで解決しようとしている問題の中心的な問題に対する別の解決策を提案できますか?私は半ダース未満のユーザーテストを実行しましたが、これはすでに2回発生しています。私の聴衆は、高度なコンピュータ能力を持っていません。


111
ユーザーが自分のメールアドレスをアドレス帳からブラウザにコピー/貼り付けできないようにします。それはうまくいきます。
クエンティン

28
変更を主張しているクライアントの場合、多くのことはできません。ドリンクをお楽しみください:)
justinl

15
メールが元のフィールドに貼り付けられなかった場合にのみ、確認フィールドでの貼り付けを無効にしても問題はありません。つまり、ユーザーはメールを両方のフィールドに貼り付けるか、どちらのフィールドにも貼り付ける必要があります。
GJ。

25
クライアントがこれを求めている場合は、それがどれほどひどい考えかを伝えます。これは、クライアントが(登録時に)立ち去る可能性が最も高い時点でクライアントを怒らせるのに最適な方法です。顧客との関係が、疎外されている顧客から始まるのは望ましくありません。この慣行はますます一般的になり、より多くの人々がパスワードマネージャーを使用するにつれて、ますます不快になっています。ux.stackexchange.com/q/21062/9529およびob も参照してください。xkcd:xkcd.com/970
マークブース

エレメントインスペクターでこの「機能」を無効にする方法を探しているときに、この質問を見つけました。出来た!
SVD 2017年

回答:


53

私は最近、不本意ながらフォーム要素の貼り付けを無効にする必要がありました。そのために、私はInternet Explorer(およびその他)のonpasteイベントハンドラーのクロスブラウザー*実装を作成しました。私のソリューションは、サードパーティのJavaScriptライブラリから独立している必要がありました。

これが私が思いついたものです。貼り付けを完全に無効にするわけではありませんが(たとえば、ユーザーが一度に1文字を貼り付けることができます)、私のニーズを満たし、keyCodeなどを処理する必要がなくなります。

// Register onpaste on inputs and textareas in browsers that don't
// natively support it.
(function () {
    var onload = window.onload;

    window.onload = function () {
        if (typeof onload == "function") {
            onload.apply(this, arguments);
        }

        var fields = [];
        var inputs = document.getElementsByTagName("input");
        var textareas = document.getElementsByTagName("textarea");

        for (var i = 0; i < inputs.length; i++) {
            fields.push(inputs[i]);
        }

        for (var i = 0; i < textareas.length; i++) {
            fields.push(textareas[i]);
        }

        for (var i = 0; i < fields.length; i++) {
            var field = fields[i];

            if (typeof field.onpaste != "function" && !!field.getAttribute("onpaste")) {
                field.onpaste = eval("(function () { " + field.getAttribute("onpaste") + " })");
            }

            if (typeof field.onpaste == "function") {
                var oninput = field.oninput;

                field.oninput = function () {
                    if (typeof oninput == "function") {
                        oninput.apply(this, arguments);
                    }

                    if (typeof this.previousValue == "undefined") {
                        this.previousValue = this.value;
                    }

                    var pasted = (Math.abs(this.previousValue.length - this.value.length) > 1 && this.value != "");

                    if (pasted && !this.onpaste.apply(this, arguments)) {
                        this.value = this.previousValue;
                    }

                    this.previousValue = this.value;
                };

                if (field.addEventListener) {
                    field.addEventListener("input", field.oninput, false);
                } else if (field.attachEvent) {
                    field.attachEvent("oninput", field.oninput);
                }
            }
        }
    }
})();

貼り付けを無効にするためにこれを利用するには:

<input type="text" onpaste="return false;" />

* oninputはW3C DOM仕様の一部ではありませんが、このコードでテストしたすべてのブラウザー(Chrome 2、Safari 4、Firefox 3、Opera 10、IE6、IE7)は、oninputまたはonpasteをサポートしています。これらすべてのブラウザーの中で、Operaのみがオンペーストをサポートしていませんが、オンインプットはサポートしています。

注:これは、画面キーボードを使用するコンソールまたはその他のシステムでは機能しません(画面キーボードは、各キーが選択されたときにブラウザーにキーを送信しないと想定しています)。画面キーボードとOpera(例:ニンテンドーWii、一部の携帯電話)を使用しているユーザーがページ/アプリを使用できる可能性がある場合は、画面キーボードを確認するためのテストを行っていない限り、このスクリプトを使用しないでください。キーを選択するたびにブラウザにキーを送信します。


58
Firefoxがこの愚かなルールに従わないようにするには、about:configに移動し、dom.event.clipboardevents.enabledをfalseに変更します
lolesque

1
あなたが書いたjsを含めない場合でも、を含めるだけでユーザーが何も貼り付けられないようにすることができます。onpaste="return false"そのアプローチを使用すると問題が発生します
viveksinghggits

@viveksinghggitsコードはonpaste、まだ提供していないブラウザに実装されます。「ユーザーが何も貼り付けられないようにすることができます」言いましたが、どのブラウザでテストしましたか?
AnnanFay 2016年

実装に関しては、2つの明らかな改善が見られます。1)オンペーストがまだサポートされていないブラウザーでのみコードを実行する、2)DOMが変更されたときに再実行する-現在、動的に追加された入力には適用されません。
AnnanFay 2016年

@リック、ユーザーが何かを貼り付けることができるテキストエリアで大丈夫ですか?貼り付けられたデータが表示されている他の画面でもまったく同じに見えることを期待し、データが電子メールに挿入されたときにまったく同じに見えることを期待します。私には、電話やサポートメールが同梱されるのは嫌です。特定のフィールドでの貼り付けを無効にすることは、実行可能なオプションと質問です。私たちのほとんどが抱えている問題は、「リッチテキストエディター」を使用するときです。これらのことは、貼り付けを防ぐために、存在するjavascriptまたはjqueryコマンドをオーバーライドするようです。
McAuley 2018

144

しないでください。ユーザーのブラウザをいじらないでください。電子メールの確認フィールドにコピーして貼り付けることにより、ユーザーは入力内容に対する責任を負います。彼らが欠陥のある住所をコピーして貼り付けるのに十分なほどに馬鹿げている場合(それは私に起こりました)、それは彼ら自身のいまいましい欠陥です。

メールの確認が正しく機能することを確認する場合は、サイトの待機中にユーザーにメールを確認してもらいます(「新しいウィンドウでウェブメールプログラムを開いてください」)。メールアドレスを太字で表示します(「確認メールの送信先...エラーが発生しました。ここをクリックして変更してください)。

さらに可能であれば、ユーザーに確認せずに何らかの制限付きアクセスを許可してください。そうすれば、彼らはすぐにログインでき、他の理由(スパムフィルターなど)によって確認メールがブロックされた場合でも、訪問者と連絡を取り合う機会が増えます。


6
ユーザーが自分でデータを入力する場合のシナリオに対するあなたの回答に同意します。ただし、ユーザーが他の誰か(CRMシステムなど)の代わりに電子メールアドレスを入力している場合、ソリューションを実装することはできません。これらの場合、ユーザーは自分のメールアドレスを入力するのではなく、スペルを間違える可能性があります。メールの確認ボックスへの貼り付けを許可すると、不正なデータが大量に取得されるため、貼り付けを防止しても問題はありません。開発者は、ビジネスのデータを保護するのに十分な量のないユーザーに対して軽減する必要があります。
theyetiman 2013

12
また、この質問を見ている開発者が、自分が取り組んでいるプロジェクトの要件をほとんどまたはまったく制御できない場合もあります。これは、ここで尋ねられる質問に対する回答ではないので、-1です。
Nick

4
それをしないと言っても、質問には答えません。現在、貼り付けを無効にする必要があります。
Darian Everett

13
このような要件が与えられた場合、それを押し返すのは専門家としてのあなたの仕事です。あなたはコードを書くことができる手のペア以上のものです。
Dan Pantry

2
しかし、ほとんどすべての正当な理由があり、誰かの質問に答えないことには理由があります。複雑な答えで実装しようとしたクイズがあったとしましょう。貼り付けを無効にし、生徒にコピー貼り付けの代わりに答え全体を入力させると、答えは記憶にコミットされますが、コピー貼り付けだけではおそらく意味がありません。これには正当な理由があります。彼らがやろうとしていることはほとんどの場合良い考えではないことを誰かに警告しますが、答えを出します...あるいは、迷惑をかけないようにするのが最善です。
Halfhoot 2017

69

コピー貼り付け機能を無効にする入力に「disablecopypaste」のクラスを追加し、このjQueryスクリプトを追加します

  $(document).ready(function () {
    $('input.disablecopypaste').bind('copy paste', function (e) {
       e.preventDefault();
    });
  });

1
タンク、私にとってはうまくいきます!
Gabriel Glauber

26

これを取得しただけでonpaste:"return false"、次のおかげでを使用してそれを達成できます:http : //sumtips.com/2011/11/prevent-copy-cut-paste-text-field.html

以下に示すように、他にもさまざまなオプションがあります。

<input type="text" onselectstart="return false" onpaste="return false;" onCopy="return false" onCut="return false" onDrag="return false" onDrop="return false" autocomplete=off/><br>

16

できます.....しかし、しません。

ユーザーのブラウザのデフォルトの動作を変更しないでください。それはあなたのウェブアプリケーションにとって本当に使い勝手が悪いです。また、ユーザーがこのハックを無効にしたい場合は、ブラウザのJavaScriptを無効にすることができます。

これらの属性をテキストボックスに追加するだけです

ondragstart=”return false onselectstart=”return false

6
問題は、貼り付けを無効にすることです。この方法では、コピーが困難になるだけで、貼り付けには影響しません。
ベンドマン2013

10

クレイジーなアイデア:サインアッププロセスの一環として、ユーザーにメールを送信するように要求します。これは、mailtoリンクをクリックしても機能しない場合(たとえば、ウェブメールを使用している場合)は明らかに不便ですが、タイプミスに対する保証とメールアドレスの確認を同時に行う方法と考えています。

それは次のようになります:彼らはほとんどのフォームに記入し、名前、パスワードなどを入力します。彼らがプッシュ送信するとき、彼らは実際にあなたのサーバーにメールを送るためにリンクをクリックしています。あなたはすでに他の情報を保存しているので、メッセージには、これがどのアカウント用であるかを示すトークンが含まれています。


ハ、それは素晴らしいアイデアです。
justinl 2009年

7

ユーザーが2度入力したメールアドレスに確認メールを送信して、サイトに確認URLへのリンクがあり、そのメッセージを受け取ったことを知っているとしたらどうでしょう。

電子メールの受信を確認するためにクリックしない人は、電子メールアドレスを間違って入力した可能性があります。

完璧な解決策ではなく、いくつかのアイデアだけです。


4
現在、この実装があります。問題は、ユーザーが、彼らがいることを自分のメールアドレスをチェックしているため、彼らは私たちのため、最後のエラーに電子メールを受信しないと考えていることであると考え、彼らが入力され、彼らは電子メールを持っていません。また、何が起こったのかというと、彼らが再登録しようとすると、誤ったメールアドレスが残っているため、使用していたユーザー名は利用できなくなります。
justinl 2009

Tnenは、たとえば2日間確認されていないユーザー名を毎日消去するワークフロー/コードを追加する可能性があります。
コリン、

1
コメントをありがとう。私の考えでは、Webサイトでアカウントを作成しようとして、ユーザー名が取得されたと言った場合、2日後に戻ってもう一度試してみませんか?私の考えはおそらくそうではありません。同じ日に別のユーザー名で新しいアカウントを作成したか、登録方法がわからずサイトが「複雑すぎる」ためにサイトに戻ってくることを気にしていません。
justinl 2009

8
コリンが言っていることを続けるために、誰かが同じユーザー名と異なるメールアドレスで再登録を試みていて、彼らが確認メッセージに応答しなかったとき、おそらく彼らにそうさせても大丈夫だと想定することができます。ユーザーはメールでドメインを正しく取得しているが、ユーザー名のスペルを間違えているため、これを使用して誰かがいつミスを犯したかをさらに判断できる可能性があります。
Richard Lucas、

1
私は、ユーザーがまだアカウント情報を確認していないユーザーを再登録できるようにするというアイデアが本当に気に入っています。この設計ソリューションは、最初に提案した技術的ソリューションよりも優れていると思います。このデフォルトのブラウザー機能を変更することは悪い考えであると他の人に聞いたことは、より良い解決策を見つけるために私が聞く必要があったことでした。
justinl 2009

7

あなたはjqueryを使うことができます

HTMLファイル

<input id="email" name="email">

jqueryコード

$('#email').bind('copy paste', function (e) {
        e.preventDefault();
    });

6

@boycsの回答を拡張して、 "on"も使用することをお勧めします。

$('body').on('copy paste', 'input', function (e) { e.preventDefault(); });

この方法は、動的に追加されたフォーム要素にスクリプトを適用する場合に役立ちます。
Matthew

3

2つの電子メールフィールドを使用する必要があり、ユーザーがフィールド1からフィールド2に同じタイプミスの電子メールを誤って貼り付けることを懸念している場合、ユーザーが2番目の電子メールフィールドに何かを貼り付けると、アラート(またはより微妙なもの)を表示します

document.querySelector('input.email-confirm').onpaste = function(e) {
    alert('Are you sure the email you\'ve entered is correct?');
}

この方法では、貼り付けを無効にせず、最初のフィールドに入力されたと思われるものを確認して、2番目のフィールドに貼り付けられていることを確認するための友好的なリマインダーを与えるだけです。

ただし、おそらくオートコンプリートがオンになっている単一のメールフィールドで十分です。おそらく、ある時点で別のサイトにアクセスする前にメールが正しく入力されている可能性があり、ブラウザはそのメールをフィールドに入力することを提案します

<input type="email" name="email" required autocomplete="email">

2

「キーダウン」リスナーを入力ボックスに接続して、Ctrl + Vキーが押されているかどうかを検出し、押されている場合は、イベントを停止するか、入力ボックスの値を ''に設定します。

ただし、右クリックして貼り付けたり、ブラウザの[編集]メニューから貼り付けることはできません。「最後の長さ」のカウンターをキーダウンリスナーに追加し、間隔を使用してフィールドの現在の長さをチェックして、最後のキーストローク以降に増加したかどうかを確認する必要がある場合があります。

ただし、どちらも推奨されません。貼り付けを無効にしたフォームフィールドは、非常にイライラします。初めてメールを正しく入力できるので、2番目のボックスに貼り付ける権利を留保します。


右クリックや、Apples、Unix、またはctrl-insからの何かではなく、iPhoneはどうですか?
Martlark、2009

入力フィールドを無効にすることはあまり好きではありません。しかし、このタイプのユーザーエラーを停止する他のオプションは何ですか?または、どのソリューションがユーザー登録が最も誤って完了しないことになりますか?メールアドレスをもう一度手動で入力するのは少し面倒ですが、もしもイライラした潜在的な顧客を救うのであれば、ユーザーに入力フィールドに何かを手動で入力させることを強制したいと思います。それは大きな不便ではなく、単純な間違いから誰かを救うことができるフラストレーションの量はそれが価値があるかもしれないと思っています。考え?
justinl 2009

2

登録プロセスに2番目のステップを追加します。通常どおり最初のページですが、リロード時に2番目のページを表示して、もう一度メールを送信してください。それが重要であれば、ユーザーはそれを処理できます。


1

から

一部のユーザーは、Javascriptを使用して、マウスを右クリックするか、Ctrl + C / Ctrl + Vキーの組み合わせなどのユーザーのアクションをキャプチャしてから、操作を停止することを提案する場合があります。しかし、これは明らかに最良または最も単純なソリューションではありません。このソリューションは、JavaScriptを使用したいくつかのイベントキャプチャとともに、入力フィールドプロパティ自体に統合されています。

ブラウザのオートコンプリートを無効にするには、属性を入力フィールドに追加するだけです。次のようになります。

<input type="text" autocomplete="off">

そして、そのフィールドのコピーと貼り付けを拒否したい場合は、JavaScriptのイベントキャプチャ呼び出しoncopy、onpaste、oncutを追加して、次のようにfalseを返すようにします。

<input type="text" oncopy="return false;" onpaste="return false;" oncut="return false;">

次のステップは、onselectstartを使用してユーザーからの入力フィールドのコンテンツ選択を拒否しますが、警告されます。これはInternet Explorerでのみ機能します。上記の残りの部分は、すべての主要なブラウザー(Internet Explorer、Mozilla Firefox、Apple Safari(少なくともWindows OS))、およびGoogle Chromeでうまく機能します。


これは理論的には質問に答える可能性がありますが、答えの本質的な部分をここに含め、参照用のリンクを提供することが望ましいでしょう
Kev

ええ、私は次回以降に注意します
vaichidrewar

1
何が「非常にうまく説明されている」かを説明することから始めてみませんか?それがあなたが賛成票を得てより良い代表者になる方法です:)
Kev

オートコンプリートをオフにする(しようとする)理由は何ですか?「ユーザーは大嫌いです。」?あなたがユーザーの敵になろうとしているなら、彼らはブラウザーをコントロールしているので、彼らはまだ彼らが最終的に勝つ一方で、彼らはあなたを憎むでしょう。
Jan Hertsens、

1

指定された電子メールのホストのMXレコードの有効性を確認します。これにより、@記号の右側のエラーを排除できます。

これは、送信前のAJAX呼び出し、および/またはフォームが送信された後のサーバー側で行うことができます。


1

jqueryを使用すると、これを使用してコピーペーストとカットを回避できます

$('.textboxClass').on('copy paste cut', function(e) {
    e.preventDefault();
});

ありがとう。これは本当にうまくいきました。
Juergen

1

私はこのバニラJSソリューションを使用します:

const element = document.getElementById('textfield')
element.addEventListener('paste', e =>  e.preventDefault())

1

Jqueryを使用すると、1つの単純なコードラインでこれを行うことができます。

HTML:

<input id="email" name="email">

コード:

$(email).on('paste', false);

JSfiddle:https ://jsfiddle.net/ZjR9P/2/



0

簡単な解決策:登録プロセスを逆にするだけです:登録プロセスの最後に確認を要求する代わりに、最初に確認を要求します!つまり、登録プロセスは、電子メールアドレスだけを求める単純なフォームから始まりました。送信すると、送信された電子メールアドレスに固有の確認ページへのリンクが記載された電子メール。ユーザーがそのページに移動すると、登録に関する残りの情報(ユーザー名、フルネームなど)が要求されます。

Webサイトは確認前に何も保存する必要がないため、これは簡単です。電子メールアドレスはキーで暗号化し、確認ページのアドレスの一部として添付できます。


0

私はhttp://bookmarkchamp.comに対してこれと同様のことを行いました-ユーザーが何かをHTMLフィールドにコピーしたことを検出したかったのです。私が思いついた実装は、常にフィールドをチェックして、いつでも突然大量のテキストがそこにあるかどうかを確認することでした。

言い換えると、ミリ秒前にテキストがなく、現在は5文字を超える場合...ユーザーはおそらくフィールドに何かを貼り付けました。

Bookmarkchampでこの動作を確認するには(登録が必要です)、URLをURLフィールドに貼り付けます(またはURLをそこにドラッグアンドドロップします)。


0

メールアドレスの確認の問題を解決する方法は次のとおりです。

  1. メインプロセス(ユーザーの登録など)を実行する前に、まずユーザーにメールアドレスの入力を求めます。
  2. 一意のコードを生成し、そのメールアドレスに送信します。
  3. ユーザーが正しいメールアドレスを入力した場合、コードを取得します。
  4. ユーザーは、登録を完了するために、電子メールアドレスとその他の必要な情報とともにそのコードを入力する必要があります。-今回、間違ったメールアドレス(または間違ったコード)を入力した場合、コードと一致しないため、登録が行われず、ユーザーにすぐに通知されます。
  5. メールアドレス、コード、その他の登録情報が正しく入力されていれば、登録は完了していますので、すぐにご利用いただけます。-アカウントを有効にするために他のメールアドレスに返信する必要はありません

セキュリティを向上させるには、コードの有効期間を制限し、登録プロセスで1回だけ許可する必要があります。また、悪意のあるロボットアプリケーションを防ぐために、最初のステップにキャプチャまたは類似のメカニズムを追加することをお勧めします。


0

以下のスクリプトでjQueryのコピー貼り付けオプションを無効にできます。jQuery( "input")。attr( "onpaste"、 "return false;");

以下のoppaste属性を入力フィールドに使用することによって。

onpaste = "return false;"


-1
Hope below code will work :

<!--Disable Copy And Paste-->
<script language='JavaScript1.2'>
function disableselect(e){
return false
}
function reEnable(){
return true
}
document.onselectstart=new Function ("return false")
if (window.sidebar){
document.onmousedown=disableselect
document.onclick=reEnable
}
</script>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.