इस सेट अप (या वहाँ है?) के साथ कुछ भी गलत नहीं है, लेकिन क्या मैं इसे थोड़ा चिकना कर सकता हूं?
इसके बजाय इवेंट डेलिगेशन का उपयोग करें। यही कारण है कि आप वास्तव में एक कंटेनर पर घटना के लिए देखते हैं जो दूर नहीं जाता है, और फिर यह पता लगाने के लिए event.target
(या event.srcElement
IE पर) का उपयोग करें जहां घटना वास्तव में हुई और इसे सही ढंग से संभालती है।
इस तरह, आप केवल एक बार हैंडलर (ओं) को संलग्न करते हैं, और वे तब भी काम करते रहते हैं जब आप सामग्री को स्वैप करते हैं।
यहां किसी भी सहायक काम का उपयोग किए बिना घटना प्रतिनिधिमंडल का एक उदाहरण है:
(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
, लेकिन आप अपनी इच्छानुसार जटिल या सरल मिलान कर सकते हैं।
आधुनिक जावास्क्रिप्ट लाइब्रेरी जैसे jQuery , प्रोटोटाइप , YUI , क्लोजर या कई अन्य में से किसी को ब्राउज़र के मतभेदों को दूर करने और किनारे के मामलों को सफाई से संभालने के लिए इवेंट डेलिगेशन फीचर्स की पेशकश करनी चाहिए। jQuery निश्चित रूप से अपने दोनों live
और delegate
कार्यों के साथ करता है, जो आपको CSS3 चयनकर्ताओं (और फिर कुछ) की पूरी श्रृंखला का उपयोग करके हैंडलर निर्दिष्ट करने की अनुमति देता है।
उदाहरण के लिए, यहाँ jQuery का उपयोग करते हुए समकक्ष कोड है (इसके अलावा मुझे यकीन है कि jQuery हैंडल किनारे के मामलों को बंद नहीं करता है)
(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);
लाइव कॉपी