DOM ইভেন্ট প্রতিনিধি কি?


202

কেউ দয়া করে জাভাস্ক্রিপ্টে ইভেন্ট প্রতিনিধিদের ব্যাখ্যা করতে পারেন এবং এটি কীভাবে কার্যকর?


2
এটি সম্পর্কে তথ্য তথ্যের উত্স ধূমপানের একটি লিঙ্ক না থাকলে খুব ভাল হবে। 6 ঘন্টা পরে, এটি "ডোম ইভেন্ট প্রতিনিধি" এর জন্য গুগল শীর্ষ হিট। সম্ভবত এটি একটি দরকারী লিঙ্ক? আমি পুরোপুরি নিশ্চিত নই: w3.org/TR/DOM-Level-2-Events/events.html
সান ম্যাকমিলান


7
এটি একটি জনপ্রিয়। এমনকি এফবি ছেলেরা তাদের প্রতিক্রিয়া পৃষ্ঠাটির জন্য এটির লিঙ্ক করে ডেভিডওয়ালস.নেম / ইভেন্ট- ডেলিগেট
সর্টার

এই javascript.info/event-delegation দেখুন এটি আপনাকে অনেক সাহায্য করবে
সুরজ জৈন

উত্তর:


330

ডম ইভেন্ট ইভেন্ট প্রতিনিধি হ'ল ইভেন্ট "বুদবুদ" (ওরফে ইভেন্টের প্রচার) এর যাদু দ্বারা প্রতিটি সন্তানের চেয়ে একক সাধারণ পিতা বা মাতার মাধ্যমে ইউআই ইভেন্টগুলিতে সাড়া দেওয়ার ব্যবস্থা mechanism

কোনও ইভেন্ট যখন কোনও উপাদানের উপর ট্রিগার করা হয়, নিম্নলিখিতটি ঘটে :

ইভেন্টটিকে তার লক্ষ্যে প্রেরণ করা হয় EventTargetএবং সেখানে উপস্থিত ইভেন্টের শ্রোতাদের ট্রিগার করা হয়। সাড়া জাগানো ঘটনা তারপর অনুসরণ করে পাওয়া কোন অতিরিক্ত ঘটনা শ্রোতাকে আরম্ভ হবে EventTargetএর পিতা বা মাতা শৃঙ্খল উর্ধ্বগামী , প্রত্যেক ক্রমানুযায়ী EventTarget নিবন্ধিত কোনো ইভেন্টের লিসেনারের জন্য পরীক্ষা। এই wardর্ধ্বমুখী প্রচারটি অবধি এবং এর সাথে অব্যাহত থাকবে Document

ইভেন্ট বুদবুদ ব্রাউজারগুলিতে ইভেন্ট প্রতিনিধি দলের ভিত্তি সরবরাহ করে। এখন আপনি কোনও ইভেন্ট হ্যান্ডলারকে একটি একক পিতামণ্ডলের সাথে আবদ্ধ করতে পারেন এবং যখনই ইভেন্টটি এর কোনও শিশু নোডে (এবং পরিবর্তে তাদের কোনও শিশুকে) ঘটে তখন সেই হ্যান্ডলারটি কার্যকর করা হবে । এটি ইভেন্ট প্রতিনিধি। বাস্তবে এর উদাহরণ এখানে:

<ul onclick="alert(event.type + '!')">
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

সেই উদাহরণটি সহ যদি আপনি শিশু <li>নোডগুলির "click!"কোনওটিতে ক্লিক করতে চান তবে <li>আপনি ক্লিক করেছেন এমন কোনও ক্লিক হ্যান্ডলার সীমাবদ্ধ না থাকলেও আপনি একটি সতর্কতা দেখতে পাবেন । আমরা onclick="..."প্রত্যেকের সাথে আবদ্ধ হলে <li>আপনি একই প্রভাব পাবেন।

তাহলে কি লাভ?

কল্পনা করুন আপনার এখন <li>ডিওএম ম্যানিপুলেশনের মাধ্যমে উপরের তালিকায় গতিশীলভাবে নতুন আইটেম যুক্ত করতে হবে:

var newLi = document.createElement('li');
newLi.innerHTML = 'Four';
myUL.appendChild(newLi);

ইভেন্টের প্রতিনিধি ব্যবহার না করে আপনাকে "onclick"ইভেন্ট হ্যান্ডলারটিকে নতুন <li>উপাদানটির সাথে "পুনরায় ফিরিয়ে দিতে" হবে , যাতে এটি তার ভাইবোনদের মতোই আচরণ করতে পারে। সঙ্গে ঘটনা প্রতিনিধিদল আপনি কিছু করতে হবে না। কেবলমাত্র <li>তালিকায় নতুন যুক্ত করুন এবং আপনার কাজ শেষ।

এটি অনেকগুলি উপাদানগুলির সাথে আবদ্ধ ইভেন্ট হ্যান্ডলারগুলির সাথে ওয়েব অ্যাপ্লিকেশনগুলির জন্য একেবারেই দুর্দান্ত where যেখানে নতুন উপাদানগুলিকে গতিশীলভাবে তৈরি করা হয় এবং / অথবা ডিওমে সরানো হয়। ইভেন্ট প্রতিনিধিদের সাথে ইভেন্টের বাঁধার সংখ্যাগুলিকে একটি সাধারণ অভিভাবক উপাদানগুলিতে নিয়ে যাওয়ার মাধ্যমে তীব্র হ্রাস করা যায় এবং যে কোডটি ফ্লাইতে নতুন উপাদান তৈরি করে তা তাদের ইভেন্ট হ্যান্ডলারের সাথে আবদ্ধ হওয়ার যুক্তি থেকে ডিকপল করা যেতে পারে।

ইভেন্ট প্রতিনিধিদের জন্য আরেকটি সুবিধা হ'ল ইভেন্ট শ্রোতারা ব্যবহৃত মোট মেমরি পায়ের ছাপটি হ্রাস পায় (যেহেতু ইভেন্টের সংখ্যার সংখ্যা কম হয়)। এটি ছোট পৃষ্ঠাগুলিতে খুব বেশি পার্থক্য না তৈরি করতে পারে যা প্রায়শই আনলোড হয় (অর্থাত্ ব্যবহারকারীদের প্রায়শই বিভিন্ন পৃষ্ঠায় নেভিগেট থাকে)। তবে দীর্ঘস্থায়ী অ্যাপ্লিকেশনগুলির জন্য এটি উল্লেখযোগ্য হতে পারে। কিছু সত্যই কঠিন-ট্র্যাক-ডাউন পরিস্থিতি রয়েছে যখন ডিওএম থেকে সরানো উপাদানগুলি এখনও মেমরি দাবি করে (যেমন তারা ফাঁস করে) এবং প্রায়শই এই ফাঁস স্মৃতিটি ইভেন্টের সাথে আবদ্ধ হয়। ইভেন্ট প্রতিনিধি দলের সাথে আপনি তাদের ইভেন্ট শ্রোতাদের "বাঁধাই" ভুলে যাওয়ার ঝুঁকি ছাড়াই শিশু উপাদানগুলিকে বিনষ্ট করতে মুক্ত হন (যেহেতু শ্রোতা পূর্বপুরুষের উপর রয়েছে)। এই ধরণের মেমরি ফাঁসগুলি তখন অন্তর্ভুক্ত থাকতে পারে (যদি তা অপসারণ না করা হয় যা কখনও কখনও কঠোরভাবে করা হয় IE আমি আপনাকে দেখছি)।

ইভেন্ট প্রতিনিধি দলের কিছু ভাল কংক্রিট কোড উদাহরণ এখানে দেওয়া হয়েছে:


আমি জাভাস্ক্রিপ্ট লাইব্রেরি ছাড়াই আপনার তৃতীয় লিঙ্ক ইভেন্ট প্রতিনিধি খোলার ক্ষেত্রে অ্যাক্সেস নিষিদ্ধ পেয়েছি এবং আপনার শেষ লিঙ্কটির জন্য +1
বাগওয়িলস94

হ্যালো, একটি দুর্দান্ত ব্যাখ্যার জন্য আপনাকে ধন্যবাদ। যদিও আমি এখনও একটি নির্দিষ্ট বিশদ সম্পর্কে বিভ্রান্ত রয়েছি: আমি যেভাবে ডম গাছের ইভেন্টের প্রবাহটি বুঝতে পারি (এটি ৩.১-তে দেখা যাবে । ইভেন্টের প্রেরণ এবং ডোম ইভেন্ট প্রবাহ ) লক্ষ্য অবজেক্টটি পৌঁছানো পর্যন্ত ইভেন্ট অবজেক্টটি প্রচার করে ততক্ষণ বুদবুদ হয়ে যায়। যদি এই নোডের পিতামাতা প্রশ্নে ইভেন্ট টার্গেট হয় তবে এটি কোনও নোডের শিশু উপাদানগুলিতে কীভাবে পৌঁছতে পারে? উদাহরণস্বরূপ ঘটনাটি <li>যখন থামতে হবে তখন কীভাবে তা প্রচার করতে পারে <ul>? যদি আমার প্রশ্নটি এখনও অস্পষ্ট থাকে বা আলাদা থ্রেডের প্রয়োজন হয় তবে আমি বাধ্য হয়ে খুশি হব।
আইটোস

@ আইটোস: > যদি নোডের পিতা-মাতার ইভেন্টের প্রশ্নে প্রশ্ন থাকে তবে এটি কোনও নোডের শিশু উপাদানগুলিতে কীভাবে পৌঁছতে পারে? এটি যেমন আমি বুঝতে পারি তা করতে পারে না। ইভেন্টটি লক্ষ্যটির পিতামাতার 1 ম পর্যায় (ক্যাপচারিং) সমাপ্ত করে, লক্ষ্য নিজেই দ্বিতীয় পর্যায়ে (লক্ষ্য) প্রবেশ করে, তারপর লক্ষ্যটির পিতামাতার সাথে শুরু করে পর্ব 3 (বুদবুদ) প্রবেশ করে। কোথাও এটি লক্ষ্যের কোনও সন্তানের কাছে পৌঁছায় না।
ক্রিসেন্ট টাটকা

@ ক্রিসেন্ট টাটকা ভাল তাহলে কীভাবে ইভেন্টটি শিশু নোডে কখনই না পৌঁছায় যদি প্রয়োগ হয়?
এেটোস

1
সত্যিই দুর্দান্ত উত্তর। প্রাসঙ্গিক তথ্য সহ ইভেন্ট প্রতিনিধি ব্যাখ্যা করার জন্য ধন্যবাদ। ধন্যবাদ!
ক্ষিতিজ তিওয়ারি

30

ইভেন্ট প্রতিনিধি আপনাকে নির্দিষ্ট নোডগুলিতে ইভেন্ট শ্রোতাদের যুক্ত করা এড়াতে দেয়; পরিবর্তে, ইভেন্ট শ্রোতা একটি পিতামাতাকে যুক্ত করা হয়। ইভেন্টের শ্রোতা শিশু উপাদানগুলির সাথে কোনও মিল খুঁজে পাওয়ার জন্য বুদবুদ ইভেন্টগুলি বিশ্লেষণ করে।

জাভাস্ক্রিপ্ট উদাহরণ:

ধরা যাক যে আমাদের বেশ কয়েকটি শিশু উপাদান সহ একটি পিতামাতার উল উপাদান রয়েছে:

<ul id="parent-list">
<li id="post-1">Item 1</li>
<li id="post-2">Item 2</li>
<li id="post-3">Item 3</li>
<li id="post-4">Item 4</li>
<li id="post-5">Item 5</li>
<li id="post-6">Item 6</li>

আসুন আমরা এটাও বলি যে প্রতিটি সন্তানের উপাদান ক্লিক করা হলে কিছু হওয়া দরকার। আপনি প্রতিটি পৃথক এলআই উপাদানগুলিতে পৃথক ইভেন্ট শ্রোতাদের যুক্ত করতে পারেন, তবে এলআই উপাদানগুলি ঘন ঘন যোগ করা এবং তালিকা থেকে সরানো হয় তবে কী হবে? ইভেন্ট শ্রোতাদের যুক্ত করা এবং অপসারণ করা দুঃস্বপ্ন হতে পারে, বিশেষত যদি সংযোজন এবং অপসারণ কোডটি আপনার অ্যাপ্লিকেশানের মধ্যে বিভিন্ন জায়গায় থাকে। অভিভাবক উল উপাদানটিতে ইভেন্ট শ্রোতাদের যুক্ত করা আরও ভাল সমাধান। তবে আপনি যদি ইভেন্ট শ্রোতাকে পিতামাতার সাথে যুক্ত করেন তবে কীভাবে আপনি জানতে পারবেন কোন উপাদানটি ক্লিক করা হয়েছিল?

সাধারণ: ইভেন্টটি যখন উল উপাদানটিতে বুদবুদ হয়, আপনি প্রকৃত ক্লিক করা নোডের একটি রেফারেন্স পেতে ইভেন্ট অবজেক্টের লক্ষ্য সম্পত্তিটি পরীক্ষা করে দেখুন। এখানে একটি খুব বেসিক জাভাস্ক্রিপ্ট স্নিপেট যা ইভেন্ট প্রতিনিধিদের চিত্রিত করে:

// Get the element, add a click listener...
document.getElementById("parent-list").addEventListener("click", function(e) {
// e.target is the clicked element!
// If it was a list item
if(e.target && e.target.nodeName == "LI") {
    // List item found!  Output the ID!
    console.log("List item ", e.target.id.replace("post-"), " was clicked!");
       }
 });

প্যারেন্ট উপাদানটিতে ক্লিক ইভেন্ট শ্রোতাদের যুক্ত করে শুরু করুন। ইভেন্ট শ্রোতা যখন ট্রিগার হয়, ইভেন্ট উপাদানটি এটি প্রতিক্রিয়া করার উপাদান উপাদান টাইপ তা নিশ্চিত করতে পরীক্ষা করুন। যদি এটি এলআই উপাদান হয় তবে বুম করুন: আমাদের যা প্রয়োজন তা আছে! এটি যদি আমরা চাই এমন একটি উপাদান না হয় তবে ইভেন্টটিকে উপেক্ষা করা যেতে পারে। এই উদাহরণটি বেশ সহজ - উল এবং এলআই একটি সরাসরি-এগিয়ে তুলনা। আরও কিছু কঠিন চেষ্টা করুন। আসুন অনেক বাচ্চাদের সাথে একটি পিতামাতার ডিআইভি রাখুন তবে আমরা যা যত্ন করি তা হ'ল ক্লাসএ সিএসএস ক্লাসের সাথে একটি ট্যাগ:

  // Get the parent DIV, add click listener...
  document.getElementById("myDiv").addEventListener("click",function(e) {
// e.target was the clicked element
if(e.target && e.target.nodeName == "A") {
    // Get the CSS classes
    var classes = e.target.className.split(" ");
    // Search for the CSS class!
    if(classes) {
        // For every CSS class the element has...
        for(var x = 0; x < classes.length; x++) {
            // If it has the CSS class we want...
            if(classes[x] == "classA") {
                // Bingo!
                console.log("Anchor element clicked!");
                // Now do something here....
            }
        }
    }

  }
});

http://davidwalsh.name/event-delegate


1
প্রস্তাবিত ত্বক: শেষ উদাহরণের পরিবর্তে e.classList.contains () ব্যবহার করুন: developer.mozilla.org/en-US/docs/Web/API/Element/classList
এনসি।

7

ডোম ইভেন্ট প্রতিনিধি কম্পিউটার বিজ্ঞানের সংজ্ঞা থেকে কিছু আলাদা।

এটি টেবিলের মতো কোনও প্যারেন্ট অবজেক্ট থেকে টেবিল কোষের মতো অনেক উপাদান থেকে বুদবুদ ইভেন্টগুলি পরিচালনা করতে বোঝায়। এটি কোডটিকে আরও সহজ রাখতে পারে, বিশেষত যখন উপাদানগুলি যুক্ত করা বা অপসারণ করার সময় এবং কিছু স্মৃতি সঞ্চয় করে।


6

ডেলিগেশন এমন কৌশল যা কোনও বস্তু বাইরের সাথে কিছু নির্দিষ্ট আচরণ প্রকাশ করে তবে বাস্তবে কোনও আচরণ সম্পর্কিত কোনও বিষয়টিকে বাস্তবায়নের জন্য দায়িত্ব অর্পণ করে। এটি প্রথমে প্রক্সি প্যাটার্নের মতোই শোনাচ্ছে তবে এটি একটি ভিন্ন উদ্দেশ্যে কাজ করে। ডেলিগেশন একটি বিমূর্ত প্রক্রিয়া যা বস্তুর (পদ্ধতি) আচরণকে কেন্দ্রীভূত করে।

সাধারণত কথিত: উত্তরাধিকারের বিকল্প হিসাবে প্রতিনিধিদের ব্যবহার করুন। উত্তরাধিকার হ'ল একটি উত্তম কৌশল, যখন পিতামাতা এবং সন্তানের অবজেক্টের মধ্যে ঘনিষ্ঠ সম্পর্ক বিদ্যমান, তবে, উত্তরাধিকার দম্পতিরা খুব কাছাকাছিভাবে বস্তুগুলি। প্রায়শই, প্রতিনিধিদল ক্লাসগুলির মধ্যে সম্পর্ক প্রকাশ করার আরও নমনীয় উপায়।

এই প্যাটার্নটি "প্রক্সি চেইন" নামেও পরিচিত। অন্যান্য বেশ কয়েকটি ডিজাইনের নিদর্শন প্রতিনিধিদের ব্যবহার করে - রাজ্য, কৌশল এবং দর্শনার্থীর প্যাটার্নগুলি এর উপর নির্ভর করে।


ভাল ব্যাখ্যা। বেশ কয়েকটি <li> বাচ্চাদের সাথে <ul> উদাহরণে, দৃশ্যত <li> হ'ল ক্লিক যুক্তিটি হ্যান্ডেল করে তবে এটি এর মতো নয় কারণ তারা এই যুক্তিটি পিতাকে "প্রতিনিধি" করেছেন <
জুল

6

প্রতিনিধি ধারণা

যদি কোনও পিতা বা মাতার ভিতরে অনেকগুলি উপাদান থাকে এবং আপনি সেগুলির মধ্যে ইভেন্টগুলি পরিচালনা করতে চান - প্রতিটি উপাদানকে হ্যান্ডলারগুলি বেঁধে রাখবেন না। পরিবর্তে, একক হ্যান্ডলারকে তাদের পিতামাতার সাথে বেঁধে রাখুন এবং ইভেন্ট.টারাগেট থেকে শিশুকে পান। এই সাইটটি ইভেন্টের প্রতিনিধি বাস্তবায়নের জন্য দরকারী তথ্য সরবরাহ করে useful http://javascript.info/tutorial/event-delegation


6

ইভেন্টের প্রতিনিধিরা এমন একটি ইভেন্ট পরিচালনা করছে যা কোনও ধারক উপাদানটিতে ইভেন্ট হ্যান্ডলারটি ব্যবহার করে বুদবুদ করে, তবে ইভেন্টটি কোনও ধারক শর্তের সাথে মেলে এমন কোনও ধারকটির মধ্যে ঘটনাটি ঘটলে কেবল ইভেন্ট হ্যান্ডলারের আচরণ সক্রিয় করা হয়। এটি ধারকগুলির মধ্যে উপাদানগুলিতে হ্যান্ডলিং ইভেন্টগুলি সহজতর করতে পারে।

উদাহরণস্বরূপ, ধরুন আপনি কোনও বড় টেবিলের যে কোনও টেবিল ঘরে ক্লিক করতে চান। আপনি প্রতিটি ঘরে একটি ক্লিক হ্যান্ডলার হুক করার জন্য একটি লুপ লিখতে পারেন ... বা আপনি টেবিলের উপরের একটি ক্লিক হ্যান্ডলারটি সংযুক্ত করতে পারেন এবং কেবলমাত্র টেবিল কোষের জন্য এটি ট্রিগার করতে ইভেন্ট ডেলিগেশন ব্যবহার করতে পারেন (এবং কোনও টেবিল শিরোনাম নয়, বা একটি সাদা জায়গার মধ্যে শ্বেত স্থান) ঘরের আশেপাশে সারি ইত্যাদি)।

আপনি যখন ধারক থেকে উপাদান যুক্ত এবং অপসারণ করতে যাচ্ছেন তখন এটিও দরকারী, কারণ আপনাকে সেই উপাদানগুলিতে ইভেন্ট হ্যান্ডলারগুলি যুক্ত এবং মুছে ফেলার বিষয়ে চিন্তা করতে হবে না; ইভেন্টটি কেবল ধারকটিতে রাখুন এবং ইভেন্টটি যখন বুদবুদ হয় তখন পরিচালনা করুন।

এখানে একটি সহজ উদাহরণ (ইচ্ছাকৃতভাবে ইনলাইন ব্যাখ্যার অনুমতি দেওয়ার জন্য ভার্বোজ): tdধারক সারণীর যে কোনও উপাদানটিতে ক্লিক ক্লিক করা :

// Handle the event on the container
document.getElementById("container").addEventListener("click", function(event) {
    // Find out if the event targeted or bubbled through a `td` en route to this container element
    var element = event.target;
    var target;
    while (element && !target) {
        if (element.matches("td")) {
            // Found a `td` within the container!
            target = element;
        } else {
            // Not found
            if (element === this) {
                // We've reached the container, stop
                element = null;
            } else {
                // Go to the next parent in the ancestry
                element = element.parentNode;
            }
        }
    }
    if (target) {
        console.log("You clicked a td: " + target.textContent);
    } else {
        console.log("That wasn't a td in the container table");
    }
});
table {
    border-collapse: collapse;
    border: 1px solid #ddd;
}
th, td {
    padding: 4px;
    border: 1px solid #ddd;
    font-weight: normal;
}
th.rowheader {
    text-align: left;
}
td {
    cursor: pointer;
}
<table id="container">
    <thead>
        <tr>
            <th>Language</th>
            <th>1</th>
            <th>2</th>
            <th>3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th class="rowheader">English</th>
            <td>one</td>
            <td>two</td>
            <td>three</td>
        </tr>
        <tr>
            <th class="rowheader">Español</th>
            <td>uno</td>
            <td>dos</td>
            <td>tres</td>
        </tr>
        <tr>
            <th class="rowheader">Italiano</th>
            <td>uno</td>
            <td>due</td>
            <td>tre</td>
        </tr>
    </tbody>
</table>

এর বিশদে যাওয়ার আগে, আসুন আমরা নিজেরাই মনে করিয়ে দেব যে DOM ইভেন্টগুলি কীভাবে কাজ করে।

ডম ইভেন্টগুলি দস্তাবেজ থেকে লক্ষ্য উপাদান ( ক্যাপচারিং ফেজ) এ প্রেরণ করা হয় , এবং তারপরে লক্ষ্য উপাদান থেকে নথিতে ফিরে যাওয়া ( বুদবুদ পর্যায়)। পুরাতন ডিওএম 3 ইভেন্টের স্পেসের এই গ্রাফিকটি (বর্তমানে সুপারসাইড করা হয়েছে তবে গ্রাফিকটির এখনও কার্যকর আছে) এটি সত্যিই ভাল দেখায়:

এখানে চিত্র বর্ণনা লিখুন

সমস্ত ইভেন্ট বুদবুদ নয়, তবে বেশিরভাগ ক্ষেত্রেই রয়েছে click

উপরের কোড উদাহরণের মন্তব্যগুলিতে এটি কীভাবে কাজ করে তা বর্ণনা করে। matchesকোনও উপাদান সিএসএস নির্বাচকের সাথে মেলে কিনা তা পরীক্ষা করে দেখুন, তবে আপনি যদি কোনও সিএসএস সিলেক্টর ব্যবহার করতে না চান তবে আপনি কিছু অন্যান্য উপায়ে আপনার মানদণ্ডের সাথে মেলে কিনা তা যাচাই করতে পারেন।

এই কোডটি পৃথক পদক্ষেপগুলি ভার্বোজিকভাবে কল করার জন্য লেখা হয়েছিল, তবে অস্পষ্ট-আধুনিক ব্রাউজারগুলিতে (এবং যদি আপনি পলিফিল ব্যবহার করেন তবে আইই তেও), আপনি লুপের পরিবর্তে closestএবং ব্যবহার করতে পারেন contains:

var target = event.target.closest("td");
    console.log("You clicked a td: " + target.textContent);
} else {
    console.log("That wasn't a td in the container table");
}

সরাসরি উদাহরণ:

closestপ্রদত্ত সিএসএস নির্বাচকের সাথে এটি মিলছে কিনা তা দেখার জন্য আপনি যে উপাদানটিতে কল করেছেন সেটিকে যাচাই করে এবং যদি এটি করে, একই উপাদানটিকে ফেরত দেয়; যদি তা না হয় তবে এটি পিতামাতার উপাদানগুলির সাথে এটি মেলে কিনা তা পরীক্ষা করে এবং পিতামাতাকে যদি তাই দেয় তবে তা ফেরত দেয়; যদি তা না হয় তবে এটি পিতামাতার পিতামাতার, ইত্যাদি পরীক্ষা করে So সুতরাং এটি পূর্বপুরুষের তালিকার মধ্যে "নিকটতম" উপাদানটি খুঁজে পায় যা নির্বাচকটির সাথে মেলে। যেহেতু এটি ধারক উপাদানটি অতিক্রান্ত হতে পারে, উপরের কোডটি containsপরীক্ষা করে ব্যবহার করে যে কোনও মিলের উপাদান পাওয়া গেছে কিনা তা কনটেইনারটির মধ্যে রয়েছে - যেহেতু ধারকটিতে ইভেন্টটি হুক করে আপনি কেবলমাত্র সেই ধারকটির মধ্যে থাকা উপাদানগুলি পরিচালনা করতে চান বলে চিহ্নিত করেছেন you ।

আমাদের টেবিলের উদাহরণে ফিরে যাওয়া, এর অর্থ এই যে আপনার যদি কোনও টেবিল ঘরের মধ্যে একটি টেবিল থাকে তবে এটি টেবিলযুক্ত টেবিলের সাথে মেলে না:


3

এটি মূলত কীভাবে উপাদানকে সংযুক্ত করে তোলে। .clickবর্তমান ডিওএম-এ প্রযোজ্য, যখন .on(প্রতিনিধিদের ব্যবহার করে) ইভেন্ট সংঘের পরে ডিওমে যুক্ত হওয়া নতুন উপাদানগুলির জন্য বৈধ হতে থাকবে be

কোনটি ব্যবহার করা ভাল, আমি বলতে পারি এটি কেসের উপর নির্ভর করে।

উদাহরণ:

<ul id="todo">
   <li>Do 1</li>
   <li>Do 2</li>
   <li>Do 3</li>
   <li>Do 4</li>
</ul>

.ক্লিক ইভেন্ট:

$("li").click(function () {
   $(this).remove ();
});

ইভেন্ট .অন:

$("#todo").on("click", "li", function () {
   $(this).remove();
});

নোট করুন যে আমি .on এ নির্বাচককে আলাদা করেছি। আমি ব্যাখ্যা করব কেন।

আসুন আমরা ধরে নিই যে এই সংঘের পরে, নিম্নলিখিতটি করা যাক:

$("#todo").append("<li>Do 5</li>");

সেখানেই আপনি পার্থক্যটি লক্ষ্য করবেন।

ইভেন্টটি। ক্লিকের মাধ্যমে যুক্ত থাকলে, টাস্ক 5 ক্লিক ইভেন্টটি মানবে না, এবং তাই এটি সরানো হবে না।

এটি .on এর মাধ্যমে যদি নির্বাচিতদের পৃথক করে যুক্ত করা হয় তবে তা মানবে।


2

ইভেন্টের প্রতিনিধি বোঝার জন্য প্রথমে আমাদের জানতে হবে কেন এবং কখন আমাদের ইভেন্টের প্রতিনিধি প্রয়োজন হয়।

অনেকগুলি মামলা হতে পারে তবে আসুন আমরা প্রতিনিধি দলের জন্য দুটি বড় ব্যবহারের ক্ষেত্রে আলোচনা করি। ১. প্রথম ক্ষেত্রে হ'ল আমাদের যখন আগ্রহী প্রচুর শিশু উপাদানগুলির সাথে একটি উপাদান থাকে। এক্ষেত্রে এই সমস্ত শিশু উপাদানগুলিতে ইভেন্ট হ্যান্ডলার যুক্ত করার পরিবর্তে আমরা কেবল এটি প্যারেন্ট উপাদানগুলিতে যুক্ত করি এবং তারপরে নির্ধারণ করি যার ভিত্তিতে শিশু উপাদানটি বরখাস্ত করা হয়েছিল।

২. ইভেন্টের প্রতিনিধিদের জন্য দ্বিতীয় ব্যবহারের ঘটনাটি হ'ল যখন আমরা কোনও ইভেন্ট হ্যান্ডলারটি এমন কোনও উপাদানটির সাথে সংযুক্ত করতে চাই যা আমাদের পৃষ্ঠাটি লোড করা হয় তখনও ডিওমে নেই। এটি অবশ্যই, কারণ আমরা এমন কোনও ইভেন্টের হ্যান্ডলার যুক্ত করতে পারি না যা আমাদের পৃষ্ঠায় নেই, তাই অবচয়ের ক্ষেত্রে আমরা কোড করছি।

ধরুন আপনি পৃষ্ঠাটি লোড করার সময় আপনার কাছে 0, 10, বা 100 আইটেমের একটি তালিকা রয়েছে এবং আরও আইটেমগুলি তালিকায় যুক্ত হওয়ার জন্য আপনার হাতে অপেক্ষা করছে। সুতরাং ভবিষ্যতের উপাদানগুলির জন্য ইভেন্ট হ্যান্ডলার সংযুক্ত করার কোনও উপায় নেই বা সেই উপাদানগুলি এখনও ডিওমে যোগ করা হয়নি এবং এছাড়াও প্রচুর আইটেম থাকতে পারে, সুতরাং প্রতিটি ইভেন্টের সাথে একটি ইভেন্ট হ্যান্ডলার সংযুক্ত হওয়া কার্যকর হবে না would তাদের মধ্যে.

ইভেন্ট ডেলিগেশন

ঠিক আছে, তাই ইভেন্টের প্রতিনিধিদের বিষয়ে কথা বলার জন্য, আমাদের প্রথম ধারণার কথা বলতে হবে যা হ'ল ইভেন্ট বুবলিং।

ইভেন্ট বুদবুদ: ইভেন্ট বুদবুদ দেওয়ার অর্থ যখন কোনও ইভেন্টটি কোনও ডিওএম উপাদানকে বহিস্কার করা হয় বা ট্রিগার করা হয়, উদাহরণস্বরূপ বেলো চিত্রটিতে আমাদের বোতামটি ক্লিক করে, তখন ঠিক একই ঘটনাটি প্যারেন্ট উপাদানগুলির সমস্তটিতেও ট্রিগার হয়।

এখানে চিত্র বর্ণনা লিখুন

ইভেন্টটি প্রথমে বোতামে চালিত হয়, তবে তারপরে এটি একবারে সমস্ত প্যারেন্ট উপাদানগুলিতেও ছুঁড়ে ফেলা হবে, সুতরাং এটি অনুচ্ছেদে মূল উপাদানটি এবং অন্যদিকে ডম গাছের সমস্ত অংশে আগুন ধরিয়ে দেবে যতক্ষণ না এইচটিএমএল উপাদান মূল is সুতরাং আমরা বলি যে ইভেন্টটি ডম গাছের অভ্যন্তরে বুদবুদ হয়ে যায় এবং এজন্য একে বুদবুদ বলা হয়।

1 2 3 4

টার্গেট এলিমেন্ট: যে উপাদানটির উপরে ইভেন্টটি প্রথমে গুলি করা হয়েছিল তাকে টার্গেট এলিমেন্ট বলে, সুতরাং যে উপাদানটি ইভেন্টটি ঘটায় তাকে লক্ষ্য উপাদান বলে। আমাদের উপরের উদাহরণে এটি এখানে অবশ্যই আছে, বোতামটি ক্লিক করা হয়েছিল। গুরুত্বপূর্ণ অংশটি হ'ল এই টার্গেট এলিমেন্টটি ইভেন্ট অবজেক্টে সম্পত্তি হিসাবে সংরক্ষণ করা হয়, এর অর্থ হল যে সমস্ত পিতামন্ডল যে ইভেন্টগুলিতে ঘটনাটি চালায় সেগুলি ইভেন্টের লক্ষ্য উপাদানটি জানতে পারে, তাই যেখানে ইভেন্টটি প্রথম চালিত হয়েছিল।

এটি আমাদের ইভেন্টের প্রতিনিধিদের কাছে নিয়ে আসে কারণ যদি ইভেন্টটি ডিওএম গাছে বুদবুদ হয়, এবং যদি ঘটনাটি কোথায় চালানো হয়েছিল তা যদি আমরা জানতে পারি তবে আমরা কেবল একটি ইভেন্ট হ্যান্ডলারকে পিতামাতার সাথে সংযুক্ত করতে পারি এবং ইভেন্টটি বুদবুদ হওয়ার জন্য অপেক্ষা করতে পারি, এবং আমরা পারি তারপরে আমরা আমাদের লক্ষ্য উপাদানটির সাথে যা কিছু করতে চাইছি তা করুন। এই কৌশলটিকে ইভেন্ট প্রতিনিধি বলা হয়। এখানে এই উদাহরণে, আমরা কেবল ইভেন্ট হ্যান্ডলারটি মূল উপাদানটিতে যুক্ত করতে পারি।

ঠিক আছে, আবার, ইভেন্ট প্রতিনিধি হ'ল আমরা যে আগ্রহী সেই মূল উপাদানটির উপর ইভেন্ট হ্যান্ডলারটি স্থাপন না করে এটি একটি পিতামাতার সাথে সংযুক্ত করা এবং মূলত ইভেন্টটি সেখানে ধরা কারণ এটি বুদবুদ। তারপরে আমরা সেই এলিমেন্টটির সাথে কাজ করতে পারি যা আমরা লক্ষ্য উপাদানগুলির সম্পত্তিটি ব্যবহার করতে আগ্রহী।

উদাহরণ: এখন ধরে নেওয়া যাক যে আমাদের পৃষ্ঠাতে দুটি তালিকা আইটেম রয়েছে, প্রোগ্রামগুলির তালিকায় আইটেম যুক্ত করার পরে আমরা সেগুলি থেকে এক বা একাধিক আইটেম মুছতে চাই। ইভেন্ট ডেলিগেশন টেকনিউক ব্যবহার করে আমরা সহজেই আমাদের পুরুপোজটি অর্জন করতে পারি।

<div class="body">
    <div class="top">

    </div>
    <div class="bottom">
        <div class="other">
            <!-- other bottom elements -->
        </div>
        <div class="container clearfix">
            <div class="income">
                <h2 class="icome__title">Income</h2>
                <div class="income__list">
                    <!-- list items -->
                </div>
            </div>
            <div class="expenses">
                <h2 class="expenses__title">Expenses</h2>
                <div class="expenses__list">
                    <!-- list items -->
                </div>
            </div>
        </div>
    </div>
</div>

এই তালিকায় আইটেম যুক্ত করা:

const DOMstrings={
        type:{
            income:'inc',
            expense:'exp'
        },
        incomeContainer:'.income__list',
        expenseContainer:'.expenses__list',
        container:'.container'
   }


var addListItem = function(obj, type){
        //create html string with the place holder
        var html, element;
        if(type===DOMstrings.type.income){
            element = DOMstrings.incomeContainer
            html = `<div class="item clearfix" id="inc-${obj.id}">
            <div class="item__description">${obj.descripiton}</div>
            <div class="right clearfix">
                <div class="item__value">${obj.value}</div>
                <div class="item__delete">
                    <button class="item__delete--btn"><i class="ion-ios-close-outline"></i></button>
                </div>
            </div>
        </div>`
        }else if (type ===DOMstrings.type.expense){
            element=DOMstrings.expenseContainer;
            html = ` <div class="item clearfix" id="exp-${obj.id}">
            <div class="item__description">${obj.descripiton}</div>
            <div class="right clearfix">
                <div class="item__value">${obj.value}</div>
                <div class="item__percentage">21%</div>
                <div class="item__delete">
                    <button class="item__delete--btn"><i class="ion-ios-close-outline"></i></button>
                </div>
            </div>
        </div>`
        }
        var htmlObject = document.createElement('div');
        htmlObject.innerHTML=html;
        document.querySelector(element).insertAdjacentElement('beforeend', htmlObject);
    }

আইটেমগুলি মুছুন:

var ctrlDeleteItem = function(event){
       // var itemId = event.target.parentNode.parentNode.parentNode.parentNode.id;
        var parent = event.target.parentNode;
        var splitId, type, ID;
        while(parent.id===""){
            parent = parent.parentNode
        }
        if(parent.id){
            splitId = parent.id.split('-');
            type = splitId[0];
            ID=parseInt(splitId[1]);
        }

        deleteItem(type, ID);
        deleteListItem(parent.id);
 }

 var deleteItem = function(type, id){
        var ids, index;
        ids = data.allItems[type].map(function(current){
            return current.id;
        });
        index = ids.indexOf(id);
        if(index>-1){
            data.allItems[type].splice(index,1);
        }
    }

  var deleteListItem = function(selectorID){
        var element = document.getElementById(selectorID);
        element.parentNode.removeChild(element);
    }

1

সি # তে একটি প্রতিনিধি সি বা সি ++ এর ফাংশন পয়েন্টারের সমান। একটি প্রতিনিধি ব্যবহার প্রোগ্রামারকে একটি প্রতিনিধি বস্তুর অভ্যন্তরের কোনও পদ্ধতির একটি রেফারেন্সকে encapsulate করার অনুমতি দেয়। প্রতিনিধি অবজেক্টটি তারপরে কোডে পাস করা যায় যা রেফারেন্স পদ্ধতিটিকে কল করতে পারে, সংকলন করার সময় কোন পদ্ধতিটি চাওয়া হবে তা জেনেও।

এই লিঙ্কটি দেখুন -> http://www.akadia.com/services/dotnet_delegates_and_events.html


5
আমি এটিকে ভোট দিতে যাচ্ছি না, কারণ এটি সম্ভবত মূল প্রশ্নের সঠিক উত্তর ছিল, তবে প্রশ্নটি এখন বিশেষভাবে
ডিওএম

1

ইভেন্ট প্রতিনিধি জাভাস্ক্রিপ্ট ইভেন্টগুলির দুটি প্রায়শই অবহেলিত বৈশিষ্ট্য ব্যবহার করে: ইভেন্ট বুদবুদ এবং লক্ষ্য উপাদান W যখন কোনও ইভেন্ট কোনও ইভেন্টে ট্রিগার করা হয়, উদাহরণস্বরূপ একটি বোতামে মাউস ক্লিক করা হয়, একই ইভেন্টটিও সেই উপাদানটির পূর্বসূরীদের সমস্তটিতে ট্রিগার করা হয় । এই প্রক্রিয়া ইভেন্ট বুদবুদ হিসাবে পরিচিত; ইভেন্টটি মূল উপাদান থেকে শুরু করে ডিওএম গাছের উপরে উঠে যায় bles

10 টি কলাম এবং 100 টি সারি সহ একটি এইচটিএমএল টেবিলটি কল্পনা করুন যাতে ব্যবহারকারী কোনও টেবিল ঘরে ক্লিক করলে আপনি কিছু ঘটতে চান। উদাহরণস্বরূপ, ক্লিক করার সময় আমাকে একবার সেই আকারের টেবিলের প্রতিটি ঘর সম্পাদনযোগ্য করে তুলতে হয়েছিল। প্রতিটি 1000 কোষে ইভেন্ট হ্যান্ডলার যুক্ত করা একটি বড় পারফরম্যান্স সমস্যা এবং সম্ভবত, ব্রাউজার-ক্রাশ মেমরি ফাঁসের উত্স। পরিবর্তে ইভেন্ট প্রতিনিধি ব্যবহার করে, আপনি কেবলমাত্র ইভেন্ট ইভেন্ট হ্যান্ডলারটি টেবিল উপাদানগুলিতে যুক্ত করবেন, ক্লিক ইভেন্টটি বাদ দিয়ে কোন ঘরে ক্লিক করা হয়েছে তা নির্ধারণ করবেন।


0
ইভেন্ট ডেলিগেশন

কোনও ইভেন্টের শ্রোতাকে কোনও পিতামাতার উপাদানগুলিতে সংযুক্ত করুন যা কোনও শিশু উপাদানের উপর ঘটনা ঘটলে আগুন জ্বলে ওঠে।

ইভেন্ট প্রচার

কোনও ইভেন্ট যখন ডিওএমের মধ্য দিয়ে একটি শিশু থেকে পিতামাতার উপাদানগুলিতে চলে যায়, যাকে ইভেন্ট প্রপাগেশন বলা হয় , কারণ ইভেন্টটি প্রচার করে, বা ডিওএম এর মধ্য দিয়ে চলে।

এই উদাহরণস্বরূপ, একটি বোতাম থেকে একটি ইভেন্ট (অনক্লিক) প্যারেন্ট অনুচ্ছেদে চলে যায়।

$(document).ready(function() {

    $(".spoiler span").hide();

    /* add event onclick on parent (.spoiler) and delegate its event to child (button) */
    $(".spoiler").on( "click", "button", function() {
    
        $(".spoiler button").hide();    
    
        $(".spoiler span").show();
    
    } );

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>

<p class="spoiler">
    <span>Hello World</span>
    <button>Click Me</button>
</p>

Codepen

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.