เมื่อเร็ว ๆ นี้ฉันต้องปิดการใช้งานการวางในองค์ประกอบฟอร์มอย่างไม่น่าให้อภัย ในการทำเช่นนั้นฉันได้เขียนการใช้งานข้ามเบราว์เซอร์ * ของ Internet Explorer (และอื่น ๆ ) onpaste โซลูชันของฉันต้องไม่ขึ้นอยู่กับไลบรารี JavaScript ของบุคคลที่สาม
นี่คือสิ่งที่ฉันคิดขึ้นมา ไม่ได้ปิดการใช้งานการวางอย่างสมบูรณ์ (เช่นผู้ใช้สามารถวางทีละอักขระได้) แต่ตรงกับความต้องการของฉันและหลีกเลี่ยงการจัดการกับรหัสคีย์ ฯลฯ
(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 - รองรับการป้อนข้อมูลหรือ onpaste จากเบราว์เซอร์เหล่านี้ทั้งหมดมีเพียง Opera เท่านั้นที่ไม่รองรับ onpaste แต่รองรับ oninput
หมายเหตุ: สิ่งนี้จะใช้ไม่ได้กับคอนโซลหรือระบบอื่น ๆ ที่ใช้แป้นพิมพ์บนหน้าจอ (สมมติว่าแป้นพิมพ์บนหน้าจอจะไม่ส่งคีย์ไปยังเบราว์เซอร์เมื่อเลือกแต่ละปุ่ม) หากเป็นไปได้ว่าบุคคลที่มีแป้นพิมพ์บนหน้าจอและ Opera สามารถใช้เพจ / แอปของคุณได้ (เช่น Nintendo Wii โทรศัพท์มือถือบางรุ่น) อย่าใช้สคริปต์นี้เว้นแต่คุณจะทดสอบเพื่อให้แน่ใจว่าแป้นพิมพ์บนหน้าจอ ส่งคีย์ไปยังเบราว์เซอร์หลังจากการเลือกคีย์แต่ละครั้ง