मैं jQuery के साथ एक परियोजना शुरू कर रहा हूं।
आपके jQuery प्रोजेक्ट में क्या नुकसान / गलतियाँ / गलतफहमी / गालियाँ / गलतियाँ थीं?
मैं jQuery के साथ एक परियोजना शुरू कर रहा हूं।
आपके jQuery प्रोजेक्ट में क्या नुकसान / गलतियाँ / गलतफहमी / गालियाँ / गलतियाँ थीं?
जवाबों:
प्रदर्शन से अनजान होने के नाते और स्थानीय चरों को उन्हें सौंपने के बजाय चयनकर्ताओं पर अधिक प्रभाव डाला। उदाहरण के लिए:-
$('#button').click(function() {
$('#label').method();
$('#label').method2();
$('#label').css('background-color', 'red');
});
बजाय:-
$('#button').click(function() {
var $label = $('#label');
$label.method();
$label.method2();
$label.css('background-color', 'red');
});
या जंजीर से भी बेहतर : -
$('#button').click(function() {
$("#label").method().method2().css("background-color", "red");
});
मुझे यह मिल गया ज्ञानवर्धक क्षण जब मुझे एहसास हुआ कि कॉल स्टैक कैसे काम करता है।
संपादित करें: टिप्पणियों में शामिल सुझाव।
var $label = $('#label');
संदर्भ का उपयोग करने का तरीका समझें। आम तौर पर, एक jQuery चयनकर्ता पूरे डॉक्टर की खोज करेगा:
// This will search whole doc for elements with class myClass
$('.myClass');
लेकिन आप एक संदर्भ में खोज करके चीजों को गति दे सकते हैं:
var ct = $('#myContainer');
// This will search for elements with class myClass within the myContainer child elements
$('.myClass', ct);
[0] । $('.myClass', ct);या यदि आप जानते हैं सीटी jQuery का एक उदाहरण आप उपयोग कर सकते हैं लगता हैct.find(".myClass")
इस तरह नंगे वर्ग के चयनकर्ताओं का उपयोग न करें:
$('.button').click(function() { /* do something */ });
यह हर एक तत्व को देखने के लिए समाप्त होगा अगर यह "बटन" की एक कक्षा है।
इसके बजाय, आप इसकी मदद कर सकते हैं, जैसे:
$('span.button').click(function() { /* do something */ });
$('#userform .button').click(function() { /* do something */ });
मैंने यह पिछले साल रेबेका मर्फी के ब्लॉग से सीखा था
अपडेट - यह उत्तर 2 साल पहले दिया गया था और यह jQuery के वर्तमान संस्करण के लिए सही नहीं है । टिप्पणियों में से एक में यह साबित करने के लिए एक परीक्षण शामिल है। परीक्षण का एक अद्यतन संस्करण भी है जिसमें इस उत्तर के समय jQuery का संस्करण शामिल है।
$('.b')इसका उपयोग कर सकता document.getElementsByClassName('b')है, लेकिन ऐसा $('a.b')करने से वर्ग के साथ सभी मिलान तत्व मिलेंगे bऔर फिर पुष्टि करेंगे कि वे दो चरण के ऑपरेशन में एंकर हैं। उत्तरार्द्ध मुझे और अधिक काम की तरह लगता है। एक वास्तविक जीवन सादृश्य के लिए, यह कोशिश करें: मेरे कमरे में सभी मोज़े खोजें। अब, जो मेरे ड्रेसर में नहीं हैं उन्हें बाहर फेंक दो।
अनाम कार्यों को विभाजित करने का प्रयास करें ताकि आप उनका पुन: उपयोग कर सकें।
//Avoid
$('#div').click( function(){
//do something
});
//Do do
function divClickFn (){
//do something
}
$('#div').click( divClickFn );
(anonymous)। इस टिप को यहाँ और पढ़ें: stackoverflow.com/questions/182630/jquery-tips-and-tricks/…
मैंने डॉक रेडी स्टेटमेंट के अंदर कोड की सैकड़ों लाइनें देखी हैं। बदसूरत, अपठनीय और असंभव बनाए रखने के लिए।
सर्वर के $.ajaxलिए अजाक्स अनुरोधों के लिए फ़ंक्शन का उपयोग करते समय , आपको completeप्रतिक्रिया डेटा को संसाधित करने के लिए घटना का उपयोग करने से बचना चाहिए । यह आग लगाएगा कि अनुरोध सफल था या नहीं।
इसके बजाय complete, उपयोग करें success।
डॉक्स में अजाक्स इवेंट देखें ।
मान लीजिए कि आप एक अनुच्छेद पर क्लिक करके उसे गायब करना चाहते हैं। आप बाद में DOM से तत्व को हटाना भी चाहते थे। आप सोच सकते हैं कि आप बस विधियों की श्रृंखला बना सकते हैं:
$("p").click(function(e) {
$(this).fadeOut("slow").remove();
});
इस उदाहरण में, .remove () को .fadeOut () पूरा करने से पहले, आपके क्रमिक-लुप्त होती प्रभाव को नष्ट करने और बस तत्व को तुरंत गायब कर दिया जाएगा। इसके बजाय, जब आप केवल पिछले खत्म करने पर एक कमांड फायर करना चाहते हैं, तो कॉलबैक का उपयोग करें:
$("p").click(function(e){
$(this).fadeOut("slow", function(){
$(this).remove();
});
});
.FadeOut () का दूसरा पैरामीटर एक अनाम फ़ंक्शन है जो .fadeOut () एनीमेशन पूरा होने के बाद एक बार चलेगा। यह क्रमिक लुप्त होती, और तत्व के बाद के हटाने के लिए बनाता है।
यदि आप एक ही घटना को कई बार बांधते हैं (तो) यह कई बार आग लगा देगा। मैं आमतौर पर हमेशा unbind('click').bind('click')सुरक्षित रहने के लिए जाता हूं
प्लग-इन का दुरुपयोग न करें।
अधिकांश समय आपको केवल लाइब्रेरी और उपयोगकर्ता इंटरफ़ेस की आवश्यकता होगी। यदि आप इसे सरल रखते हैं तो आपका कोड लंबे समय में बनाए रखा जा सकेगा। सभी प्लग-इन समर्थित और अनुरक्षित नहीं हैं, वास्तव में अधिकांश नहीं हैं। यदि आप कोर तत्वों का उपयोग करके कार्यक्षमता की नकल कर सकते हैं तो मैं दृढ़ता से इसकी सिफारिश करता हूं।
प्लग-इन आपके कोड में सम्मिलित करना आसान है, आपको कुछ समय बचाता है, लेकिन जब आपको अतिरिक्त कुछ की आवश्यकता होगी, तो उन्हें संशोधित करना एक बुरा विचार है, क्योंकि आप संभावित अपडेट खो देते हैं। जिस समय आप शुरुआत में बचत करते हैं, आप बाद में हटाए गए प्लग-इन को बदल देंगे।
उस प्लग-इन का चयन करें जिसका आप बुद्धिमानी से उपयोग करते हैं। लाइब्रेरी और यूजर इंटरफेस के अलावा, मैं लगातार $ .cookie , $ .form , $ .validate और thickbox का उपयोग करता हूं । बाकी के लिए मैं ज्यादातर अपना प्लग-इन विकसित करता हूं।
नुकसान: चयनकर्ताओं के बजाय छोरों का उपयोग करना।
यदि आप स्वयं को jQuery '.each' विधि के लिए डोम तत्वों पर पुनरावृत्त करने के लिए पहुँच रहे हैं, तो अपने आप से पूछें कि क्या इसके बजाय तत्वों को प्राप्त करने के लिए चयनकर्ता का उपयोग कर सकते हैं।
JQuery के चयनकर्ताओं के बारे में अधिक जानकारी:
http://docs.jquery.com/Selectors
नुकसान: फायरबग जैसे उपकरण का उपयोग नहीं करना
इस तरह के डिबगिंग के लिए फायरबग व्यावहारिक रूप से बनाया गया था। अगर आप जावास्क्रिप्ट के साथ DOM के बारे में मॉकिंग करने जा रहे हैं, तो आपको विजिबिलिटी देने के लिए फायरबग जैसे अच्छे टूल की जरूरत है।
Firebug पर अधिक जानकारी: http://getfirebug.com/
पॉलीमॉर्फिक पॉडकास्ट के इस एपिसोड में अन्य महान विचार हैं: (डेव वार्ड के साथ jQuery रहस्य) http://polymorphicpodcast.com/shows/jquery/
इस पहचानकर्ता को सही संदर्भ में उपयोग करने की गलतफहमी। उदाहरण के लिए:
$( "#first_element").click( function( event)
{
$(this).method( ); //referring to first_element
$(".listOfElements").each( function()
{
$(this).someMethod( ); // here 'this' is not referring first_element anymore.
})
});
और यहाँ एक नमूना है कि आप इसे कैसे हल कर सकते हैं:
$( "#first_element").click( function( event)
{
$(this).method( ); //referring to first_element
var $that = this;
$(".listOfElements").each( function()
{
$that.someMethod( ); // here 'that' is referring to first_element still.
})
});
पूरे DOM पर कई बार सर्च करने से बचें। यह कुछ ऐसा है जो वास्तव में आपकी स्क्रिप्ट में देरी कर सकता है।
खराब:
$(".aclass").this();
$(".aclass").that();
...
अच्छा:
$(".aclass").this().that();
खराब:
$("#form .text").this();
$("#form .int").that();
$("#form .choice").method();
अच्छा:
$("#form")
.find(".text").this().end()
.find(".int").that().end()
.find(".choice").method();
हमेशा एक सार्थक चर में $ (इस) को कैश करें (विशेषकर)
ऐशे ही
$(selector).each(function () {
var eachOf_X_loop = $(this);
})
$selfया $thisयदि आप एक अच्छा चर नाम के बारे में सोचने के लिए आलसी हैं।
आयोजन
$("selector").html($("another-selector").html());
किसी भी घटना का क्लोन नहीं करता है - आपको उन सभी को विद्रोह करना होगा।
जेपी के कम टी-क्लोन () के अनुसार यदि आप सच पास करते हैं, तो घटनाओं का खंडन करते हैं।
एक ही jQuery वस्तुओं के कई निर्माण से बचें
//Avoid
function someFunc(){
$(this).fadeIn();
$(this).fadeIn();
}
//Cache the obj
function someFunc(){
var $this = $(this).fadeIn();
$this.fadeIn();
}
$this = $(this);एक अलग लाइन पर होना अधिक पठनीय है । यदि आप (एक गड़बड़ किए बिना) कर सकते हैं, तो $thisसब कुछ और बस श्रृंखला के बारे में भूल जाओ :$(this).fadeIn().fadeIn();
मैं इसे जावास्क्रिप्ट के लिए भी कहता हूं, लेकिन jQuery, जावास्क्रिप्ट को सीएसएस को बदलना चाहिए।
यह भी सुनिश्चित करें कि जावास्क्रिप्ट के साथ किसी के लिए साइट प्रयोग करने योग्य है (बंद आज के रूप में प्रासंगिक नहीं है दिन में, लेकिन हमेशा पूरी तरह से उपयोग करने योग्य साइट के लिए अच्छा है)।
बहुत सारे DOM जोड़तोड़ करना। जबकि ब्राउज़र। सौंपने और फिर से रेंडर करने के तरीके के कारण .html (), .append (), .prepend (), इत्यादि तरीके बहुत अच्छे हैं, फिर भी अक्सर इनका उपयोग करने से मंदी आ जाएगी। Html को एक स्ट्रिंग के रूप में बनाना बेहतर है, और DOM को कई बार बदलने के बजाय इसे एक बार DOM में शामिल करना है।
के बजाय:
var $parent = $('#parent');
var iterations = 10;
for (var i = 0; i < iterations; i++){
var $div = $('<div class="foo-' + i + '" />');
$parent.append($div);
}
इसे इस्तेमाल करे:
var $parent = $('#parent');
var iterations = 10;
var html = '';
for (var i = 0; i < iterations; i++){
html += '<div class="foo-' + i + '"></div>';
}
$parent.append(html);
या यहां तक कि यह ($ रैपर एक नया बनाया गया तत्व है जो अभी तक DOM को इंजेक्ट नहीं किया गया है। इस रैपर div में नोड्स लगाने से मंदी नहीं होती है, और अंत में हम केवल एक DOM का उपयोग करके $ रैपर को $ पेरेंट के लिए जोड़ देते हैं। ):
var $parent = $('#parent');
var $wrapper = $('<div class="wrapper" />');
var iterations = 10;
for (var i = 0; i < iterations; i++){
var $div = $('<div class="foo-' + i + '" />');
$wrapper.append($div);
}
$parent.append($wrapper);
ASP.NET परियोजनाओं में नियंत्रण की "वास्तविक" आईडी प्राप्त करने के लिए ClientID का उपयोग करना।
jQuery('#<%=myLabel.ClientID%>');
इसके अलावा, यदि आप SharePoint के अंदर jQuery का उपयोग कर रहे हैं, तो आपको jQuery.noConflict () को कॉल करना होगा।
कार्यों के लिए jQuery वस्तुओं के बजाय आईडी पास करना:
myFunc = function(id) { // wrong!
var selector = $("#" + id);
selector.doStuff();
}
myFunc("someId");
एक लिपटे सेट पास करना कहीं अधिक लचीला है:
myFunc = function(elements) {
elements.doStuff();
}
myFunc($("#someId")); // or myFunc($(".someClass")); etc.
जंजीर का अत्यधिक उपयोग।
यह देखो:
this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);
स्ट्रिंग्स संचायक-शैली का उपयोग करें
+ ऑपरेटर का उपयोग करके मेमोरी में एक नया स्ट्रिंग बनाया जाता है और समवर्ती मान उसे सौंपा जाता है। इसके बाद ही परिणाम एक चर को सौंपा गया है। संघनन परिणाम के लिए मध्यवर्ती चर से बचने के लिए, आप सीधे + = ऑपरेटर का उपयोग करके परिणाम असाइन कर सकते हैं। धीरे:
a += 'x' + 'y';
और तेज:
a += 'x';
a += 'y';
फ़ंक्शन कॉल की तुलना में आदिम संचालन अधिक तेज़ हो सकता है
प्रदर्शन महत्वपूर्ण कॉल और कार्यों में फ़ंक्शन कॉल पर वैकल्पिक आदिम संचालन का उपयोग करने पर विचार करें। धीरे:
var min = Math.min(a, b);
arr.push(val);
और तेज:
var min = a < b ? a : b;
arr[arr.length] = val;
जावास्क्रिप्ट प्रदर्शन सर्वोत्तम प्रथाओं पर अधिक पढ़ें
यदि आप चाहते हैं कि उपयोगकर्ता अपने ब्राउज़र में html निकाय देखें, तो यूनिकोड स्ट्रिंग को इंजेक्ट करने के लिए 'टेक्स्ट' के बजाय 'html' का उपयोग करें:
$('p').html("Your Unicode string")
मेरे दो सेंट)
आमतौर पर, jquery के साथ काम करने का मतलब है कि आपको हर समय DOM तत्वों के बारे में चिंता करने की ज़रूरत नहीं है। आप कुछ इस तरह लिख सकते हैं -$('div.mine').addClass('someClass').bind('click', function(){alert('lalala')}) - और यह कोड बिना किसी त्रुटि के निष्पादित करेगा।
कुछ मामलों में यह उपयोगी है, कुछ मामलों में - बिल्कुल नहीं, लेकिन यह एक तथ्य है कि jquery का झुकाव, अच्छी तरह से, खाली-मैचों के अनुकूल होता है। फिर भी,replaceWith यदि कोई व्यक्ति उस तत्व के साथ उपयोग करने का प्रयास करता है जो दस्तावेज़ से संबंधित नहीं है तो एक त्रुटि होगी। मैं इसे काउंटर-सहज ज्ञान युक्त पाता हूं।
एक अन्य नुकसान यह है कि, मेरी राय में, प्रचलित () विधि द्वारा लौटाए गए नोड्स का क्रम है - $('<div><span class="A"/><span class="B"/><span class="C"/><span class="D"/></div>').find('span:last-child').prevAll()। वास्तव में कोई बड़ी बात नहीं है, लेकिन हमें इस तथ्य को ध्यान में रखना चाहिए।
यदि आप बहुत सारे डेटा में अजाक्स की योजना बनाते हैं, जैसे कि 20 स्तंभों वाली तालिका की 1500 पंक्तियाँ, तो उस डेटा को अपने HTML में सम्मिलित करने के लिए jQuery का उपयोग करने के बारे में भी न सोचें। सादे जावास्क्रिप्ट का उपयोग करें। jQuery धीमी मशीनों पर बहुत धीमा होगा।
इसके अलावा, आधा समय jQuery ऐसी चीजें करेगा जो इसे धीमा कर देगा, जैसे कि आने वाले HTML में स्क्रिप्ट टैग पार्स करने की कोशिश कर रहा है, और ब्राउज़र quirks के साथ सौदा करेगा। यदि आप तेज प्रविष्टि गति चाहते हैं, तो सादे जावास्क्रिप्ट के साथ रहें।
.innerHTMLकरेंगे। लेकिन अगर आप जीमेल जैसी कोई चीज बना रहे हैं, जहां उपयोगकर्ता टैब को घंटों तक खुला रखता है, तो आपको बस बुलेट को काटने और अतिरिक्त सुस्ती से निपटना होगा। जिज्ञासु के लिए, यहाँ ठीक वही है जो jQuery का .html()है: james.padolsey.com/jquery/#v=1.4&fn=jQuery.fn.html
एक छोटी सी परियोजना में jQuery का उपयोग करना जो साधारण जावास्क्रिप्ट की कुछ पंक्तियों के साथ पूरा किया जा सकता है।
couple of lines of ordinary JavaScriptबिलकुल कोई परेशानी नही। लेकिन यह कभी बस इतना कब है? लोग कहते हैं कि "वेनिला जावास्क्रिप्ट का उपयोग क्यों नहीं करते हैं ??" आईई द्वारा अभी तक पर्याप्त रूप से काट नहीं किया गया है ... और यह उल्लेख करने के लिए नहीं कि सादे पुराने जेएस में सरल काम करने के लिए आपको कितना क्रॉफ्ट और बॉयलरप्लेट कोड लिखना होगा।
ईवेंट बाइंडिंग को नहीं समझना। जावास्क्रिप्ट और jQuery अलग तरीके से काम करते हैं।
लोकप्रिय मांग से, एक उदाहरण:
JQuery में:
$("#someLink").click(function(){//do something});
बिना jQuery के:
<a id="someLink" href="page.html" onClick="SomeClickFunction(this)">Link</a>
<script type="text/javascript">
SomeClickFunction(item){
//do something
}
</script>
मूल रूप से जावास्क्रिप्ट के लिए आवश्यक हुक अब आवश्यक नहीं हैं। यानी इनलाइन मार्कअप (ऑनक्लिक इत्यादि) का उपयोग करें क्योंकि आप बस आईडी और उन वर्गों का उपयोग कर सकते हैं जो एक डेवलपर सीएसएस उद्देश्यों के लिए सामान्य रूप से लाभ उठाएगा।