2012-04-26 19 views
6

मैं शायद jQuery के साथ प्रवीणता पर 7 या 8 के बारे में हूं (1-10 के पैमाने पर), इसलिए मुझे यकीन नहीं है कि यह भी समझ में आता है, लेकिन मैं जानना चाहता हूं कि कोई भी jQuery फ़ंक्शन या संभावित रूप से एक प्लगइन के बारे में जानता है जो किसी दिए गए शर्त को सत्य होने पर jQuery की शाखा को केवल निष्पादित करने की अनुमति देता है। अन्यथा, मैं किसी को सोचता है कि अगर एक सामान्य JavaScript वाक्य रचना इस के समान का उपयोग कर विभिन्न घटनाओं की कुर्की को नियंत्रित कर सकता है जबकि अवधारणा किसी तरह (संपादित और कैसे यह दोषपूर्ण है)क्या कोई शर्त सही है, तो jQuery चेनिंग की शाखा को करने का कोई तरीका है

में त्रुटिपूर्ण जानकर अच्छा लगेगा:

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() 
//... 

मैं अगर वहाँ यह सब jQuery में करने के लिए एक रास्ता है या सोच रहा था अगर वहाँ एक अच्छा कारण है नहीं करने के लिए ... शायद कुछ इस तरह:

$('.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) 
//... 

नोट: मुझे लगता है कि इस वाक्य रचना सही है, बूलियन्स संभालने और कार्यों को उचित रूप से परिभाषित कर रहे हैं, लेकिन मैं यकीन है कि मैं बहुत स्पष्ट रूप से

प्रस्तावित jQuery मेरे लिए थोड़ा neater लगता भर में आशय मिल गया हूँ (??) सहमत असहमत? - तो यहां मेरे प्रश्न हैं:

  • क्या मूल jQuery का कुछ हिस्सा है जो मूल रूप से पहले से ही करता है?
  • क्या वहां कोई एक्सटेंशन पहले से मौजूद है जो इस प्रकार की चीज़ को अनुमति देता है?
  • क्या मैं सोच रहा हूं उससे करना मुश्किल है? (मुझे लगता है कि यदि स्थिति सत्य है, तो मौजूदा तत्व सेट को रखने की तरह कुछ लगता है, यदि स्थिति गलत है, तो खाली तत्व सेट को दबाकर, प्रत्येक or स्थिति के लिए तत्व सेट को वापस पॉप करना, ऐसा होगा, जैसे कि end() विधि वापस पॉप find() कॉल के बाद पिछला सेट)
  • क्या ऐसा कुछ है जो इसे कम कुशल बनाता है?

संपादित

सवाल यह है कि विधि श्रृंखलन के साथ ऐसा करना या कारण है कि यह unadvisable होगा (विशेष प्राथमिकता दी) पूछता है। हालांकि यह विकल्पों के लिए नहीं पूछता है, ऐसे में एक jQuery चेनिंग दृष्टिकोण के साथ समस्याओं को समझाने के लिए ऐसे विकल्प आवश्यक हो सकते हैं। इसके अलावा, चूंकि उपर्युक्त उदाहरण तुरंत बूलियन का मूल्यांकन करता है, इसलिए किसी भी अन्य समाधान को वही करना चाहिए।

+2

निश्चित रूप से इसके लिए एक प्लगइन कहीं भी नहीं है, मैंने देखा है यह पहले jQuery मंचों में एक जवाब के रूप तैनात। मैं इस तरह के वाक्यविन्यास से सहमत नहीं हूं, हालांकि, यह किसी ऐसी चीज़ के लिए अधिक फ़ंक्शन कॉल जोड़ रहा है जो आवश्यक रूप से कोडिंग को आसान नहीं बनाता है। –

+5

यह सिर्फ –

+0

भयानक है जबकि मैं हर किसी की टिप्पणी की सराहना करता हूं (विशेष रूप से @ tereško - हालांकि मुझे यकीन नहीं है कि मैं सहमत हूं), मुझे अभी भी मेरे किसी भी प्रश्न का वास्तविक उत्तर नहीं दिख रहा है, इसलिए मैं थोड़ी देर तक रहूंगा अधिक –

उत्तर

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

धन्यवाद! यह उस भावना के करीब आता है जो मैं ढूंढने की उम्मीद कर रहा था, और काम करने के लिए पर्याप्त हो सकता है। मेरा मानना ​​है कि मैंने इस रणनीति से परहेज किया था क्योंकि इसी तरह के प्रयास ने "सहयोगी सरणी" में सीएसएस चयनकर्ताओं को गड़बड़ कर दिया था (जैसे कि ... ... सीएसएस ({(बूलवार? "बाएं": "दाएं"): "30 पीएक्स"}) 'कारण बनता है त्रुटि)। इसमें बूलियन का तत्काल मूल्यांकन होना चाहिए, लेकिन अभी भी "सुंदर" नहीं है क्योंकि मैं _think_ jQuery चेनिंग होगा - यह मानते हुए कि यह काम करता है, और कोई बेहतर जवाब नहीं है, मैं इसे किसी बिंदु पर –

+0

@CodeJockey दाएं स्वीकार करूंगा। ऐसा इसलिए है क्योंकि यह वाक्य रचनात्मक रूप से अमान्य है ([संदर्भ] (http: //es5.github.com#x11.1.5))। यह कोड काम करता है जैसे आप ओपी में इरादा रखते हैं, और यह भी अधिक संक्षेप में है। – Esailija

+0

@CodeJockey btw, '.hover ({overFunction, offFunction})' वाक्य रचनात्मक रूप से अमान्य है (यह आपके ओपी में दिखाई देता है, मैंने इसे अपने उत्तर में कार्य कोड में संपादित किया है) – Esailija

2

क्या आप अपने हैंडलर के भीतर उस सशर्त तर्क को नहीं कर सके?

var boolVar1 = true, 
    boolVar2 = false; 

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

आपकी प्रतिक्रिया के लिए पहला धन्यवाद - मैंने यह नहीं माना था - जबकि मुझे "शुद्ध" जावास्क्रिप्ट की थोड़ी सी मात्रा नहीं है (यह सब के बाद, अधिक कुशल होना चाहिए - सही?) सवाल विशेष रूप से jQuery चेनिंग के उपयोग से पूछताछ करता है - या तो मूल jQuery, एक प्लगइन, या किसी कारण से यह कठिन है करने के लिए या अपने आप को करने के लिए काफी बुरा विचार करने के लिए। इसके अलावा प्रश्न में बुलियन वैरिएबल के _immediate_ मूल्यांकन का एक मजबूत प्रभाव है, क्लिक घटना होने तक देरी नहीं होती है - यदि क्लिक से पहले किसी भी कारण से चर बदल जाता है, तो यह व्यवहार बदल जाएगा - मैं यह स्पष्ट –

+1

बनाने के लिए संपादित करूंगा @ ड्रमोन - मैं सराहना करता हूं कि jQuery एक पुस्तकालय है और '$() 'फ़ंक्शन बहुत सी चीजें करता है। "विकास समय/दक्षता" व्यापार बंद हमेशा प्राथमिक ओपी उदाहरण पर विचार करने के लिए एक उचित बात है, विकास समय में कोई बड़ा अंतर नहीं है - शायद यही कारण है कि उन्होंने इसे jQuery में नहीं जोड़ा (बचत की पर्याप्त नहीं अतिरिक्त प्रसंस्करण की आवश्यकता को न्यायसंगत बनाने के लिए?) हालांकि, यह इस उत्तर का हिस्सा नहीं है, और यह उत्तर मौलिक स्तर पर प्रश्न के कोड से अलग व्यवहार करेगा। –

+0

आप मूल रूप से jQuery के लिए पूछ रहे हैं अगर बयान ... – rlemon

संबंधित मुद्दे