2013-02-25 16 views
26

क्या मैं, एक jQuery1.9 + सॉफ़्टवेयर डेवलपर, दिन-दर-दिन काम में attr() विधि के उपयोग को "बहिष्कृत" कर सकता हूं?क्यों jQuery 1.9+ attr() विधि बहिष्कृत नहीं है?


के रूप में कई सवाल में दिखाया,

के बारे में बहुत भ्रम है "एटीआर का उपयोग करें या प्रोप का उपयोग करें?", और, मेरे (डेवलपर) दृष्टिकोण से, attr() विधि के सभी उपयोगों के लिए, हम prop बजाय का उपयोग कर सकते हैं:

  1. पश्चगामी-संगतता: कोडिंग नए सॉफ्टवेयर इस की जरूरत नहीं;
  2. प्रदर्शन: John says "विधि .attr() के माध्यम से गुण को एक्सेस करना (सीधे उन तक पहुँचने .prop के माध्यम से) की तुलना में थोड़ी धीमी हो जाएगा";
  3. विशेषता विशेषता बदलें: सभी को prop(name,newvalue) विधि द्वारा बदला जा सकता है।
  4. विशेषता हटाएं: सभी को removeProp(name) विधि से हटाया जा सकता है।
  5. चेक एचटीएमएल विशेषता मान: ब्राउज़र डोम का उपयोग करें, सभी HTML डोम में बदल दिया गया है, और, डोम प्रभावित करता है, तो attr(name) विधि को भी प्रभावित किया। प्रोप के "मजबूत प्रकार" के बारे में: यह "एचटीएमएल स्ट्रिंग वैल्यू" (उदा। "चेक" बनाम सच) से बेहतर है।
  6. जांच करें कि एक विशेषता "एचटीएमएल मूल कोड" में परिभाषित किया गया था (मान कि विधि attr आपके ब्राउज़र में रिटर्न अपरिभाषित अगर यह नहीं है) ... ठीक है, हम इस सॉफ्टवेयर के कुछ टुकड़े में की ज़रूरत है? At forms, ".val() विधि फॉर्म के मान प्राप्त करने या सेट करने के लिए अनुशंसित jQuery तरीका है"
  7. क्रॉस-ब्राउज़र स्थिरता: दोनों (न केवल attr) लगातार विधियां हैं। (यह है??)।

तो, यह समय (2013) में, मैं नहीं जब नए jQuery कोड के विकास attr विधि का उपयोग करने के लिए एक अच्छा कारण अच्छी तरह से, प्रश्न देखें ... लेकिन, यह है, दूसरे शब्दों में: रहे हैं मेरे दिन-दर-दिन कार्यों में attr विधि का उपयोग करने का एक अच्छा कारण?

+0

2) आप वैसे भी ऐसा नहीं करते 3) नहीं 4) नहीं 5) डोम अभी भी गुणों से गुणों को अलग करता है 6) आपको कभी भी [पृष्ठ स्रोत प्राप्त करने की आवश्यकता नहीं है] (http://stackoverflow.com/a/3905503/1048572) – Bergi

+0

क्या कोई भी जवाब आपके प्रश्न का पूरी तरह से उत्तर नहीं देता है? मैं कहूंगा कि उनमें से कुछ स्वीकार्य हैं। – Nenotlep

+0

क्षमा करें, मुझे लगता है कि [prop-vs-attr] के उत्तर (http: // stackoverflow।कॉम/प्रश्न/5874652/प्रोप-बनाम-एटीआर) को डुप्लिकेट किया गया था, और लोग इस सवाल का ध्यान नहीं देखते हैं (लगभग [सर्वोत्तम मूल्य] [https://en.wikipedia.org/wiki/Best_practice) * प्रोप नहीं है -vs-attr * अवधारणाओं) ... जैसा कि आपने सुझाव दिया था, अब मैं "स्वीकृत उत्तर" पर क्लिक करता हूं, लेकिन मेरे उत्तर को वोट देना पसंद नहीं करता, खासकर अगर इसे वोट प्राप्त नहीं होते हैं। –

उत्तर

0

मेरे होमवर्क ... के बाद @cHao पढ़ सकते हैं और @cernunnos अच्छा स्पष्टीकरण, और कुछ ही महीनों के बाद इसे का उपयोग ... मैं बात हम तय करने के लिए एक और अवधारणा की जरूरत है, प्रोग्रामर, जब उपयोग या नहीं सहारा और attr के रूप में :

  • HTML स्रोत-कोड और उसकी प्रस्तुति: ब्राउज़र की स्मृति अंतरिक्ष में ब्राउज़र भार HTML पृष्ठ। खैर, स्मृति के ब्राउज़र में क्या रहना डीओएम प्रतिनिधित्व है, लेकिन डीओएम कुछ मूल चीजों को संरक्षित करता है, गुण और cssText property, जो "कभी-कभी दृढ़ प्रतिनिधित्व" होते हैं।
    पीएस: गुण जो "मानक डोम" में परिभाषित नहीं हैं, DOM गुण पर मैपिंग नहीं है। जब कोई (केवल पढ़ने के लिए नहीं) गुण विशेषताएँ, यदि संबंधित (मैप किए गए) संपत्ति हैं, तो इसे स्वचालित रूप से बदला जा सकता है।

  • डोम राज्य: गतिशील पृष्ठों को सीधे डोम पर परिवर्तन की आवश्यकता होती है, जो अंतिम उपयोगकर्ता देखते हैं। इसलिए, यदि पृष्ठ पर कुछ "क्लिक और चेंज" क्रियाएं हैं, तो प्रत्येक बार जब डोम एक नए पेज का प्रतिनिधित्व करता है, तो प्रत्येक बार जब डोम का नया state होता है।
    जब एक DOM-संपत्ति परिवर्तन, अन्य सभी DOM गुण (यदि आवश्यक हो) लगातार बदलते हैं।

मन में इन अवधारणाओं के साथ

, हम एक "अंगूठे (attr बनाम prop उपयोगों के लिए) की नियम" आकर्षित कर सकते हैं:

  1. उपयोग prop, तो आप संभावना के 90% कि यह काम करता है ... 99% यदि आप के लिए jQuery का उपयोग करते हैं तो DOM राज्य (और मानक डोम परिकल्पना) बदलता है।
  2. यदि आपको data-* विशेषताओं को बदलने या एक्सेस करने की आवश्यकता है, तो .data() विधि का उपयोग करें।
  3. अन्यथा (गैर-डीओएम, गैर-डेटा, या गैर-मानक चीजें) जांच करें कि .attr() का उपयोग करने का कोई मामला जांचें, और इसका अध्ययन करने के लिए कुछ समय आरक्षित करें (उपरोक्त उत्तरों देखें)।
+2

थोड़ा ऑफटॉपिक है, लेकिन अगर यह उत्तर स्वीकृत है, तो यह दूसरों के शीर्ष पर नहीं है? आम तौर पर स्वीकार किए जाते हैं, भले ही अन्य उत्तरों के पास अधिक वोट हों ... यहां यह आखिरी है! – DiegoDD

+1

@DiegoDD, कुछ महीने बाद खेद है ... क्योंकि कोई भी प्रश्न नहीं पढ़ता है, ** यह उद्धृत सिमिलर्स ** की तुलना में एक "अलग प्रश्न" है ... उस समय उत्तर, ** केवल सभी ही कॉपी/पिछला ** ** ** इसी तरह से ** उत्तर दें। –

29

.attr() पदावनत नहीं है, क्योंकि यह क्या यह के लिए किया है के लिए उपयोगी है, और क्या यह प्रत्येक तत्व के getAttribute समारोह है, जो एक ही बात करता है का उपयोग करने का (छोटे के लिए बनाया गया है करने के लिए केवल सही तरीका क्या है ... या अपने आप को HTML को पार्स करना)।एकमात्र कारण यह है कि हम इस चर्चा को भी कर रहे हैं क्योंकि jQuery (और कुछ पुराने ब्राउज़र (खांसी आईई खांसी) गलत तरीके से conflated गुण और गुण, और है कि muddling है जो वे स्पष्ट रूप से 1.9 में तय किया गया है।

.attr() गुण प्राप्त करता है, जबकि .prop() को पुन: प्राप्त गुण। दोनों अलग-अलग चीजें हैं, और हमेशा आधिकारिक तौर पर (हालांकि डोम में अक्सर एक गुण के अनुरूप संपत्ति होती है)। यदि आपके पास <p whatever="value"> है, जहां whatever ब्राउज़र पहचानने योग्य विशेषता नहीं है, तो आप विशेषता का मूल्य प्राप्त करने के लिए .attr() का उपयोग करेंगे। .prop() अधिकतर ब्राउज़रों में पर भी सक्षम नहीं होगा।

जब आप परिणामी DOM संपत्ति पर ध्यान देते हैं, तो .prop() का उपयोग करें। जब आप वास्तविक HTML विशेषता विशेषता रखते हैं, तो .attr() का उपयोग करें। यह वास्तव में एक या/चीज नहीं है; आप दोनों एक ही कोड में उपयोग कर सकते हैं और ब्रह्मांड एक बार भी इंपोड नहीं करेगा (मान लीजिए कि आपने उन्हें सही तरीके से उपयोग किया है, वैसे भी)। :) बस उस समय का उपयोग करें जो उस समय के लिए उपयुक्त है जो आप कर रहे हैं, और टूटने वाली सामग्री को "बहिष्कृत" करने का प्रयास करना छोड़ दें।

+7

बिंदु में मामला: '' यदि आप 'attr (" data-foo ") का उपयोग करते हैं, तो आप वापस '' बार '' प्राप्त करते हैं। यदि आप 'प्रोप' का उपयोग करते हैं, तो आप नहीं करते हैं, आपको 'अपरिभाषित' मिलता है। आप * डेटा 'का उपयोग कर सकते हैं, लेकिन इससे jQuery आपके' स्पैन 'के लिए डेटा ऑब्जेक्ट बना देगा और तत्व पर सभी' डेटा- * 'विशेषताओं के साथ इसे पूर्व-पॉप्युलेट करेगा, जो कि यदि आप चाहते हैं तो अनावश्यक है एक डेटा के रूप में 'डेटा-फू' प्राप्त करने के लिए। –

+0

@ सीएचओओ। हां, लेकिन यह बात है: jQuery प्रोग्रामिंग "डोम प्रोग्रामिंग" है, और सभी HTML विशेषताओं को DOM ऑब्जेक्ट्स में मैप किया गया था ... इसलिए, मुझे लगता है कि, 99.9% jQuery अनुप्रयोगों के लिए, मुझे attr का उपयोग करने की आवश्यकता नहीं है। –

+1

@ पीटरक्रॉस: इसे टालने से हासिल करने का कोई उद्देश्य नहीं है। ऐसा करने के अपने रास्ते से बाहर निकलने की कोशिश न करें, यह सिर्फ * अनावश्यक * है। –

2

.attr() केवल HTML विशेषताओं तक पहुंचता है, जबकि .prop() HTML तत्वों पर गुणों को पुनर्प्राप्त नहीं करेगा।

उदाहरण के लिए, SelectedIndex, टैगनाम, nodename, nodeType, ownerDocument, defaultChecked, और defaultSelected लिया गया और विधि .prop() के साथ स्थापित किया जाना चाहिए: दस्तावेज़ देखें। JQuery 1.6 से पहले, इन गुणों .attr() विधि के साथ पुनर्प्राप्त करने योग्य थे, लेकिन यह अटॉर्फ़ के दायरे में नहीं था। इनके पास समान गुण नहीं हैं और केवल गुण हैं।

http://jsfiddle.net/5REVP/

विशेष रूप से इस हिस्से:

http://api.jquery.com/prop/

12

मैं तुम्हारे लिए एक बेला तैयार करने की स्वतंत्रता ले लिया

<div id="example" style="padding:10px"></div> 

console.log("style"); 
var styleAttr = $("#example").attr("style"); 
console.log(styleAttr); // You get "padding:10px" 
var styleProp = $("#example").prop("style"); 
console.log(styleProp); // You get a CSSStyleDeclaration object 

"शैली" उदाहरण स्पष्ट रूप से पता चलता है कि एक विशेषता एक संपत्ति के समान नहीं है (कंसोल की जांच करें)।

पठनीयता, रखरखाव और पिछड़े (साथ ही आगे) संगतता के लिए आपको किसी भी कार्य के लिए सही तरीकों का उपयोग करना चाहिए, अन्यथा एक मौका है कि एक विधि आपके जैसा व्यवहार कर सकती है, जैसा कि यह होगा, .attr () विधि इसका एक उदाहरण है।

.attr() विधि तत्वों के गुण प्राप्त करने के लिए उपयोग किया जाता है, गुण SGML शब्द है जो तत्व टैग के अंदर मौजूद जानकारी को संदर्भित करता है, आप तत्वों का निरीक्षण करके आसानी से उस जानकारी को पढ़ सकते हैं।

  • आप एक तत्व की "शैली" विशेषता मिलता है कि तुम क्या विशेष रूप से उस विशेषता में लिखा है के अलावा अन्य किसी भी जानकारी को नहीं मिलेगा।
  • यदि आपको चेकबॉक्स की "चेक" विशेषता मिलती है तो आपको या तो "चेक" या "" प्राप्त होगा।

.prop() विधि तत्वों के DOM गुण प्राप्त करने के लिए उपयोग की जाती है।

  • यदि आपको "शैली" संपत्ति मिलती है तो आपको स्टाइल एट्रिब्यूट में डिजाइनर ने क्या लिखा है, आपको तत्व के सभी वास्तविक सीएसएस गुण मिल रहे हैं।
  • यदि आपको चेकबॉक्स की "चेक" संपत्ति मिलती है तो आपको सच या गलत मिलेगा।
+0

@cernunnos, अच्छे स्पष्टीकरण और अच्छे संकेतों के कारण धन्यवाद ... मेरा मुद्दा यह है कि jQuery प्रोग्रामिंग "डोम प्रोग्रामिंग" है, और सभी HTML विशेषताओं को डोम ऑब्जेक्ट्स में मैप किया गया था ... इसलिए, मुझे लगता है कि 99.9% jQuery अनुप्रयोगों, मुझे attr का उपयोग करने की आवश्यकता नहीं है। एक डेवलपर के रूप में मैं देखता हूं कि 'शैली' * ऑब्जेक्ट * 99% अनुप्रयोगों के लिए * स्ट्रिंग * से बेहतर है। –

+0

असल में अधिकांश jQuery प्लगइन्स गुणों में हेरफेर करते हैं, गुण नहीं (आमतौर पर दूसरे की ओर जाता है, लेकिन यह वही नहीं है)। जब इंटरफ़ेस (एचटीएमएल) में हेरफेर करना है, तो गुणों में हेरफेर करना हमेशा बेहतर होता है, क्योंकि अन्य प्लगइन्स/मॉड्यूल किसी भी प्रासंगिक "गैर-डिफ़ॉल्ट" व्यवहार को "दृश्यमान" होने की अपेक्षा करते हैं। मुझे लगता है कि आपको शायद ही कभी तत्व गुणों को बदलने की आवश्यकता है, लेकिन उन्हें एक्सेस करना आम है (चेकबॉक्स की चेक की गई संपत्ति)। – cernunnos

+3

+1 ('स्टाइल' एक ** महान ** उदाहरण है!) नाइटपिकिंग @ फ्रेडेरिक हामिदी के नाइटपिक: एचटीएमएल 5 के रूप में, [एचटीएमएल अब एसजीएमएल एप्लीकेशन नहीं है] (http://www.w3.org/TR/ एचटीएमएल 5/सिंटेक्स.html # पार्सिंग): * "एचटीएमएल के कुछ पुराने संस्करण ... एसजीएमएल पर आधारित थे और एसजीएमएल पार्सिंग नियमों का इस्तेमाल करते थे। हालांकि, कुछ (यदि कोई हैं) वेब ब्राउज़र ने कभी भी एचटीएमएल दस्तावेजों के लिए सही एसजीएमएल पार्सिंग लागू किया ... द परिणामस्वरूप भ्रम ... ने दशकों की उत्पादकता बर्बाद कर दी है। एचटीएमएल का यह संस्करण इस प्रकार एक गैर-एसजीएमएल आधार पर लौटता है। "* हालांकि नाइटपिकिंग * खुद *, इसका मतलब यह नहीं है कि हम एसजीएमएल भावना में विशेषताओं के बारे में बात नहीं कर रहे हैं। :-) –

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