最近、しぶしぶフォーム要素への貼り付けを無効にする必要がありました。そのために、Internet Explorer (およびその他の) の onpaste イベント ハンドラーのクロスブラウザー* 実装を作成しました。私のソリューションは、サードパーティの JavaScript ライブラリから独立している必要がありました。
これが私が思いついたものです。貼り付けを完全に無効にするわけではありません (たとえば、ユーザーは一度に 1 文字を貼り付けることができます) が、私のニーズを満たし、キーコードなどを処理する必要がなくなります。
// 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、一部の携帯電話) を使用しているユーザーがページ/アプリを使用できる可能性がある場合は、テストしてオンスクリーン キーボードが正しく機能することを確認しない限り、このスクリプトを使用しないでください。キーを選択するたびにブラウザにキーを送信します。