Мне недавно пришлось неохотно отключать вставку в элементе формы. Для этого я написал кросс-браузерную * реализацию обработчика событий onpaste Internet Explorer (и других). Мое решение должно было быть независимым от любых сторонних библиотек JavaScript.
Вот что я придумала. Он не полностью отключает вставку (например, пользователь может вставить по одному символу за раз), но он отвечает моим потребностям и позволяет избежать необходимости работать с кодами клавиш и т. Д.
// 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, некоторые мобильные телефоны), не используйте этот скрипт, если вы не проверили, чтобы убедиться, что экранная клавиатура отправляет ключи в браузер после каждого выбора ключа.