Son zamanlarda bir form öğesinde yapıştırmayı gönülsüzce devre dışı bırakmak zorunda kaldım. Bunu yapmak için, Internet Explorer'ın (ve diğerlerinin) onpaste olay işleyicisinin tarayıcılar arası * bir uygulamasını yazdım. Çözümüm herhangi bir üçüncü taraf JavaScript kitaplığından bağımsız olmalıydı.
İşte bulduğum şey. Yapıştırmayı tamamen devre dışı bırakmaz (örneğin, kullanıcı bir seferde tek bir karakter yapıştırabilir), ancak ihtiyaçlarımı karşılar ve keyCodes vb. İle uğraşmak zorunda kalmaz.
(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);
}
}
}
}
})();
Yapıştırmayı devre dışı bırakmak için bundan yararlanmak için:
<input type="text" onpaste="return false;" />
* Girişin W3C DOM spesifikasyonunun bir parçası olmadığını biliyorum, ancak bu kodu test ettiğim tüm tarayıcılar — Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 - giriş veya onpaste'i destekliyor. Tüm bu tarayıcılardan yalnızca Opera, onpaste'i desteklemiyor, ancak oninput'u destekliyor.
Not: Bu, ekran klavyesi kullanan bir konsolda veya başka bir sistemde çalışmaz (ekran klavyesinin her tuş seçildiğinde tarayıcıya tuşları göndermediği varsayılırsa). Sayfanızın / uygulamanızın ekran klavyesi ve Opera kullanan biri tarafından kullanılma olasılığı varsa (örneğin: Nintendo Wii, bazı cep telefonları), ekran klavyesinin olduğundan emin olmak için test yapmadıysanız bu komut dosyasını kullanmayın her tuş seçiminden sonra tarayıcıya anahtarları gönderir.