ไม่มีอะไรผิดปกติกับการตั้งค่านี้ (หรือมี) แต่ฉันจะทำให้มันราบรื่นได้ไหม
ดูที่การใช้การมอบหมายเหตุการณ์แทน นั่นคือสิ่งที่คุณเฝ้าดูเหตุการณ์บนคอนเทนเนอร์ที่ไม่หายไปจากนั้นใช้event.target
(หรือevent.srcElement
บน IE) เพื่อดูว่าเหตุการณ์เกิดขึ้นจริงที่ใดและจัดการได้อย่างถูกต้อง
ด้วยวิธีนี้คุณจะแนบตัวจัดการเพียงครั้งเดียวและมันก็ยังทำงานต่อไปแม้ว่าคุณจะเปลี่ยนเนื้อหาออกไป
นี่คือตัวอย่างของการมอบหมายงานโดยไม่ใช้ตัวช่วย libs:
(function() {
var handlers = {};
if (document.body.addEventListener) {
document.body.addEventListener('click', handleBodyClick, false);
}
else if (document.body.attachEvent) {
document.body.attachEvent('onclick', handleBodyClick);
}
else {
document.body.onclick = handleBodyClick;
}
handlers.button1 = function() {
display("Button One clicked");
return false;
};
handlers.button2 = function() {
display("Button Two clicked");
return false;
};
handlers.outerDiv = function() {
display("Outer div clicked");
return false;
};
handlers.innerDiv1 = function() {
display("Inner div 1 clicked, not cancelling event");
};
handlers.innerDiv2 = function() {
display("Inner div 2 clicked, cancelling event");
return false;
};
function handleBodyClick(event) {
var target, handler;
event = event || window.event;
target = event.target || event.srcElement;
while (target && target !== this) {
if (target.id) {
handler = handlers[target.id];
if (handler) {
if (handler.call(this, event) === false) {
if (event.preventDefault) {
event.preventDefault();
}
return false;
}
}
}
else if (target.tagName === "P") {
display("You clicked the message '" + target.innerHTML + "'");
}
target = target.parentNode;
}
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
})();
ตัวอย่างสด
สังเกตว่าหากคุณคลิกข้อความที่เพิ่มลงในเพจแบบไดนามิกการคลิกของคุณจะได้รับการลงทะเบียนและจัดการแม้ว่าจะไม่มีรหัสที่จะเชื่อมโยงเหตุการณ์ในย่อหน้าใหม่ที่เพิ่มเข้ามา โปรดสังเกตด้วยว่าตัวจัดการของคุณเป็นเพียงรายการในแผนที่อย่างไรและคุณมีตัวจัดการหนึ่งตัวในdocument.body
การจัดส่งทั้งหมด ตอนนี้คุณอาจรูทสิ่งนี้ในบางสิ่งที่ตรงเป้าหมายมากกว่าdocument.body
แต่คุณได้รับแนวคิด นอกจากนี้ในข้างต้นเรามักจะจัดส่งโดยทั่วไปid
แต่คุณสามารถจับคู่แบบซับซ้อนหรือเรียบง่ายเท่าที่คุณต้องการ
ไลบรารี JavaScript สมัยใหม่เช่นjQuery , Prototype , YUI , Closureหรืออื่น ๆ อีกมากมายควรนำเสนอคุณสมบัติการมอบหมายเหตุการณ์เพื่อให้ราบรื่นเหนือความแตกต่างของเบราว์เซอร์และจัดการกรณีขอบได้อย่างหมดจด jQuery มีทั้งฟังก์ชันlive
และdelegate
ฟังก์ชันซึ่งช่วยให้คุณสามารถระบุตัวจัดการโดยใช้ตัวเลือก CSS3 แบบเต็มรูปแบบ (และบางตัว)
ตัวอย่างเช่นนี่คือรหัสที่เทียบเท่าโดยใช้ jQuery (ยกเว้นฉันแน่ใจว่า jQuery จัดการกับ edge case แต่เวอร์ชันดิบนอกข้อมือข้างต้นไม่ได้):
(function($) {
$("#button1").live('click', function() {
display("Button One clicked");
return false;
});
$("#button2").live('click', function() {
display("Button Two clicked");
return false;
});
$("#outerDiv").live('click', function() {
display("Outer div clicked");
return false;
});
$("#innerDiv1").live('click', function() {
display("Inner div 1 clicked, not cancelling event");
});
$("#innerDiv2").live('click', function() {
display("Inner div 2 clicked, cancelling event");
return false;
});
$("p").live('click', function() {
display("You clicked the message '" + this.innerHTML + "'");
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
})(jQuery);
สำเนาสด