Neden "$ (). Ready (handler)" önerilmiyor?


88

Gönderen jQuery API dosyaları siteye içinready

Aşağıdaki sözdizimlerinin üçü de eşdeğerdir:

  • $ (belge) .ready (işleyici)
  • $ (). ready (işleyici) (bu önerilmez)
  • $ (işleyici)

Ödev yaptıktan sonra - kaynak kodu okuyup oynadıktan sonra, neden olduğuna dair hiçbir fikrim yok

$().ready(handler) 

tavsiye edilmez. Birinci ve üçüncü yollar tamamen aynıdır, üçüncü seçenek, önbelleğe alınmış bir jQuery nesnesinde hazır işlevini şu şekilde çağırır document:

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

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

Ancak hazır işlevinin seçili düğüm öğelerinin seçicisiyle hiçbir etkileşimi yoktur, readyKaynak kodu:

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

Gördüğünüz gibi, geri aramayı dahili bir kuyruğa ( readyList) ekler ve kümedeki öğeleri değiştirmez veya kullanmaz. Bu, readyişlevi her jQuery nesnesinde çağırmanıza izin verir .

Sevmek:

  • normal seçici: $('a').ready(handler) DEMO
  • Anlamsız seçici: $('fdhjhjkdafdsjkjriohfjdnfj').ready(handler) DEMO
  • Tanımsız seçici: $().ready(handler) DEMO

Son olarak soruma: Neden $().ready(handler)tavsiye edilmiyor?


60
@ChaosPandion: Bana göre, kullandığı araçları elinin tersi gibi anlamaya çalışıyor gibi görünüyor. Ben buna boşa harcanan çaba demezdim.
Jon

5
İyi soru. İlgilenen varsa, işte bir performans karşılaştırması ... Bu, (en azından Chrome'da) "önerilmeyen" sürümün aslında en hızlı olduğunu gösterir.
James Allardice

5
Daha iyi bir soru, bunların neden var olduğudur, statik bir yöntem olmalıdır ( $.readyörneğin) ve ilk etapta bir jQuery nesnesi oluşturmayı gerektirmemelidir.
Esailija

2
@Esailija en iyi noktayı ortaya koyuyor. JQuery .ready(), tek tek öğeler için bir tür yetenek sağlamayı planlamadıkça , bir jQuery nesnesi oluşturmak için hiçbir neden olmamalıdır.

2
@ChaosPandion. Bunu kullanamazsınız ... $.readyzaten dahili bir jQuery işlevi tarafından alınmışsa, kaynak kodunu arayın ready:.
gdoron Monica'yı

Yanıtlar:


88

JQuery geliştiricilerinden birinden resmi bir yanıt aldım:

$().ready(fn)sadece $()bir kısayol olduğu için çalışır $(document) (jQuery <1.4)
Bu yüzden $().ready(fn)okunabilir bir koddu.

Ama insanlar $().mouseover()her türden delilik gibi şeyler yaparlardı .
ve insanlar $([])boş bir jQuery nesnesi almak zorunda kaldı

1.4'te değiştirdik, bu yüzden $()boş bir jQuery veriyor ve $().ready(fn)çok fazla kodu kırmamak için çalıştık.

$().ready(fn) tam anlamıyla artık eski durum için düzgün çalışmasını sağlamak için çekirdeğe eklenmiştir.

readyİşlev için en iyi yer $.ready(fn), ama bu gerçekten eski bir tasarım kararı ve şu anda sahip olduğumuz şey bu.


Ona sordum:

$ (Fn) 'nın $ (). Ready (fn)' den daha okunaklı olduğunu düşünüyor musunuz?!

Cevabı şuydu:

Gerçek uygulamalarda her zaman $ (document) .ready (fn) yapıyorum ve genellikle uygulamada yalnızca bir doc ready bloğu var, bu tam olarak bir bakım işi gibi değil.

Bence $ (fn) da oldukça okunamaz , sadece Bilmeniz Gereken Bir Şey Works ™ ...


1
Mantıklı, jQuery geriye dönük
uyumluluk

@Esailija: Bu kadar ciddi olsalardı $(), ilk etapta davranışını değiştirmezlerdi (bu davranış ne kadar aptalca da olabilir) . Öte yandan, haklısın. Değişiklik yapmaya çalıştıklarında gösterildiği gibi, her zaman son derece önemli değişiklikler yapma eğiliminde değiller .attr(), birkaç gün sonra hızlı bir şekilde geri döndüler. Bu onları talihsiz erken (ve orta yaş) tasarım kararlarından bazılarına bağladı.

3
Doğrudan atın ağzından almak için @gdoron +1.

2
Gerçek yanıtı almak için @gdoron +1. Ve evet, algılarımıza oldukça yakındık.
VisioN

" Bu sadece WorksBilmeniz Gereken Bir Şey ..." Evet $(selector[, context])ve öyledir $(html[, ownerDocument]). Aslına bakarsan, sorun, işe yaradığını bilmek jQuery()yerine sadece kullanabilirsin $(). Ya da neden jQuery kullanıyorsunuz?
JAB

11

Farklı seçenekler belirttiğiniz gibi hemen hemen aynı şeyi yaptığından, kütüphane yazar şapkasını takmanın ve bazı tahminlerde bulunmanın zamanı geldi.

  1. Belki jQuery çalışanları $()ileride kullanmak isteyeceklerdir ( $().readytavsiye edilmese bile çalıştığı belgelendiği için şüphelidir ; ayrıca $özel kasalı olsaydı anlamını kirletebilirdi ).

  2. Çok daha pratik nedeni: İkinci versiyon tek kişi olduğunu değil sarma sona documentkodu bakımını yaparken yüzden kırmak için daha kolay. Misal:

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

    Bunu şununla karşılaştır

    // BEFORE
    $().ready(foo);
    
    // AFTER: breaks
    $().ready(foo).on("click", "a", function() {});
    
  3. Yukarıdakilerle ilgili: readyjQuery nesnesi ne olursa olsun (burada olduğu gibi hiçbir şeyi sarmasa bile) aynı şekilde çalışacak (tek?) Yöntem olması anlamında bir ucube. Bu, diğer jQuery yöntemlerinin anlambiliminden büyük bir farktır, bu nedenle özellikle buna güvenmek haklı olarak önerilmez.

    Güncelleme: Esailija'nın yorumunun işaret ettiği gibi, mühendislik açısından bakıldığında readygerçekten statik bir yöntem olmalı çünkü tam da böyle çalışıyor.

Güncelleme # 2: Kaynağa bakarsak, 1.4 dalında bir noktada $()eşleşecek şekilde değiştirilirken $([]), 1.3'te olduğu gibi davrandığı görülüyor $(document). Bu değişiklik yukarıdaki gerekçeleri pekiştirecektir.


Yine de böyle bir kod görmedim, eski deyim şuydu$(document).ready( function(){ //your code here } );
Esailija

İkinci güncellemeyi anlayamadım, biraz daha detaylandırır mısınız lütfen? Eski sürümleri aradım, ancak bu boş jQuery nesnesi sorunu için herhangi bir fark bulamadım.
gdoron Monica'yı

@gdoron: 'den' selector = selector || documente olan değişikliği kastediyorum if(!selector) return this.
Jon

4

Bunun basitçe boş bir nesne $()döndüren gerçeği olduğunu söyleyebilirim, oysa sizin farklı şeylere başvurmanız öyle değildir ; hala çalışıyor, ancak sezgisel olmadığını söyleyebilirim.$(document)ready()

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

1
Evet, bu cevapta da aynı algılar var . Böylece değişiklikler, yeni iade politikası yayınlayan sürüm 1.4'te gerçekleşti.
VisioN

Hazır geri aramayı eklerken belgenin başlığını değiştiren birini hiç görmedim ve bunu jQuery olmadan vanilya js ile yapabilirsiniz . Cevap olmayabilir demiyorum ama bu iyi bir sebep değil.
gdoron Monica'yı

Eh, hiçbir belge özelliği veya yöntemi aracılığıyla zincirleme yapılamaz$()
Alex K.May

2
@AlexK. Demek istediğim, gerçekte kimsenin zincirlemez olmasıydı, .readyçünkü bu iyi kurulmuş bir deyim değil. Elbette birinin bunu yapmasının teorik bir şansı var ama bunu yapan kod görmedim (bu iyi bir argüman değil ama biliyorsunuz: D).
Esailija

2
Belki de bu teorik şans yöntemi nedeniyle, farklı sürümlerde farklı davranışları olduğu için önerilmemektedir .
VisioN

3

Büyük olasılıkla bu sadece bir dokümantasyon hatasıdır ve düzeltilmesi gerekir, kullanmanın tek dezavantajı $().ready(handler)okunabilirliğidir. Elbette, bunun $(handler)da okunamaz olduğunu iddia edin . Katılıyorum, bu yüzden kullanmıyorum .

Ayrıca bir yöntemin diğerinden daha hızlı olduğunu da iddia edebilirsiniz. Ancak, bir farkı fark etmek için bu yöntemi tek bir sayfada arka arkaya ne kadar sıklıkla çağırırsınız?

Sonuçta kişisel tercihlere bağlı. $().ready(handler)Okunabilirlik argümanı dışında kullanmanın bir dezavantajı yoktur . Bence bu durumda dokümantasyon yanlış yönlendiriyor.


+1! Kesinlikle haklıydın! Resmi jQuery cevabını okumayı seveceksiniz. Cevap olarak ekledim.
gdoron, Monica'yı

2

Üçünde bir miktar tutarsızlık olduğunu açıkça belli etmek için, ayrıca dördüncü sık kullanılan biçimi ekledim: (function($) {}(jQuery));

Bu işaretlemeyle:

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

ve bu kod:

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);
});

Son ifadeden div'in görüntülenen sonuçları: 0: 9: 9: 9: tanımsız

Öyleyse, yalnızca İşleyici ve Doküman sürümleri, belge seçiciyi alırken işe yarayan bir şeyi döndürme jQuery kuralıyla tutarlıdır ve Geçti formu ile bir şey döndürmeniz gerekir (Bunu yapmazdım sanırım, ancak "içinde" bir şey olduğunu göstermek için).

İşte meraklılar için bunun keman versiyonu: http://jsfiddle.net/az85G/


Hiçbir şey bulamamasıyla ilgili sorunun ne olduğunu göremiyorum, jQuery için verdiğiniz bağlam o nullkadar 0.find('*').length döndürür . Bu (bariz) davranışta kötü bir şey buluyor musunuz?
gdoron Monica'yı

@gdoron - Bu davranışta kötü bir şey bulamıyorum, sadece boş OLMAYAN bir seçiciye sahip OLMADIĞINDA farka işaret etmek istedim - bu boş seçicinin muhtemelen "daha hızlı" yorumların not edildiğine dikkat edin başka yerde işlenecek daha küçük bir nesneye sahip olduğu için, ancak bu durumda "tanımsız" değil bir nesne DOES döndürür. Yine de soruyu gerçekten beğendim ve oy verdim :)
Mark Schultheiss

Nedeni daha hızlı olmasının nedeni, çünkü ctor'un ilk "kırılma" koşulu, if(!selector) return thisbaşka bir şey verirseniz, vardır regexve başka şeyler oluyor ... Nazik sözler için teşekkürler ... buna cevap ver (cehennem, benim kütüphanem değil :-)).
gdoron Monica'yı

Evet, kod tabanının bu özel bölümünü incelemedim, hatalar için ara düzeltmeler koymak için çekirdeği hackledim ama onun o kısmını değil. jQuery(document).ready(function(){});Farklı jQuery uzmanlığı seviyeleri olduğundan ve jQuery için bir olay işleyici işlevi olduğu yeni insanlar için "en açık" olduğundan, şu anda kod tabanımızda formu görmeyi tercih ediyorum .
Mark Schultheiss

0

Bence bu gerçekten her şeyden çok okunabilirlik için.

Bu o kadar etkileyici değil

$().ready(handler);

gibi

$(document).ready(handler)

Belki de bir tür deyimsel jQuery'yi teşvik etmeye çalışıyorlar.


3
$(document).ready(handler)$(handler)önerilenden daha okunaklı ...
gdoron Monica'yı destekliyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.