2011-03-03 18 views
5

मैं एक jquery प्लगइन का उपयोग कर रहा हूं जो हेडर को एक HTML तालिका पर हल करता है जो मैं उत्पन्न करता हूं। दुर्भाग्य से प्लगइन का प्रदर्शन बहुत धीमी है और मैं निम्नलिखित कोड के लिए नीचे संकुचित है:यह jquery इतनी धीमी क्यों है?

var $tbl = $(this); 
var $tblhfixed = $tbl.find("thead"); 
$tblhfixed.find("th").each(function()  
    $(this).css("width", $(this).width()); 
}); 

यह यानी 2,000 पंक्तियों के साथ एक मेज पर के बारे में 40 सेकंड ले जा रहा है। क्या किसी को पता है कि यह इतना धीमा क्यों है और अधिक महत्वपूर्ण बात यह है कि मैं इसे तेज़ी से कैसे बना सकता हूं? मैंने कई अन्य प्लगइन की कोशिश की है और यह एकमात्र ऐसा है जो काम करता है कि मैं इसे कैसे चाहता हूं। किसी भी मदद के लिए धन्यवाद

+0

टी करता है वह पंक्तियों की संख्या में एक फर्क पड़ता है (क्या आपने इसका परीक्षण किया है)? आप केवल टेबल हेडर में हेरफेर कर रहे हैं। वहां कितने कॉलम हैं? आपको एक खोज के बजाय फ़िल्टर का उपयोग करना चाहिए। http://groups.google.com/group/jquery-en/browse_thread/thread/533451087251c952/9bb31c108c089c4f और http://www.learningjquery.com/2006/12/how-to-get-anything-you-want- भाग -2 –

+1

'यह' क्या है? संदर्भ क्या है? एक http://jsfiddle.net बहुत अच्छा होगा :) –

+0

क्षमा करें, 'यह' उस तालिका का संदर्भ है जिसे मैं प्लगइन लागू कर रहा हूं – nzyme

उत्तर

1

अपराधी शायद .each है।

कारण यह है कि जब आप सामान्य लूप के बजाय .each का उपयोग करते हैं, तो आप प्रत्येक पुनरावृत्ति के लिए एक फ़ंक्शन कॉल करते हैं। इस मामले में फ़ंक्शन कॉल का एक बहुत बड़ा ओवरहेड होता है, क्योंकि प्रत्येक पुनरावृत्ति के लिए एक नया कॉलस्टैक बनाया जाना चाहिए।

यह तेजी से बदल

$tblhfixed.find("th").each(function()  
    $(this).css("width", $(this).width()); 
}); 

को

var elms = $tblhfixed.find("th"); 
for(var i=0, elm;elm = elms[i];i++) { 
    elm.css("width", elm.width()); 
} 
+0

हालांकि सच है, मुझे लगता है कि '.each()' ओवरहेड नगण्य है - बार-बार कॉल की तुलना में '$ (यह)' – Chii

+2

वास्तव में। प्रत्येक ओवरहेड काफी बड़ा है, यहां देखने का प्रयास करें: http: // jsperf। com/jquery-each-vs-for-loop/6 –

+0

'चौड़ाई()' ब्रह्मांड में भी सबसे तेज़ फ़ंक्शन नहीं है, आईआईआरसी, इसलिए मैं भी उस कॉल को कैश कर दूंगा। –

1

आप को दोहराना नहीं चाहिए $(this) अपने कार्य .each() में पारित कर दिया अंदर बनाने के लिए। एक तत्व को लपेटने में गैर-तुच्छ ओवरहेड होता है, जो आपके पास 20k तत्व होने पर ठीक नहीं होता है। आप .each() कॉल के अंदर जितना संभव हो उतना काम खत्म करना चाहते हैं, या इसे पूरी तरह खत्म कर सकते हैं।

इसके अलावा

, क्यों क्वेरी find() दो बार, जब आप इस के बजाय कर सकते हैं, जो आप एक ही परिणाम देना चाहिए:

$ths = $('table thead th'); //or tableid, or something 
$ths.css('width', $ths.width()); 
+0

आप 'th' चौड़ाई को' table' चौड़ाई में क्यों सेट करते हैं? ओपी का कोड क्या नहीं कर रहा है। –

+0

आह मैं कोड को गलत तरीके से पढ़ता हूं - माता-पिता() को – Chii

0

सबसे पहले, आप find() का उपयोग करना चाहिए तभी होता है जब आप सभी नेस्टेड नोड्स के माध्यम से पारित करने की जरूरत है। यहां आप children() का उपयोग कर सकते हैं।

दूसरा, हर बार $(this), jQuery वस्तु का नया उदाहरण बनाता है जब आप इसे एक बार बना सकते हैं:

var $this = $(this); 

हर बार $(this).width() पुनर्गणना की जाती है। सुनिश्चित करें कि आपको इसे पुन: गणना करने की आवश्यकता है। या कार्य करें:

var tableWidth = $this.width(); 

और तीसरा, @Martin Jespersen के अनुसार, प्रत्येक यात्रा function वस्तु बन जाता है।

इसके अलावा आपको यहां jQuery की आवश्यकता नहीं है। आप सीधे डीओएम तक पहुंच सकते हैं:

var tableWidth = ...; // get the table width the way you want 
var thead = this.tHead; 
var thRow = thead.rows[0]; 
for (var i = 0; i < thRow.length; ++i) { 
    thRow.cells[i].style.width = tableWidth + "px"; 
} 
1

मुझे लगता है कि आपको एक ही समस्या का सामना करना पड़ा जो मैंने कुछ समय पहले किया था। इसे "रीकुल्यूलेट लेआउट" या कुछ कहा जाता है।

इस तरह दो छोरों पर इस स्क्रिप्ट को अलग करने, का प्रयास करें:

var $tbl = $(this); 
var $tblhfixed = $tbl.find("thead"); 
var widths = []; 

// 1. 
$tblhfixed.find("th").each(function() 
    widths.push($(this).width()); 
}); 

// 2. 
$tblhfixed.find("th").each(function (index, element) 
    $(this).css("width", widths[index]); 
}); 

पहले एक सब चौड़ाई की गणना करेगा।दूसरा उन्हें वें के

युपीडी पर लागू होंगे: आप 1. और 2 .:

$tblhfixed.hide(); 

के बीच इस कोड को रखकर प्रदर्शन को बढ़ाने और बाद 2 .:

$tblhfixed.show(); 
फिर यह दिखा सकते हैं
+0

पर कॉल करना चाहिए, जिसने वास्तव में मेरी मदद की, हालांकि मुझे पूरी तरह से समझ में नहीं आता है कि वास्तव में मेरा कोड अभी भी धीमा - वास्तव में पहले से तेज क्यों है, लेकिन फिर भी धीमा है। – Graf

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