2012-04-26 11 views
6

jQuery ile yeterlilik konusunda 7 veya 8 civarında bir olasılık var (1-10 ölçekli), bu yüzden emin değilim Bu bile mantıklı, ama jQuery işlevi veya jQuery bir dalı sadece belirli bir koşul doğruysa çalıştırılacak bir izin veren bir eklenti bilen varsa bilmek istiyorum. Aksi takdirde, ben birileri biri buna benzer normal JavaScript sözdizimi kullanılarak çeşitli olayların eki kontrol edebilecek iken kavramı bazı yolu (o kusurludur nasılEDIT'e ve )jQuery zincirinin bir dalını gerçekleştirmenin bir yolu yalnızca bir koşul doğruysa

kusurludur düşünürse duymak isteriz: orada jQuery hepsini yapmanın bir yolu olup olmadığını veya

var desiredElement = $('.parent')      // find the parent element 
        .hover(overFunction,offFunction) // attach an event while I've got the parent in 'scope' 
        .find('.child-element');   // then find and return the child 
if (booleanVar1) {          // if one condition 
    desiredElement.click(clickFunction1);    // attach one event 
} else if (booleanVar2) {        // or if a different condition 
    desiredElement.click(clickFunction2);    // attach a different event 
} else {             // otherwise 
    desiredElement.click(clickFunction3);    // attach a default event 
} 
$('.parent').find('.other-child')      // (or $('.parent .other-child') 
    .css(SomePredefinedCssMapping) 
    .hide() 
//... 

merak ediyorum iyi bir neden varsa değil ... belki böyle bir şey:

$('.parent')        // find the parent element 
    .hover({overFunction,offFunction})  // attach an event while I've got the parent in 'scope' 
    .find('.child-element')     // then find the child 
     .when(booleanVar1)     // if one condition 
      .click(clickFunction1)   // attach one event 
     .orWhen(booleanVar2)    // or if a different condition 
      .click(clickFunction2)   // attach a different event 
     .orElse()       // otherwise 
      .click(clickFunction3)   // attach a default event 
     .end() 
    .end() 
    .find('.other-child') 
     .css(SomePredefinedCssMapping) 
//... 

Not: (Bu, sözdizimsel olarak doğru Boolean varsayarak ve işlevleri uygun tanımlanır düşünüyorum, ama ben çok net bir şekilde

önerdi jQuery bana biraz daha derli toplu görünüyor genelinde niyet kazanılmış epey eminim ??) Kabul etmek reddetmek? - işte benim sorularım:

  • Temel olarak zaten bunu yapan yerel jQuery'nin bir parçası var mı?
  • Bu tür bir şeye izin veren bir uzantı var mı?
  • Düşünmek benden daha mı zor? (Eğer koşul doğruysa boş bir öğenin ayarlanması, eğer or koşulu için öğenin geri ayarlanmasına neden olacaksa, geçerli öğenin ayarlanması gibi bir şey düşünürdüm, tıpkı end() yönteminin geri dönmesi gibi find() arandığında önceki set)
  • Bunu önemli ölçüde daha az verimli yapan bir şey var mı?

DÜZENLEME

soru yöntemi zincirleme ile bunu yoksa unadvisable olacağını niçin (özelliklerini tercih) nasıl sorar. Alternatifler istemezken, jQuery zincirleme yaklaşımıyla ilgili sorunları açıklamak için bu tür alternatifler gerekebilir. Ayrıca, yukarıdaki örnek hemen booleanları değerlendirdiğinden, başka bir çözüm de aynı şeyi yapmalıdır.

+2

kesinlikle bir yere bunun için bir eklenti var, ben daha önce jQuery forumlarda cevap olarak yayınlanmıştır gördüm. Bu tür bir sözdizimine katılmıyorum, ancak kodlamayı daha kolay hale getirmeyen bir şey için daha fazla işlev çağrısında bulunuyor. –

+5

Bu sadece –

+0

dehşet verici iken, EVERYONE'nin yorumunu takdir ediyorum (özellikle de katılıyorum - eminim katılıyorum), hala sorularımın herhangi birine gerçek bir cevap görmüyorum, bu yüzden bir süre dayanacağım Daha uzun –

cevap

2
$('.parent').hover(overFunction,offFunction) 
    .find('.child-element') 
    .click(booleanVar ? clickFunction1 : 
      booleanVar2 ? clickFunction2 : 
      clickFunction3) 
    .end() 
    .find('.other-child') 
    .css(SomePredefinedCssMapping) 
+0

Teşekkürler! Bu, bulmayı umduğum şeye daha yakın görünüyor ve işe yarayacak kadar iyi olabilir. Ben bu taktiği önledim inanıyorum çünkü benzer bir girişimi "ilişkilendirici diziler" css selektörleri berbat çünkü (gibi ... css ({(boolVar? "Sol": "sağ"): "30px"}) 'neden olur hata). Bu booleanlar derhal değerlendirmek gerekir ama hala _think_ jQuery zincirleme olurdu gibi oldukça güzel "değil" - işe yarıyor ve daha iyi bir cevap yok, ben bir noktada kabul edeceğim –

+0

@CodeJockey Right. Çünkü sözdizimsel olarak geçersizdir ([başvuru] (http: //es5.github.com#x11.1.5)). Bu kod, OP'de düşündüğünüz gibi çalışır ve çok daha kısadır. – Esailija

+0

@CodeJockey btw, '.hover ({overFunction, offFunction})' sözdizimsel olarak geçersizdir (OP'nizde görünür, cevabımdaki çalışma kodunu düzenledim) – Esailija

2

Bu koşullu mantığı işleyiciniz içinde gerçekleştiremediniz mi?

var boolVar1 = true, 
    boolVar2 = false; 

$(".foo").on("click", function(){ 
    if (boolVar1) clickFunction1(); 
    if (boolVar2) clickFunction2(); 
}); 
+0

Cevabınız için teşekkürler - Ben bunu düşünmemiştim - Küçük bir miktar "saf" JavaScript almamasına rağmen (her şeyden önce, daha verimli olmalı - değil mi?) Soru jQuery zincirleme kullanımını sorgular - ya yerel jQuery, bir eklenti, ya da bir neden daha zor kendi başıma yapmak için ya da önemli bir fikrin yapılması. Ayrıca, soru, click olayı oluşana kadar gecikme yapılmayan boole değişkenlerinin _immediate_ değerlendirmesinin güçlü bir çıkarımına sahiptir - değişkenler tıklamadan önceki herhangi bir nedenden dolayı değişirse, bu davranış değiştirecektir - Bu açık –

+1

yapmak için düzenleyeceğim @rlemon - jQuery'nin bir kütüphane olduğunu ve '$()' işlevinin çok fazla şey yaptığını takdir ediyorum. "Gelişim zamanı/verimlilik" ticareti her zaman göz önünde bulundurulması gereken makul bir şeydir ve temel OP örneğinde, geliştirme süresinde büyük bir fark yoktur - belki de bu yüzden jQuery'ye eklememişlerdir (bir tasarruf için yeterli değildir) Gerekli olan ek işlemleri haklı çıkarmak için mi?) Ancak, bu cevap bu yanıtın bir parçası değildir ve bu cevap, sorudaki temel kuraldan farklı şekilde davranacaktır. –

+0

temelde jQuery için ifadeler soruyorsunuz ... – rlemon

İlgili konular