কেন "$ ()। প্রস্তুত (হ্যান্ডলার)" বাঞ্ছনীয় নয়?


88

এর জন্য jQuery API ডক্স সাইট থেকেready

নীচের তিনটি বাক্য গঠন সমান:

  • document (নথি)। প্রস্তুত (হ্যান্ডলার)
  • $ ()। প্রস্তুত (হ্যান্ডলার) (এটি প্রস্তাবিত নয়)
  • $ (হ্যান্ডলার)

হোমওয়ার্ক করার পরে - সোর্স কোডটি পড়ে পড়া এবং খেলার পরে , কেন আমি জানি না

$().ready(handler) 

প্রস্তাবিত হয় না। প্রথম এবং তৃতীয় উপায়গুলি হুবহু একই, তৃতীয় বিকল্পটি ক্যাশেড জিকুয়েরি অবজেক্টের সাথে প্রস্তুত ফাংশনটিকে কল করে document:

rootjQuery = jQuery(document);
...
...

// HANDLE: $(function)
// Shortcut for document ready
} else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
}

তবে প্রস্তুত ফাংশনটির নির্বাচিত নোড উপাদানগুলির নির্বাচকের সাথে কোনও ইন্টারঅ্যাকশন নেই, readyউত্স কোড:

ready: function( fn ) {
    // Attach the listeners
    jQuery.bindReady();
        // Add the callback
    readyList.add( fn );
        return this;
},

আপনি দেখতে পাচ্ছেন, এটি অভ্যন্তরীণ কাতারে কলব্যাক যোগ করার পক্ষে যুক্তিযুক্ত ( readyList) এবং সেটের উপাদানগুলিকে পরিবর্তন বা ব্যবহার করে না। এটি আপনাকে readyপ্রতিটি jQuery অবজেক্টে ফাংশনটি কল করতে দেয় ।

পছন্দ:

  • নিয়মিত নির্বাচক: $('a').ready(handler) ডেমো
  • বাজে বাছাইকারী: $('fdhjhjkdafdsjkjriohfjdnfj').ready(handler) ডেমো
  • অপরিবর্তিত নির্বাচক: $().ready(handler) ডেমো

অবশেষে ... আমার প্রশ্ন: কেন $().ready(handler)সুপারিশ করা হয় না?


60
@ চাওসপ্যান্ডিয়ন: আমার কাছে মনে হচ্ছে তিনি তাঁর হাতের পিছনের মতো ব্যবহার করা সরঞ্জামগুলি বোঝার চেষ্টা করছেন। আমি ঠিক সেই অপব্যয় প্রচেষ্টা বলব না।
জন

4
ভাল প্রশ্ন. যদি কেউ আগ্রহী হন তবে এখানে একটি পারফরম্যান্স তুলনা করা হয়েছে ... যা (অন্তত ক্রোমে) দেখায় যে "অপ্রস্তুত" সংস্করণটি আসলে দ্রুততম।
জেমস অ্যালার্ডাইস

4
আরও ভাল প্রশ্ন হ'ল কেন এগুলি একেবারেই বিদ্যমান, এটি একটি স্থির পদ্ধতি হওয়া উচিত ( $.readyউদাহরণস্বরূপ) এবং প্রথমে jQuery অবজেক্ট তৈরি করার প্রয়োজন নেই।
ইসাইলাইজা

4
@ ইসাইলিজা সবার সেরা পয়েন্ট তৈরি করে। JQuery .ready()পৃথক উপাদানগুলির জন্য কিছু প্রকারের ক্ষমতা সরবরাহ করার পরিকল্পনা না করে কোনও jQuery অবজেক্ট তৈরি করার কোনও কারণ থাকতে হবে না।

4
পছন্দ করুন আপনি এটি ব্যবহার করতে পারবেন না ... $.readyইতিমধ্যে একটি অভ্যন্তরীণ jQuery ফাংশন দ্বারা নেওয়া হয়েছে, এর উত্স কোডটি অনুসন্ধান করুন ready:
gdoron মনিকা

উত্তর:


88

আমি jQuery বিকাশকারীদের একজনের কাছ থেকে একটি অফিসিয়াল উত্তর পেয়েছি:

$().ready(fn)শুধুমাত্র কাজ করে কারণ (jQuery <1.4) এর$() একটি শর্টকাট ব্যবহৃত হয়েছিল তাই পাঠযোগ্য কোড ছিল।$(document)
$().ready(fn)

তবে লোকেরা $().mouseover()বিভিন্ন ধরণের পাগলামির মতো কাজ করত।
এবং $([])একটি খালি jQuery অবজেক্ট পেতে লোকজনকে করতে হয়েছিল

১.৪-তে আমরা এটি পরিবর্তন করেছি যাতে $()একটি খালি jQuery দেয় এবং আমরা কেবল কোড তৈরি করেছিলাম $().ready(fn)যাতে প্রচুর কোড না ভাঙে

$().ready(fn) উত্তরাধিকারের ক্ষেত্রে এটি সঠিকভাবে কাজ করার জন্য আক্ষরিক অর্থে এখন কেবল প্যাচ করা হয়েছে।

readyফাংশনটির জন্য সেরা জায়গাটি $.ready(fn), তবে এটি একটি সত্যই পুরানো ডিজাইনের সিদ্ধান্ত এবং আমাদের এখন এটিই রয়েছে।


আমি তাকে জিগ্যেস করেছিলাম:

আপনি কি মনে করেন যে (n (fn)) $ () প্রস্তুত (এফএন) এর চেয়ে বেশি পঠনযোগ্য ?!

তার উত্তর ছিল:

আমি সবসময় প্রকৃত অ্যাপ্লিকেশনগুলিতে $ (ডকুমেন্ট) .ডিডি (এফএন) করি এবং সাধারণত অ্যাপটিতে কেবলমাত্র একটি ডক রেডি ব্লক থাকে এটি ঠিক কোনও রক্ষণাবেক্ষণের মতো নয়।

আমি মনে করি $ (fn) খুব অপঠনযোগ্য , এটি কেবল একটি জিনিস যা আপনার কাজগুলি জানতে হবে ™ ...


4
বোধগম্যতা জানায়, jQuery পিছনের দিকের সামঞ্জস্যতা সম্পর্কে বেশ গুরুতর
এসাইলাইজ

@Esailija: যদি তারা যে গুরুতর ছিলেন, তারা আচরণের সুইচড হতো না $()প্রথম স্থানে (নির্বোধ হিসেবে যে আচরণ হতে পারে হয়েছে) । অন্যদিকে, আপনি ঠিক বলেছেন। তারা সর্বদা বিরতি পরিবর্তন করতে ঝোঁক থাকে না, যেমনটি তারা পরিবর্তনের চেষ্টা করার সময় দেখানো হয়েছিল .attr(), তারপরে কয়েক দিন পরে দ্রুত প্রত্যাবর্তন করেছিল। এটি তাদের দুর্ভাগ্যজনক কিছু প্রাথমিক (এবং মিডলাইফ) নকশার সিদ্ধান্তগুলিতে আবদ্ধ করেছে।

4
ঘোড়ার মুখ থেকে সরাসরি এটি পাওয়ার জন্য @gdoron +1 করুন।

4
আসল উত্তর পাওয়ার জন্য @gdoron +1 করুন। এবং, হ্যাঁ, আমরা আমাদের উপলব্ধি প্রায় কাছাকাছি ছিল।
ভিজিওন

" এটা শুধু একটা জিনিস যে আপনি কি জানেন ওয়ার্কস ™ ..." আচ্ছা তাই হয় $(selector[, context])এবং $(html[, ownerDocument])। প্রকৃতপক্ষে, আপনি যদি এটি-কাজ-এটি-কাজ করা সমস্যা হয় তবে এটির jQuery()পরিবর্তে আপনি কেবল ব্যবহার করতে $()পারেন। বা কেন এমনকি jQuery মোটেও ব্যবহার করবেন?
জাব

11

যেহেতু বিভিন্ন বিকল্পগুলি আপনার নির্দেশিতভাবে একই কাজ করে, তাই এটি সময় লাইব্রেরি লেখক টুপি এবং কিছু অনুমান করার সময়।

  1. সম্ভবত jQuery লোকেরা $()ভবিষ্যতের ব্যবহারের জন্য উপলব্ধ থাকতে চান (সন্দেহজনক যেহেতু $().readyকাজ করার জন্য নথিভুক্ত করা হয়, এমনকি যদি এটি প্রস্তাবিত নাও হয়; এটি $যদি বিশেষ-ক্ষেত্রেযুক্ত এর শব্দার্থকে দূষিতও করে)।

  2. আরও বেশি ব্যবহারিক কারণ: দ্বিতীয় সংস্করণটি হ'ল মোড়ক শেষ করে নাdocument , তাই কোড বজায় রাখার সময় ভাঙ্গা সহজ। উদাহরণ:

    // BEFORE
    $(document).ready(foo);
    
    // AFTER: works
    $(document).ready(foo).on("click", "a", function() {});
    

    এর সাথে বৈসাদৃশ্য করুন

    // BEFORE
    $().ready(foo);
    
    // AFTER: breaks
    $().ready(foo).on("click", "a", function() {});
    
  3. উপরের সাথে সম্পর্কিত: readyএই বিবেচনায় একটি ফ্রিক হ'ল এটি (একমাত্র?) পদ্ধতি যা জিকুয়েরি অবজেক্টটি যেভাবে আবৃত করে তা নির্ধারণ করে না (এমনকি এটি এখানে যেমন কিছু কিছু মোড় না দেয়) তখনও এটি একই কাজ করবে। এটি অন্যান্য jQuery পদ্ধতির শব্দার্থবিজ্ঞানের থেকে একটি প্রধান পার্থক্য, সুতরাং নির্দিষ্টভাবে এটির উপর নির্ভর করা সঠিকভাবে নিরুৎসাহিত করা।

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

আপডেট # 2: উত্সটি খনন করার পরে, মনে হয় 1.4 শাখার কোনও এক সময় $()পরিবর্তিত হয়ে ম্যাচ করা হয়েছিল $([]), যখন 1.3 এ এটির মতো আচরণ হয়েছিল $(document)। এই পরিবর্তন উপরোক্ত ন্যায়বিচারকে আরও শক্তিশালী করবে।


যদিও আমি এর আগে কোডটি কখনও দেখিনি, পুরানো $(document).ready( function(){ //your code here } );
প্রতিভাটি

আমি দ্বিতীয় আপডেটটি বুঝতে পারি না, দয়া করে আরও কিছু ব্যাখ্যা করতে পারেন? আমি পুরানো সংস্করণগুলি অনুসন্ধান করেছি, তবে এই খালি jQuery অবজেক্ট ইস্যুতে কোনও পার্থক্য খুঁজে পাইনি।
জিডোরন মনিকে

@gdoron: আমি থেকে পরিবর্তন মানে selector = selector || documentকরতে if(!selector) return this
জন

4

আমি এটিকে কেবল এই সত্যটিই বলতে পারি যে $()কোনও শূন্য বস্তু ফেরত $(document)দেয় যখন ready()আপনি বিভিন্ন জিনিসগুলিতে প্রয়োগ করেন না ; এটি এখনও কাজ করে, তবে আমি বলব এটি স্বজ্ঞাত নয়।

$(document).ready(function(){}).prop("title") // the title
$().ready(function(){}).prop("title")  //null - no backing document

4
হ্যাঁ, একই উত্তর এই উত্তরে । সুতরাং পরিবর্তনগুলি 1.4 সংস্করণে সংঘটিত হয়েছিল যা নতুন রিটার্ন পলিসি প্রকাশ করেছে।
ভিজিওন

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

আচ্ছা, কোনও দস্তাবেজের বৈশিষ্ট্য বা পদ্ধতির মাধ্যমে শৃঙ্খলাবদ্ধ হতে পারে না$()
অ্যালেক্স কে।

4
@ অ্যালেক্স তাঁর বক্তব্যটি ছিল বাস্তবে কেউই শৃঙ্খলাবদ্ধ না .readyকারণ এটি একটি সুপ্রতিষ্ঠিত মূর্খতা নয়। নিশ্চয়ই কেউ এটি করার কোনও তাত্ত্বিক সুযোগ রয়েছে তবে আমি কোডটি কখনও এটি করতে দেখিনি (এটি ভাল যুক্তি নয় তবে আপনি জানেন: ডি)।
ইসাইলিজা

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

3

সম্ভবত এটি কেবলমাত্র একটি ডকুমেন্টেশন বাগ এবং এটি ঠিক করা উচিত, $().ready(handler)এটির ব্যবহারের একমাত্র নেতিবাচকতা এটি পড়ার যোগ্যতা । অবশ্যই, তর্ক করুন যে $(handler)ঠিক যেমন অপঠনযোগ্য। আমি সম্মত, সে কারণেই আমি এটি ব্যবহার করি না

আপনি তর্ক করতে পারেন যে একটি পদ্ধতি অন্যর চেয়ে দ্রুত। যাইহোক, আপনি একটি পদ্ধতিতে একটি পাতায় একাধিকবার এই পদ্ধতিটিকে কতবার কল করতে পারছেন?

শেষ পর্যন্ত এটি ব্যক্তিগত পছন্দ নেমে আসে। $().ready(handler)পঠনযোগ্যতার আর্গুমেন্ট ব্যতীত অন্যগুলি ব্যবহার করার কোনও খারাপ দিক নেই । আমি মনে করি ডকুমেন্টেশন এক্ষেত্রে মিস-নেতৃস্থানীয়।


+1! আপনি একদম ঠিক বলেছেন! আপনি অফিসিয়াল jQuery উত্তর পড়তে পছন্দ করবেন। আমি উত্তর হিসাবে এটি যোগ।
gdoron মনিকা 24

2

কেবল এটিকে স্পষ্টভাবে স্পষ্ট করে তুলতে যে তিনটিতে কিছুটা অসঙ্গতি রয়েছে, এবং আমি চতুর্থ প্রায়শই ব্যবহৃত ফর্মটি যুক্ত করেছি: (function($) {}(jQuery));

এই মার্কআপ সহ:

<div >one</div>
<div>two</div>
<div id='t'/>

এবং এই কোড:

var howmanyEmpty = $().ready().find('*').length;
var howmanyHandler = $(function() {}).find('*').length;
var howmanyDoc = $(document).ready().find('*').length;
var howmanyPassed = (function($) { return $('*').length; }(jQuery));
var howmanyYuck = (function($) {}(jQuery));
var howmanyYuckType = (typeof howmanyYuck);

$(document).ready(function() {
    $('#t').text(howmanyEmpty + ":" + howmanyHandler + ":" 
        + howmanyDoc + ":" + howmanyPassed + ":" + howmanyYuckType);
});

সর্বশেষ বিবৃতি থেকে ডিভের প্রদর্শিত ফলাফলগুলি: 0: 9: 9: 9: অপরিবর্তিত

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

কৌতুহলকারীদের জন্য এটির একটি ফিডল সংস্করণ এখানে: http://jsfiddle.net/az85G/


আমি দেখতে পাচ্ছি না যে এতে কোন সমস্যা খুঁজে পাওয়া যাচ্ছে না, আপনি jQuery এর জন্য যে প্রসঙ্গটি দিয়েছিলেন nullতা 0.find('*').length ফিরে আসে । আপনি কি এই (স্পষ্ট) আচরণে খারাপ কিছু পেয়েছেন?
gdoron মনিকা

@ জিডোরন - আমি এই আচরণের সাথে খারাপ কিছু দেখতে পাই না, আমি যখন কেবল নির্বাচক থাকি তবে তা শূন্য নয় তার তুলনায় আমি তফাতটি উল্লেখ করতে চেয়েছিলাম - নোট করুন যে এই ফাঁকা নির্বাচক সম্ভবত "দ্রুত" মন্তব্যগুলি কেন উল্লেখ করেছেন? অন্য কোথাও এটি প্রক্রিয়া করার জন্য একটি ছোট অবজেক্ট আছে, কিন্তু একটি বস্তু ফেরত দেয় এবং সেই পরিস্থিতিতে "অপরিজ্ঞাত" নয়। আমি যদিও প্রশ্নটি সত্যই পছন্দ করি এবং এটি উত্সাহিত করেছি :)
মার্ক শুলথিস

এটি দ্রুত হওয়ার কারণ হ'ল কারণ কর্টরের প্রথম "বিরতি" শর্ত হ'ল if(!selector) return thisযদি আপনি অন্য কিছু দেন তবে সেখানে আরও কিছু রয়েছে regexএবং চলছে ... বিনীত শব্দের জন্য ধন্যবাদ ... আমি মনে করি আমি jQuery দলকে জিজ্ঞাসা করতে পারি এর উত্তর দিন (জাহান্নাম, এটি আমার পাঠাগার নয় :-))
জিডোরন মনিকে

হ্যাঁ, আমি কোড বেসের এই বিশেষ অংশটি অধ্যয়ন করেছি না, আমি বাগের জন্য অন্তর্বর্তী সংশোধন করার জন্য কোরটি হ্যাক করেছি তবে এটির সেই অংশটি নয়। আমি jQuery(document).ready(function(){});বর্তমানে আমাদের কোড বেসে ফর্মটি দেখতে পছন্দ করি না কারণ এখানে jQuery দক্ষতার বিভিন্ন স্তর রয়েছে এবং এটি নতুন লোকদের কাছে "সর্বাধিক সুস্পষ্ট" যে এটি jQuery এর জন্য ইভেন্ট হ্যান্ডলার ফাংশন।
মার্ক শুলথেইস

0

আমি মনে করি এটি অন্য যে কোনও কিছুর চেয়ে পঠনযোগ্যতার জন্য সত্যই বেশি।

এই এক হিসাবে অভিব্যক্তিক না

$().ready(handler);

যেমন

$(document).ready(handler)

সম্ভবত তারা কিছু ধরণের idiomatic jQuery প্রচার করার চেষ্টা করছেন।


4
$(document).ready(handler)$(handler)আইএস এর সুপারিশের চেয়ে আরও পঠনযোগ্য ...
জিডোরন মনিকাকে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.