সমস্ত jquery ইভেন্ট $ (নথি) আবদ্ধ করা উচিত?


164

এই কোথা থেকে আসছে

আমি যখন প্রথম jQuery শিখি তখন আমি সাধারণত এই জাতীয় ইভেন্টগুলি সংযুক্ত করেছিলাম:

$('.my-widget a').click(function() {
    $(this).toggleClass('active');
});

নির্বাচকের গতি এবং ইভেন্টের প্রতিনিধি সম্পর্কে আরও জানার পরে, আমি বেশ কয়েকটি জায়গায় পড়েছি যে "jQuery ইভেন্ট প্রতিনিধি আপনার কোডটি আরও দ্রুত করে তুলবে।" সুতরাং আমি এই জাতীয় কোড লেখা শুরু:

$('.my-widget').on('click','a',function() {
    $(this).toggleClass('active');
});

অবহেলিত। লাইভ () ইভেন্টের আচরণের প্রতিরূপ করার জন্য এটিও প্রস্তাবিত উপায় ছিল। যা আমার কাছে গুরুত্বপূর্ণ, যেহেতু আমার প্রচুর সাইটগুলি সর্বদা গতিশীলভাবে উইজেটগুলি যুক্ত / সরান। উপরেরগুলি ঠিক যেমন লাইভ () এর মতো আচরণ করে না, কারণ ইতিমধ্যে বিদ্যমান কন্টেইনারগুলিতে কেবলমাত্র উপাদানগুলি '.মাই-উইজেট' যুক্ত আচরণ পাবে। যদি কোডটি চলে যাওয়ার পরে আমি গতিশীলভাবে এইচটিএমএল এর অন্য একটি ব্লক যুক্ত করি তবে elements উপাদানগুলি তাদের সাথে আবদ্ধ হওয়াগুলি পাবে না। এটার মত:

setTimeout(function() {
    $('body').append('<div class="my-widget"><a>Click does nothing</a></div>');
}, 1000);


আমি যা অর্জন করতে চাই:

  1. .live () // এর পুরানো আচরণ যার অর্থ ইভেন্টগুলি এখনও বিদ্যমান উপাদানগুলিতে সংযুক্ত করা
  2. .on () এর সুবিধা
  3. ইভেন্টগুলি বাঁধতে দ্রুততম পারফরম্যান্স
  4. ইভেন্ট পরিচালনা করার সহজ উপায়

আমি এখন এর মতো সমস্ত ইভেন্ট সংযুক্ত করি:

$(document).on('click.my-widget-namespace', '.my-widget a', function() {
    $(this).toggleClass('active');
});

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

আমার সমাধান / প্রশ্ন

সুতরাং আমি ভাবতে শুরু করি যে jQuery ইভেন্টগুলি সর্বদা $ (ডকুমেন্ট) এ আবদ্ধ থাকা উচিত।
আপনি এটি করতে চান না কেন এমন কোনও কারণ আছে?
এটি কি সেরা অনুশীলন হিসাবে বিবেচনা করা যেতে পারে? তা না হলে কেন?

আপনি যদি এই পুরো জিনিসটি পড়ে থাকেন তবে আপনাকে ধন্যবাদ। আমি কোনও / সমস্ত প্রতিক্রিয়া / অন্তর্দৃষ্টি প্রশংসা করি।

অনুমিতি:

  1. JQuery ব্যবহার করে যা .on()// কমপক্ষে সংস্করণ 1.7 সমর্থন করে
  2. আপনি চান ইভেন্টটি গতিশীল যুক্ত সামগ্রীতে যুক্ত করা হোক

রিডিং / উদাহরণ:

  1. http://24ways.org/2011/your-jquery-now-with-less-suck
  2. http://brandonaaron.net/blog/2010/03/4/event-delegation-with-jquery
  3. http://www.jasonbuckboyer.com/playground/speed/speed.html
  4. http://api.jquery.com/on/

উত্তর:


215

না - আপনাকে সমস্ত প্রতিনিধি ইভেন্ট হ্যান্ডলারগুলিকে documentঅবজেক্টের সাথে আবদ্ধ করা উচিত নয় । এটি সম্ভবত আপনি তৈরি করতে পারেন সবচেয়ে খারাপ পারফরম্যান্স।

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

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

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

ইভেন্টের প্রতিনিধি প্রয়োজন বা সুবিধাজনক যখন এখানে আসে:

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

এটি আরও কিছুটা বোঝার জন্য, একজনকে বুঝতে হবে কীভাবে jQuery ডেলিগেট ইভেন্ট হ্যান্ডলারগুলি কাজ করে। আপনি যখন এই জাতীয় কিছু কল করবেন:

$("#myParent").on('click', 'button.actionButton', myFn);

এটি #myParentবস্তুটিতে জেনেরিক জিকুয়ের ইভেন্ট ইভেন্ট হ্যান্ডলার ইনস্টল করে । যখন কোনও ক্লিক ইভেন্টটি এই প্রতিনিধি ইভেন্ট হ্যান্ডলারের উপর বুদবুদ হয়ে থাকে, তখন jQuery কে এই অবজেক্টের সাথে সংযুক্ত প্রতিনিধি ইভেন্ট হ্যান্ডলারগুলির তালিকাটি দেখতে হবে এবং নির্ধারিত ইভেন্ট হ্যান্ডলারের কোনও নির্বাচকের সাথে ইভেন্টটির উত্স উপাদানটি মিলবে কিনা তা দেখতে হবে।

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

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


সুতরাং, অনুকূলিত কর্মক্ষমতা অর্জন করতে:

  1. কেবলমাত্র ডেলিগ্রেটেড ইভেন্ট হ্যান্ডলিং ব্যবহার করুন যখন এটি আসলে আপনার প্রয়োজনীয় বৈশিষ্ট্য সরবরাহ করে বা পারফরম্যান্স বাড়ায়। কেবল সর্বদা এটি ব্যবহার করবেন না কারণ এটি সহজ কারণ যখন আপনার আসলে এটির প্রয়োজন হয় না। এটি সরাসরি ইভেন্ট বাইন্ডিংয়ের চেয়ে ইভেন্ট প্রেরণের সময় আরও খারাপ সম্পাদন করে।
  2. যতটা সম্ভব ইভেন্টের উত্সটির নিকটতম পিতামাতার সাথে প্রতিনিধি ইভেন্ট হ্যান্ডলার সংযুক্ত করুন। যদি আপনি প্রতিনিধি ইভেন্ট হ্যান্ডলিং ব্যবহার করে থাকেন কারণ আপনার গতিশীল উপাদান রয়েছে যার জন্য আপনি ইভেন্টগুলি ক্যাপচার করতে চান, তবে নিকটতম অভিভাবক যা নিজে গতিশীল নয় তা নির্বাচন করুন।
  3. প্রতিনিধি ইভেন্ট হ্যান্ডলারদের জন্য সহজে-মূল্যায়নের নির্বাচকগুলি ব্যবহার করুন। যদি আপনি নির্ধারিত ইভেন্ট হ্যান্ডলিং কীভাবে কাজ করে তা অনুসরণ করে থাকেন তবে আপনি বুঝতে পারবেন যে একটি প্রতিনিধি ইভেন্ট হ্যান্ডলারকে প্রচুর পরিমাণে অবজেক্টের সাথে তুলনা করতে হবে সুতরাং যতটা সম্ভব একজন নির্বাচককে যথাসম্ভব দক্ষ বাছাই করা বা আপনার অবজেক্টগুলিতে সহজ ক্লাস যুক্ত করা যাতে সহজ নির্বাচকরা ব্যবহার করতে পারেন প্রতিনিধি ইভেন্ট হ্যান্ডলিংয়ের কর্মক্ষমতা বৃদ্ধি করুন increase

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

এছাড়াও আপনি বলতে চেয়েছিলেন যে আপনি আমাকে বিশ্বাস করেছিলেন - সমস্ত ইভেন্টকে $ (নথি) তে আবদ্ধ করবেন না। যতটা সম্ভব নিকটতম পরিবর্তিত পিতামাতার সাথে বাঁধুন। আমি অনুমান করি যে ইভেন্টের প্রতিনিধিরা কোনও ইভেন্টকে সরাসরি কোনও উপাদানকে আবদ্ধ করার চেয়ে ভাল হলে আমি এখনও কেস বাই কেস ভিত্তিতে সিদ্ধান্ত নিতে পারি। এবং যখন আমার গতিশীল কন্টেন্টের সাথে আবদ্ধ ইভেন্টগুলির প্রয়োজন হবে (যার কোনও পরিবর্তন না হওয়া পিতা-মাতা নেই) আমি অনুমান করি যে @ ভেগা নীচের প্রস্তাবিত কাজগুলি চালিয়ে যাব এবং সামগ্রীগুলি প্রবেশ করার পরে কেবল "হ্যান্ডলার (গুলি) বাঁধুন" ) ডম ", আমার নির্বাচকটিতে jQuery এর প্রসঙ্গ পরামিতি ব্যবহার করে।
বাক

5
@ ব্যবহারকারী 1394692 - যদি আপনার কাছে প্রায় একই ধরণের উপাদান থাকে তবে তাদের জন্য প্রতিনিধি ইভেন্ট হ্যান্ডলারগুলি ব্যবহার করা বুদ্ধিমান হতে পারে। আমি আমার উত্তরে এটি বলি। যদি আমার কাছে দৈত্য 500 সারি টেবিল থাকে এবং নির্দিষ্ট কলামের প্রতিটি সারিতে একই বোতাম থাকে, আমি সমস্ত বোতাম পরিবেশন করতে টেবিলে একটি প্রতিনিধি ইভেন্ট হ্যান্ডলার ব্যবহার করব। তবে যদি আমার 200 টি উপাদান থাকে এবং তাদের সকলের নিজস্ব অনন্য ইভেন্ট হ্যান্ডলারের প্রয়োজন হয়, 200 প্রতিনিধি ইভেন্ট হ্যান্ডলার ইনস্টল করা 200 সরাসরি বাউন্ড ইভেন্ট হ্যান্ডলারগুলি ইনস্টল করার চেয়ে দ্রুততর কিছু না, তবুও অনুষ্ঠানের সম্পাদনার পরে ডেলিগ্রেড ইভেন্ট হ্যান্ডলিং অনেক ধীর হতে পারে।
jਫਰ00

আপনি নিখুঁত. সম্পূর্ণ একমত! আমি কি বুঝতে পারি যে এটি করা সবচেয়ে খারাপ কাজ - $(document).on('click', '[myCustomAttr]', function () { ... });?
আর্টেম ফাইটসকিন

পজ্যাক্স / টারবোলিংকগুলি ব্যবহার করা একটি আকর্ষণীয় সমস্যা তৈরি করে যেহেতু সমস্ত উপাদান গতিশীলভাবে তৈরি / সরানো হয়েছে (প্রথম পৃষ্ঠার বোঝা বাদে)। তাহলে একবারে সমস্ত ইভেন্টকে একবারে বেঁধে রাখা document, বা আরও নির্দিষ্ট নির্বাচনের উপর আবদ্ধ হওয়া page:loadএবং এই ইভেন্টগুলিকে আবদ্ধ করা ভাল page:after-remove? হুমম
ডম ক্রিস্টি

9

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

আপনার কখন ইভেন্টের প্রতিনিধি ব্যবহার করা উচিত?

  1. আপনি যখন আরও কার্যকর উপাদানগুলির জন্য একই কার্যকারিতাটির জন্য একটি সাধারণ হ্যান্ডলারকে বাঁধেন। (উদা: টেবিল সারি হোভার)
    • উদাহরণস্বরূপ, যদি আপনাকে সরাসরি বাইন্ড ব্যবহার করে সমস্ত সারি আবদ্ধ করতে হয়, আপনি সেই টেবিলের n সারিগুলির জন্য এন হ্যান্ডলার তৈরি করবেন up প্রতিনিধি পদ্ধতি ব্যবহার করে আপনি 1 টি সাধারণ হ্যান্ডলারের মধ্যে সমস্তগুলি পরিচালনা করতে পারেন।
  2. আপনি যখন ডিওএমে আরও ঘন ঘন গতিশীল সামগ্রী যুক্ত করেন (উদা: একটি সারণী থেকে সারিগুলি যুক্ত / সরান)

আপনি ইভেন্ট প্রতিনিধি ব্যবহার করবেন না কেন?

  1. ইভেন্টের সাথে সরাসরি উপাদানকে আবদ্ধ করার তুলনায় ইভেন্টের প্রতিনিধি ধীরে ধীরে।
    • এটি যে প্রতিটি বুদ্বুদে আঘাত করে তার লক্ষ্য নির্বাচককে তুলনা করে, তুলনাটি যত জটিল হবে তত ব্যয়বহুল হবে।
  2. যতক্ষণ না এটি আবদ্ধ সেই উপাদানটিকে আঘাত করে ততক্ষণ ইভেন্টের উপর কোনও নিয়ন্ত্রণ নেই।

পিএস: এমনকি ডায়নামিক বিষয়বস্তুগুলির জন্য আপনাকে বিষয়বস্তু ডিওমে প্রবেশ করার পরে হ্যান্ডলারের সাথে আবদ্ধ থাকলে ইভেন্ট ডেলিগেশন পদ্ধতিটি ব্যবহার করতে হবে না। (যদি গতিশীল বিষয়বস্তু যুক্ত করা হয় তবে প্রায়শই সরানো / পুনরায় যোগ না করা হয়)


0

স্পষ্টতই, ইভেন্ট প্রতিনিধিদের এখনই সুপারিশ করা হয়। অন্তত ভ্যানিলা জেএস এর জন্য।

https://gomakethings.com/why-event-delegation-is-a-better-way-to-listen-for-events-in-vanilla-js/

"ওয়েব পারফরম্যান্স # নথির প্রতিটি ক্লিক শোনার জন্য পারফরম্যান্সের পক্ষে খারাপ লাগবে বলে মনে হচ্ছে, তবে ব্যক্তিগত আইটেমগুলিতে ইভেন্ট শ্রোতাদের একগুচ্ছ থাকার চেয়ে এটি আরও বেশি পারফরম্যান্স।"


0

আমি j20000 এর উত্তরে কিছু মন্তব্য এবং জবাবদিহি যুক্ত করতে চাই। (বেশিরভাগই আমার অন্ত্র অনুভূতির উপর ভিত্তি করে আমার মতামত)

না - আপনার সমস্ত প্রতিনিধি ইভেন্ট হ্যান্ডলারদের ডকুমেন্ট অবজেক্টে আবদ্ধ করা উচিত নয়। এটি সম্ভবত আপনি তৈরি করতে পারেন সবচেয়ে খারাপ পারফরম্যান্স।

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

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

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

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

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

এই কেবল সত্য নয়। দয়া করে এই কোডপেনটি দেখুন: https://codepen.io/pwkip/pen/jObGmjq

document.addEventListener('keypress', (e) => {
    e.preventDefault();
});

এটি ডকুমেন্টটিতে কীপ্রেস ইভেন্টটি নিবন্ধভুক্ত করে আপনি কীভাবে কোনও ব্যবহারকারীকে টাইপ করা থেকে বিরত রাখতে পারবেন তা চিত্রিত করে।

ইভেন্টের প্রতিনিধি প্রয়োজন বা সুবিধাজনক যখন এখানে আসে:

আপনি যে বিষয়গুলিতে ইভেন্টগুলি ক্যাপচার করছেন সেগুলি যখন গতিশীলভাবে তৈরি / সরিয়ে ফেলা হয় এবং আপনি এখনও যখন কোনও নতুন তৈরি করেন তখন ইভেন্ট হ্যান্ডলারগুলিকে স্পষ্টতই পুনরায় প্রত্যাবর্তন না করে আপনি সেগুলিতে ইভেন্টগুলি ক্যাপচার করতে চান। যখন আপনার কাছে প্রচুর অবজেক্ট থাকে যা সকলেই একই ঘটনা ইভেন্ট হ্যান্ডলার চায় (যেখানে প্রচুর পরিমাণ কমপক্ষে শত শত হয়)। এই ক্ষেত্রে, শত বা ততোধিক সরাসরি ইভেন্ট হ্যান্ডলারের পরিবর্তে কোনও প্রতিনিধি ইভেন্ট হ্যান্ডলারকে আবদ্ধ করার জন্য সেটআপের সময় এটি আরও কার্যকর it দ্রষ্টব্য, প্রতিনিধি ইভেন্ট হ্যান্ডলিং সরাসরি ইভেন্ট হ্যান্ডলারের তুলনায় রান-টাইমে সর্বদা কম দক্ষ।

আমি এই উদ্ধৃতিটির সাথে https: //ehsang বাজার.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c থেকে উত্তর দিতে চাই

Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.

এছাড়াও, performance cost of event delegation googleইভেন্ট প্রতিনিধিদের পক্ষে আরও ফলাফলের জন্য গুগলিং করা ।

যখন আপনি দস্তাবেজের কোনও উপাদানগুলিতে ঘটে যাওয়া ইভেন্টগুলি (আপনার দস্তাবেজের একটি উচ্চ স্তরে) ক্যাপচার করার চেষ্টা করছেন। যখন আপনার ডিজাইনটি আপনার পৃষ্ঠায় কিছু সমস্যা বা বৈশিষ্ট্য সমাধান করতে স্পষ্টভাবে ইভেন্ট বুদবুদ এবং স্টপপ্রোপেশন () ব্যবহার করছে। এটি আরও কিছুটা বোঝার জন্য, একজনকে বুঝতে হবে কীভাবে jQuery ডেলিগেট ইভেন্ট হ্যান্ডলারগুলি কাজ করে। আপনি যখন এই জাতীয় কিছু কল করবেন:

$ ("# আমার পিতা") on ('ক্লিক করুন', 'বাটন.অ্যাকশনবটন', মাইএফএন); এটি # মাই প্যারেন্ট অবজেক্টে জেনেরিক জিকুয়ের ইভেন্ট ইভেন্ট হ্যান্ডলার ইনস্টল করে। যখন কোনও ক্লিক ইভেন্টটি এই প্রতিনিধি ইভেন্ট হ্যান্ডলারের উপর বুদবুদ হয়ে থাকে, তখন jQuery কে এই অবজেক্টের সাথে সংযুক্ত প্রতিনিধি ইভেন্ট হ্যান্ডলারগুলির তালিকাটি দেখতে হবে এবং নির্ধারিত ইভেন্ট হ্যান্ডলারের কোনও নির্বাচকের সাথে ইভেন্টটির উত্স উপাদানটি মিলবে কিনা তা দেখতে হবে।

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

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

এই নথি কোথায়? যদি এটি সত্য হয়, তবে jQuery মনে হয় খুব অদক্ষ উপায়ে প্রতিনিধিদের পরিচালনা করছে এবং তারপরে আমার পাল্টা যুক্তিগুলি কেবল ভ্যানিলা জেএস-এ প্রয়োগ করা উচিত।

তবুও: আমি এই দাবিকে সমর্থন করে একটি সরকারী উত্স খুঁজে পেতে চাই।

:: সম্পাদনা ::

দেখে মনে হচ্ছে jQuery সত্যিই খুব অদক্ষ উপায়ে ইভেন্ট বুদবুদ করছে (কারণ তারা IE8 সমর্থন করে) https://api.jquery.com/on/#event-performance

সুতরাং এখানে আমার বেশিরভাগ যুক্তি কেবল ভ্যানিলা জেএস এবং আধুনিক ব্রাউজারগুলির জন্যই সত্য।

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