Baru-baru ini saya harus dengan enggan menonaktifkan penempelan di elemen formulir. Untuk melakukannya, saya menulis implementasi lintas-browser * dari pengendali event onpaste Internet Explorer (dan lainnya). Solusi saya harus independen dari pustaka JavaScript pihak ketiga mana pun.
Inilah yang saya dapatkan. Itu tidak sepenuhnya menonaktifkan penempelan (pengguna dapat menempelkan satu karakter pada satu waktu, misalnya), tetapi memenuhi kebutuhan saya dan menghindari harus berurusan dengan kode kunci, dll.
// 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);
}
}
}
}
})();
Untuk memanfaatkan ini untuk menonaktifkan penempelan:
<input type="text" onpaste="return false;" />
* Saya tahu oninput bukan bagian dari spesifikasi DOM W3C, tetapi semua browser yang telah saya uji dengan kode ini — Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 — mendukung oninput atau onpaste. Dari semua browser ini, hanya Opera yang tidak mendukung onpaste, tetapi mendukung oninput.
Catatan: Ini tidak akan berfungsi di konsol atau sistem lain yang menggunakan keyboard di layar (dengan asumsi keyboard di layar tidak mengirim tombol ke browser saat setiap tombol dipilih). Jika mungkin halaman / aplikasi Anda dapat digunakan oleh seseorang dengan keyboard di layar dan Opera (misalnya: Nintendo Wii, beberapa ponsel), jangan gunakan skrip ini kecuali Anda telah menguji untuk memastikan keyboard di layar mengirimkan kunci ke browser setelah setiap pemilihan tombol.