এই সেট আপ (বা আছে?) এর সাথে কোনও ভুল নেই, তবে আমি কি এটি কিছুটা মসৃণ করতে পারি?
পরিবর্তে ইভেন্ট প্রতিনিধি ব্যবহার দেখুন। ঠিক সেখানেই আপনি ইভেন্টটি এমন কোনও ধারকটিতে দেখেন যা চলে না যা যায় না, এবং তারপরে ইভেন্টটি কোথায় ঘটেছে তা নির্ধারণ করতে এবং সঠিকভাবে এটি পরিচালনা করতে event.target(বা event.srcElementআইই তে) ব্যবহার করুন।
এইভাবে, আপনি কেবলমাত্র একবার হ্যান্ডলার (গুলি) সংযুক্ত করেন এবং আপনি সামগ্রী সরিয়ে নেওয়ার পরেও তারা কাজ চালিয়ে যান।
কোনও সহায়তা সহায়ককে ব্যবহার না করে ইভেন্ট প্রতিনিধি দলের উদাহরণ এখানে রয়েছে:
(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);
লাইভ কপি