Gần đây tôi đã phải miễn cưỡng tắt tính năng dán trong phần tử biểu mẫu. Để làm như vậy, tôi đã viết một triển khai trình duyệt chéo * của trình xử lý sự kiện onpaste của Internet Explorer (và của những người khác). Giải pháp của tôi phải độc lập với bất kỳ thư viện JavaScript của bên thứ ba nào.
Đây là những gì tôi nghĩ ra. Nó không hoàn toàn vô hiệu hóa quá trình dán (ví dụ: người dùng có thể dán một ký tự duy nhất tại một thời điểm), nhưng nó đáp ứng nhu cầu của tôi và tránh phải xử lý các mã khóa, v.v.
// 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);
}
}
}
}
})();
Để sử dụng điều này để vô hiệu hóa dán:
<input type="text" onpaste="return false;" />
* Tôi biết oninput không phải là một phần của thông số kỹ thuật DOM W3C, nhưng tất cả các trình duyệt tôi đã thử nghiệm mã này với — Chrome 2, Safari 4, Firefox 3, Opera 10, IE6, IE7 — hỗ trợ oninput hoặc onpaste. Trong số tất cả các trình duyệt này, chỉ có Opera không hỗ trợ onpaste, nhưng nó hỗ trợ oninput.
Lưu ý: Tính năng này sẽ không hoạt động trên bảng điều khiển hoặc hệ thống khác sử dụng bàn phím ảo (giả sử bàn phím ảo không gửi các phím đến trình duyệt khi từng phím được chọn). Nếu có khả năng trang / ứng dụng của bạn có thể được sử dụng bởi ai đó có bàn phím ảo và Opera (ví dụ: Nintendo Wii, một số điện thoại di động), đừng sử dụng tập lệnh này trừ khi bạn đã kiểm tra để đảm bảo bàn phím ảo gửi các phím đến trình duyệt sau mỗi lần chọn phím.