[解決済み] HTMLフォームにテキストを貼り付けられないようにする
質問
JavaScript を使って、HTML フォームのテキスト フィールドにテキストを貼り付ける機能を無効にする方法はありますか?
例 簡単な登録フォームがあり、ユーザーは2回電子メールを入力する必要があります。2 回目の電子メール入力は、最初の電子メール入力にタイプミスがないことを確認するためのものです。しかし、ユーザーが自分の電子メールをコピー/ペーストすると、目的が達成されず、間違った電子メールを入力し、それをコピー/ペーストしたために問題が発生したことがあります。
私の質問が明確でなかったかもしれませんが、私は、ユーザーがブラウザ上でテキストをコピーする (またはドラッグで選択する) ことを防止しようとしているわけではありません。私はただ、ユーザーが 貼り付け の入力をテキスト フィールドに貼り付けるのを阻止して、ユーザー エラーを最小限に抑えたいだけです。
おそらく、この "hack" を使用する代わりに、私がここで解決しようとしていることの中核的な問題に対する別のソリューションを提案することができますか? 私は半ダース以下のユーザー テストを行いましたが、これはすでに 2 回起こりました。私の聴衆は、高いレベルのコンピューター能力を持っていません。
どのように解決するのですか?
私は最近、フォーム要素での貼り付けを不本意ながら無効化しなければなりませんでした。これを行うために、私は Internet Explorer (およびその他) の onpaste イベント ハンドラのクロス ブラウザー* 実装を書きました。私のソリューションは、サードパーティの JavaScript ライブラリに依存しないものでなければなりませんでした。
以下は、私が考え出したものです。これは、貼り付けを完全に無効にするわけではありませんが (たとえば、ユーザーは一度に 1 文字を貼り付けることができます)、私のニーズを満たし、keyCodes などに対処する必要性を回避します。
// 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 だけが onpaste をサポートしておらず、oninput をサポートしています。
注: これは、コンソールやスクリーン キーボードを使用する他のシステムでは動作しません (スクリーン キーボードが、各キーが選択されたときにブラウザにキーを送信しないと仮定しています)。オンスクリーン キーボードと Opera を使用している人 (例: Nintendo Wii、一部の携帯電話) があなたのページやアプリを使用する可能性がある場合、オンスクリーン キーボードが各キー選択の後にブラウザにキーを送信することを確認するテストを行っていない限り、このスクリプトを使用しないでください。
関連
-
[解決済み】ある要素を別の要素に移動させるには?
-
[解決済み] textareaのresizableプロパティを無効にするにはどうしたらよいですか?
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] Webフォームのフィールド/入力タグでブラウザのオートコンプリートを無効にするにはどうすればよいですか?
-
[解決済み] jQueryで入力を無効化/有効化する?
-
[解決済み] HTML 5: Is it <br>, <br/>, or <br />?
-
[解決済み] HTMLのid属性に有効な値は何ですか?
-
[解決済み】なぜHTMLは "chucknorris "を色と見なすのか?
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] javascript includes() 大文字小文字を区別しない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] チェックボックスが選択されているかどうかを確認するjQuery
-
[解決済み] Google maps API V3 - 同一地点に複数のマーカーを設置する。
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] jQueryで入力ファイルが空かどうかをチェックする方法
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行