2010-08-26 12 views
44

में चयनकर्ताओं के बजाय कई चर का उपयोग करने के मुझे पता है कि यह निम्न करने के लिए तेज है हैयह संभव jQuery

$("#header").css({color:"#ff0000"}); 
$("#header a").addClass("foo"); 

क्योंकि jQuery खोजने की जरूरत नहीं है फिर डीओएम में तत्वों के रूप में हमारे पास प्रत्यक्ष संदर्भ है।

var $header_elements = $("#header li"); 
var $footer_elements = $("#footer li"); 

और मैं कुछ jQuery जोड़तोड़ के लिए व्यक्तिगत रूप से दोनों का उपयोग करें:

चलो कहते हैं कि मैं इस किया है कि करते हैं। लेकिन फिर, मुझे दोनों पर कुछ करने की ज़रूरत है। चयनकर्ता का उपयोग करना, मैं यह कर जाएगा:

$("#header li, #footer li").css({color:"#ff0000"}); 

लेकिन फिर, डोम मिलान तत्वों को खोजने के लिए फिर से पार्स किया जाना चाहिए। क्या एक नए चयनकर्ता के बजाय मेरे पहले घोषित चर का उपयोग करने का कोई तरीका है?

$($header_elements + $footer_elements).css({color:"#ff0000"}); 

मुझे लगता है कि चयनकर्ता सरणी या वस्तु किसी तरह का रिटर्न: निम्नलिखित की तरह कुछ (जो नहीं काम कर रहे, मुझे पता है, यह मैं क्या देख रहा हूँ की एक विचार देने के लिए है)। जो मैं खोज रहा हूं वह उनको विलय करने का एक तरीका है। किसी को पता है कि यह संभव है और इसे कैसे करें?

आपकी मदद के लिए धन्यवाद!

उत्तर

58

बस add विधि का उपयोग करें:

$header_elements.add($footer_elements).css({color:'#ff0000'}); 

एक jQuery उद्देश्य यह है कि डोम तत्वों का एक सेट, .add() विधि उन के मिलन से एक नया jQuery वस्तु निर्माण का प्रतिनिधित्व करता है को देखते हुए तत्व और विधि में पारित किए गए हैं। .add() के लिए तर्क बहुत अधिक कुछ भी हो सकता है जो jQuery चयनकर्ता अभिव्यक्ति, संदर्भ डीओएम तत्वों, या एक HTML स्निपेट के संदर्भ में स्वीकार करता है।

+3

या उसके स्रोत उदाहरण उपयोग करने के लिए: '$ header_elements.add ($ footer_elements) .css ({रंग: '# ff0000'});' – gnarf

+0

@gnarf अपडेट किया गया। – GenericTypeTea

+0

शायद मैंने किए गए परीक्षणों के मुकाबले सबसे तेज़ संभावना नहीं है, लेकिन gnarf सही है, यह क्लीनर दिखता है और यदि दो "सेट" के बीच डुप्लीकेट होते हैं, तो इसका ख्याल रखेगा। धन्यवाद! – Gabriel

2

यह प्रदर्शन कोई प्रभाव नहीं पड़ेगा बुद्धिमान मौसम तुम जैसे (भले ही वह काम किया) कुछ करना होगा:

$($header_elements + $footer_elements).css({color:"#ff0000"}); 

या उन्हें अलग से कार्य करें:

$($header_elements).css({color:"#ff0000"}); 
$($footer_elements).css({color:"#ff0000"}); 

jQuery के रूप में आंतरिक रूप से जाना होगा each() का उपयोग कर आपूर्ति किए गए तर्कों के माध्यम से।

सिद्धांत अधिक DRY प्रेरित, प्रदर्शन की तुलना में बुद्धिमान, आप एक समारोह बना सकते हैं यह है:

function makeThemRed(el) {el.css({color:"#ff0000"})} 

और फिर

makeThemRed($header_elements); 
makeThemRed($footer_elements); 

या यहाँ तक कि:

function makeThemRed() 
{ 
    var l=arguments.length, 
     o=0; 
    while (o<l) { 
     arguments[o++].css({color:"#ff0000"}) 
    } 
} 

और उसके बाद

makeThemRed($header_elements, $footer_elements); //any number of parameters 
4

संदर्भ की एक सरणी दर्रा:

$([$header_elements, $footer_elements]).css({color:"#ff0000"}); 
+4

यह मेरा दृष्टिकोण होगा, लेकिन आप सरणी में jQuery ऑब्जेक्ट्स को पास नहीं कर सकते हैं। आपको डोम तत्वों को पास करने की आवश्यकता है। '$ ([$ header_elements [0], $ footer_elements [0]])' – user113716

15

मैं कुछ ही मिनटों के इस पोस्ट करने के बाद समाधान मिल गया। जो लोग सोच रहे हैं, उनके लिए यहां है:

$.merge($header_elements, $footer_elements).css({color:"#ff0000"}); 

क्या यह तेज़ है? मुझे अभी तक पता नहीं है, मुझे पता लगाने के लिए कुछ परीक्षण चलाने की आवश्यकता होगी।

संपादित करें:

मैं जे एस फिडल यहाँ के साथ यह परीक्षण किया: http://jsfiddle.net/bgLfz/1/

मैं दोनों चयनकर्ता के लिए चयनकर्ता हर बार, चर का उपयोग कर परीक्षण, $ .merge साथ चर() और .add का उपयोग कर()। प्रत्येक परीक्षण 1000 बार चलाया गया था। मेरी तरफ

परिणाम इस प्रकार (धीमा करने के लिए तेजी से से) कर रहे हैं:

  1. $ .merge() (7ms की औसत)
  2. का उपयोग अन्य (10ms की औसत के बाद दोनों चर एक का उपयोग करना है, लेकिन कोड .add का उपयोग करना() (16ms की औसत)
  3. चयनकर्ताओं हर बार का उपयोग करना (295ms की औसत)
+1

यह निश्चित रूप से धीमा होगा क्योंकि jquery को चरों को मर्ज करना होगा और फिर भी उन्हें 'प्रत्येक' के साथ जाना होगा। – raveren

+1

मर्ज सीधे '$ header_elements' में जोड़ देगा हालांकि ... इसमें '$ footer_elements' भी शामिल है – gnarf

+1

कुछ सरल प्रदर्शन परीक्षण के लिए http://jsperf.com/adding- चयनकर्ता देखें ... यह भी ध्यान दें कि फ़ंक्शन' जोड़ें() 'अधिक समय लेता है, लेकिन यह क्लीनर भी दिखता है, और संभावित डुप्लिकेट हटा देता है :) – gnarf

0

आप cou दोहराया होने की जरूरत है)

  • ld हमेशा एक चर के सभी तत्वों का सेट:

    var $lis = $('#header li, #footer li'); 
    $($lis).css({color:"#ff0000"}); 
    
  • +0

    यह वही है जो ओपी ने कहा था कि वे ** ** नहीं करना चाहते थे। – GenericTypeTea

    11

    आप उपयोग कर सकते हैं add या merge विधि:
    जोड़े

    $header_elements.add($footer_elements).css({color:'#f00'}); 
    

    मर्ज

    $.merge($header_elements, $footer_elements).css({color:"#f00"}); 
    

    दोनों काम , लेकिन जोड़ अधिक प्रदर्शन है। enter image description here स्रोत:http://jsperf.com/add-vs-merge

    क्रेडिट: मैं @GenericTypeTea और @Gabriel जवाब upvoted, उन्हें तुलना में और यहाँ परिणाम है, दोनों का एक सारांश था।

    1

    'विलय' का उपयोग करने वाली बात यह है कि यह केवल दो चयनकर्ताओं तक ही सीमित है, और 'एड' का उपयोग करके यह दो से अधिक है, इसलिए यदि यह दो से अधिक है, तो आपको इस तरह 'प्रत्येक' का उपयोग करना चाहिए :

    $([selector1, selector2, selector3, .....etc]).each(function(){ 
        // your code here 
    }); 
    
    +0

    यदि आप पोस्ट किए जाने के लगभग 4 साल बाद किसी प्रश्न का उत्तर देने जा रहे हैं, तो आपको पूरी तरह से यह सुनिश्चित करना चाहिए कि आप वास्तव में प्रश्न का सही जवाब दे रहे हैं और आपका समाधान पहले से स्वीकृत एक से बेहतर है। आपका उत्तर मूल प्रश्न का उत्तर देने के करीब भी नहीं है। – Gabriel

    +1

    मैंने सोचा कि "मूल प्रश्न" किसी भी तरह jquery से संबंधित है;): डी –

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