我最近不得不勉强禁用表单元素中的粘贴.为此,我编写了Internet Explorer(和其他浏览器)的onpaste事件处理程序的跨浏览器*实现.我的解决方案必须独立于任何第三方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;" />
* I know oninput isn't part of the W3C DOM spec, but all of the browsers I've tested this code with—Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7—support either oninput or onpaste. Out of all these browsers, only Opera doesn't support onpaste, but it does support oninput.
注意:这在使用屏幕键盘的控制台或其他系统上不起作用(假设屏幕键盘在 Select 每个键时不向浏览器发送键).如果你的页面/应用可能会被屏幕上有键盘和Opera的人使用(例如任天堂Wii,一些手机),不要使用这个脚本,除非你已经测试过确保屏幕上的键盘在每次按键 Select 后将按键发送到浏览器.