Niedawno musiałem niechętnie wyłączyć wklejanie w elemencie formularza. Aby to zrobić, napisałem implementację obsługi zdarzeń onpaste programu Internet Explorer (i innych) w różnych przeglądarkach *. Moje rozwiązanie musiało być niezależne od bibliotek JavaScript innych firm.
Oto, co wymyśliłem. Nie wyłącza całkowicie wklejania (na przykład użytkownik może wkleić pojedynczy znak na raz), ale spełnia moje potrzeby i pozwala uniknąć konieczności zajmowania się kodami kluczy itp.
(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);
}
}
}
}
})();
Aby skorzystać z tego w celu wyłączenia wklejania:
<input type="text" onpaste="return false;" />
* Wiem, że oninput nie jest częścią specyfikacji W3C DOM, ale wszystkie przeglądarki, z którymi testowałem ten kod - Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 - obsługują oninput lub onpaste. Ze wszystkich tych przeglądarek tylko Opera nie obsługuje onpaste, ale obsługuje oninput.
Uwaga: to nie zadziała na konsoli lub innym systemie, który używa klawiatury ekranowej (zakładając, że klawiatura ekranowa nie wysyła klawiszy do przeglądarki po wybraniu każdego klawisza). Jeśli to możliwe, że Twoja strona / aplikacja może być używana przez kogoś z klawiaturą ekranową i Operą (np .: Nintendo Wii, niektóre telefony komórkowe), nie używaj tego skryptu, chyba że przetestowałeś, czy klawiatura ekranowa wysyła klucze do przeglądarki po każdym wybraniu klucza.