Ich musste kürzlich das Einfügen in ein Formularelement widerwillig deaktivieren. Zu diesem Zweck habe ich eine browserübergreifende * Implementierung des Onpaste-Ereignishandlers von Internet Explorer (und anderen) geschrieben. Meine Lösung musste unabhängig von JavaScript-Bibliotheken von Drittanbietern sein.
Folgendes habe ich mir ausgedacht. Das Einfügen wird nicht vollständig deaktiviert (der Benutzer kann beispielsweise jeweils ein einzelnes Zeichen einfügen), aber es erfüllt meine Anforderungen und vermeidet, dass Sie sich mit keyCodes usw. befassen müssen.
// 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);
}
}
}
}
})();
So nutzen Sie dies, um das Einfügen zu deaktivieren:
<input type="text" onpaste="return false;" />
* Ich weiß, dass oninput nicht Teil der W3C-DOM-Spezifikation ist, aber alle Browser, mit denen ich diesen Code getestet habe - Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 - unterstützen entweder oninput oder onpaste. Von all diesen Browsern unterstützt nur Opera Onpaste nicht, aber Oninput.
Hinweis: Dies funktioniert nicht auf einer Konsole oder einem anderen System, das eine Bildschirmtastatur verwendet (vorausgesetzt, die Bildschirmtastatur sendet bei Auswahl jeder Taste keine Tasten an den Browser). Wenn es möglich ist, dass Ihre Seite / App von jemandem mit einer Bildschirmtastatur und Opera verwendet wird (z. B. Nintendo Wii, einige Mobiltelefone), verwenden Sie dieses Skript nur, wenn Sie die Bildschirmtastatur getestet haben sendet nach jeder Schlüsselauswahl Schlüssel an den Browser.