2011-09-21 17 views
9

एक ही पृष्ठ पर एक ही आईडी विशेषता के साथ एक से अधिक HTML तत्व होने का बुरा अभ्यास क्यों है? मैं इसे किसी ऐसे व्यक्ति को समझाने का तरीका ढूंढ रहा हूं जो HTML से बहुत परिचित नहीं है।एक ही आईडी विशेषता वाले एकाधिक HTML तत्वों की एक बुरी बात क्यों है?

मुझे पता है कि HTML spec requires ids to be unique लेकिन यह एक ठोस कारण की तरह नहीं लगता है। किसी दस्तावेज़ में किसी ने क्या लिखा है, मुझे इसकी परवाह क्यों करनी चाहिए?

मुख्य कारण यह है कि मैं सोच सकता हूं कि एक ही आईडी वाले कई तत्व जावास्क्रिप्ट कार्यों जैसे दस्तावेज़.getElementById के साथ अजीब और अपरिभाषित व्यवहार कर सकते हैं। मुझे यह भी पता है कि यह यूआरएल में खंड पहचानकर्ताओं के साथ अप्रत्याशित व्यवहार कर सकता है। क्या कोई भी अन्य कारणों के बारे में सोच सकता है जो HTML newbies को समझ में आएंगे?

+0

यह अब बहुत समझ में आता है। यह कक्षा शैली-वर्ग जैसी कुछ चीज़ों में बदल सकती है, और अधिक समझने के लिए। –

+2

आपको किसी दस्तावेज़ में किसी ने लिखा था परवाह करना चाहिए। परिभाषित, समीक्षा और स्वीकार किए गए मानकों के बिना मुझे संदेह है कि इस प्रश्न से पूछने के लिए आपके पास ऐसी जगह होगी :-) – andyb

+0

हा! वेस्ले ने अपना नाम बदलकर @ मोग कर दिया। – Ziggy

उत्तर

2

क्योंकि यदि आपके पास एक ही आईडी वाले एकाधिक HTML तत्व हैं, तो यह अब पहचानकर्ता नहीं है, है ना?

दो लोगों के पास एक ही सामाजिक सुरक्षा संख्या क्यों नहीं हो सकती है?

+0

वे कर सकते हैं। हालांकि इसे सामान्य रूप से "पहचान चोरी" कहा जाता है ... :) – cHao

+3

आह, एचटीएमएल में इसे सिर्फ मैला कहा जाता है। – JHolyhead

11

अपने प्रश्न के आधार पर आप पहले से ही पता है कि W3C इस बारे में क्या कहना है:

आईडी गुण किसी HTML तत्व के लिए एक विशिष्ट आईडी (आईडी विशेषता मान HTML दस्तावेज़ के भीतर अद्वितीय होना चाहिए) निर्दिष्ट ।

आईडी विशेषता का उपयोग स्टाइल शीट में शैली को इंगित करने के लिए किया जा सकता है।

विशिष्ट विशेषता वाले HTML तत्व में परिवर्तन करने के लिए आईडी विशेषता का उपयोग जावास्क्रिप्ट (HTML DOM के माध्यम से) द्वारा भी किया जा सकता है।

आईडी के साथ बिंदु यह है कि यह अद्वितीय होना चाहिए। इसका उपयोग किसी तत्व की पहचान करने के लिए किया जाता है (या कुछ भी: यदि दो छात्रों के समान छात्र आईडी स्कूल अलग-अलग दिखाई देते हैं)। यह एक मानव नाम की तरह नहीं है, जिसे अद्वितीय नहीं होना चाहिए। यदि किसी सरणी में दो तत्वों का एक ही सूचकांक था, या यदि दो अलग-अलग वास्तविक संख्या बराबर थी ... ब्रह्मांड बस अलग हो जाएगा। यह पहचान की परिभाषा का हिस्सा है।

आपको शायद जो भी करने की कोशिश कर रहे हैं उसके लिए कक्षा का उपयोग करना चाहिए, मुझे लगता है (ps: आप क्या करने की कोशिश कर रहे हैं?)।

आशा है कि इससे मदद मिलती है!

+0

मैं एक वेबसाइट पर काम कर रहा हूं, और जो मेरी मदद कर रहा है वह एक ही आईडी के साथ कई तत्व डाल रहा है, और मैं यह समझाने का एक तरीका समझने की कोशिश कर रहा हूं कि यह एक अच्छा विचार क्यों नहीं है। –

+0

मैंने एक ही आईडी को कई तत्वों को असाइन करने का प्रयास किया, और मुझे कुछ थोड़ा विचित्र व्यवहार मिला, लेकिन जहां तक ​​मुझे पता है, ब्रह्मांड अभी तक अलग नहीं हुआ है। –

+0

आप दस्तावेज़.getElementByid का उपयोग करने में सक्षम नहीं होंगे। और यह सिर्फ हास्यास्पद है! यह आपकी वेबसाइट को प्रारूपित करने के लिए एक टेबल का उपयोग करने जैसा है: सुनिश्चित करें कि लोग इसे करते हैं और यह काम करता है, लेकिन यह एक्स्टेंसिबल नहीं है और यह तालिका टैग के लिए नहीं है (यह टैब्यूलर डेटा प्रदर्शित करने के लिए है)। आपके सहयोगी को यह समझने की जरूरत है कि इंटरनेट के विभिन्न हिस्सों को टेंडेम में काम करने के लिए ये मानदंड मौजूद हैं। आपकी वेबसाइट आजकल कई समान आईडी से नहीं टूट जाएगी। यदि वह मानकों का पालन नहीं करता है, हालांकि, इस बात की कोई गारंटी नहीं है कि यह कभी नहीं टूट जाएगा। इसका कोई मतलब भी है क्या? – Ziggy

1

मुख्य कारण यह है कि मैं सोच सकता हूं कि एक ही आईडी वाले कई तत्व जावास्क्रिप्ट कार्यों जैसे document.getElementById के साथ अजीब और अपरिभाषित व्यवहार कर सकते हैं।

... और XPath अभिव्यक्तियों, क्रॉलर, स्क्रैपर्स इत्यादि जो आईडी पर भरोसा करते हैं, लेकिन हाँ, यह बिल्कुल है। अगर वे आश्वस्त नहीं हैं, तो उनके लिए बहुत बुरा है; यह उन्हें अंत में काट देगा, भले ही वे इसे जानते हों या नहीं (जब उनकी वेबसाइट खराब हो जाती है)।

1

सामाजिक सुरक्षा संख्या अद्वितीय क्यों होनी चाहिए, या लाइसेंस प्लेट नंबर क्यों होना चाहिए? इसी कारण से कोई अन्य पहचानकर्ता अद्वितीय होना चाहिए। ताकि यह बिल्कुल एक चीज की पहचान कर सके, और यदि आप आईडी रखते हैं तो आप उस चीज़ को पा सकते हैं।

1

आपने मूल रूप से इस सवाल का जवाब दिया। मुझे लगता है कि जब तक इस कार्यक्षमता पर रहने वाले किसी भी समारोह की तुलना में एक elemenet को आईडी द्वारा विशिष्ट रूप से पहचाना नहीं जा सकता है।आप अभी भी एक क्लास का उपयोग करके एक xpath शैली में तत्वों को खोजना चुन सकते हैं जैसे कि आप कक्षा का उपयोग करेंगे, लेकिन यह बोझिल, त्रुटि प्रवण है और बाद में आपको सिरदर्द देगा।

4

मुझे किसी दस्तावेज़ में किसी ने क्या लिखा है, इसकी परवाह क्यों करनी चाहिए?

आपको ध्यान रखना चाहिए क्योंकि यदि आप HTML लिख रहे हैं, तो इसे किसी ब्राउज़र द्वारा प्रस्तुत किया जाएगा जो देखभाल करने वाले किसी व्यक्ति द्वारा लिखा गया था। डब्ल्यू 3 सी ने स्पेक और Google, मोज़िला, माइक्रोसॉफ्ट इत्यादि का निर्माण किया ... इसका अनुसरण कर रहे हैं, इसलिए यह भी आपकी रुचि में है।

3

स्पष्ट कारण के अलावा (उन्हें अद्वितीय होना चाहिए), आपको ध्यान रखना चाहिए क्योंकि id के साथ कई तत्व होने से आपका आवेदन टूट सकता है।

मान लीजिए कि आप इस मार्कअप करते हैं:

<p id="my_id">One</p> 
<p id="my_id">Two</p> 

सीएसएस क्षमा है, यह दोनों तत्वों लाल रंग देगा:

#my_id { color:red; } 

..लेकिन जावास्क्रिप्ट के साथ, यह केवल पहला शैली होगा एक:

document.getElementById('my_id').style.color = 'red'; 

यह सिर्फ एक साधारण उदाहरण है। जब आप जावास्क्रिप्ट के साथ कुछ भी कर रहे हैं जो अद्वितीय होने पर आईडी पर निर्भर करता है, तो आपका पूरा आवेदन अलग हो सकता है। यहां हर दिन पोस्ट किए गए प्रश्न हैं जहां यह वास्तव में हो रहा है - कुछ महत्वपूर्ण तोड़ दिया गया है क्योंकि डेवलपर ने डुप्लिकेट आईडी विशेषताओं का उपयोग किया था।

+1

मुझे लगता है कि यह प्रश्न निकाय में संबोधित किया गया था, लेकिन मैंने आज कम से कम 5 पदों को पढ़ना होगा जो पूछ रहे थे कि क्यों कुछ टूटा हुआ था (सभी डुप्ली आईडी को ठीक करके हल किए गए थे)। मुझे "कैनोलिक पोस्ट" नहीं मिला जो सिर्फ यह कहता है: "नहीं - आप * डुप्लिकेट आईडी नहीं कर सकते"। उम्मीद है कि यह शिक्षा प्रयास में थोड़ा गैस जोड़ता है। –

0

मुख्य कारण मैं के बारे में सोच सकते हैं कि एक ही आईडी के साथ एक से अधिक तत्वों ऐसे हैं document.getElementById के रूप में जावास्क्रिप्ट कार्यों के साथ अजीब और अपरिभाषित व्यवहार का कारण बन सकती है।

यह बिल्कुल समस्या है। "अपरिभाषित व्यवहार" का अर्थ है कि एक उपयोगकर्ता का ब्राउज़र एक ही तरीके से व्यवहार करेगा (शायद केवल पहला तत्व प्राप्त करें), दूसरा एक और तरीका व्यवहार करेगा (शायद केवल अंतिम तत्व प्राप्त करें), और दूसरा एक और तरीका व्यवहार करेगा (शायद सभी का सरणी तत्व)। प्रोग्रामिंग का पूरा विचार कंप्यूटर को देना है (यानी, उपयोगकर्ता का ब्राउज़र) सटीक निर्देश जो आप करना चाहते हैं उससे संबंधित है। जब आप गैर-अद्वितीय आईडी विशेषताओं जैसे अस्पष्ट निर्देशों का उपयोग करते हैं, तो आपको अप्रत्याशित परिणाम मिलते हैं, जो कि प्रोग्रामर नहीं चाहता है।

मुझे किसी दस्तावेज़ में किसी ने क्या लिखा है, इसकी परवाह क्यों करनी चाहिए?

डब्ल्यू 3 सी चश्मा केवल "कुछ दस्तावेज़" नहीं हैं; वे नियम हैं कि, यदि आप अपने कोडिंग में अनुसरण करते हैं, तो आप किसी भी ब्राउज़र को मानने की उम्मीद कर सकते हैं। बेशक, सभी ब्राउज़रों द्वारा डब्ल्यू 3 सी मानकों का शायद ही कभी पालन किया जाता है, लेकिन वे मौजूद सामान्य रूप से स्वीकृत ग्राउंड नियमों का सबसे अच्छा सेट हैं।

0

संक्षिप्त उत्तर यह है कि एचटीएमएल/जावास्क्रिप्ट डीओएम एपीआई में आपके पास getElementById फ़ंक्शन है जो संग्रह को नहीं, एक तत्व देता है। तो यदि आपके पास एक ही आईडी के साथ एक से अधिक तत्व हैं, तो यह नहीं पता कि कौन सी चुनना है।

लेकिन सवाल वास्तव में गूंगा नहीं है, क्योंकि एक आईडी चाहते हैं जो HTML में एक से अधिक तत्वों को संदर्भित कर सकता है।उदाहरण के लिए, कोई उपयोगकर्ता टेक्स्ट का चयन कर सकता है और उसे एनोटेट करना चाहता है। आप एक

<span class="Annotation" id="A01">Bla bla bla</span> 

के साथ इस दिखाने के लिए उपयोगकर्ता चयनित पाठ कि spans कई पैराग्राफ, तो जरूरत है टुकड़ों में टूट जा करने के लिए, तो चाहते हैं, लेकिन है कि चयन के सभी टुकड़े एक ही "आईडी" से पता होना चाहिए।

नोट है कि अतीत में आप अपने HTML में

<a name="..."/> 

तत्वों डाल सकता है और आप उन्हें getElementsByName साथ मिल सकता है। तो यह समान है। लेकिन दुर्भाग्य से एचटीएमएल विनिर्देशों ने इसे हटाना शुरू कर दिया है, जो एक बुरा विचार है क्योंकि यह एक साधारण समाधान के बिना एक महत्वपूर्ण उपयोग केस छोड़ देता है।

निश्चित रूप से XPath के साथ आप किसी भी विशेषता या यहां तक ​​कि टेक्स्ट नोड को आईडी के रूप में उपयोग कर सकते हैं। जाहिर है XPointer कल्पना आप किसी भी XPath अभिव्यक्ति द्वारा तत्वों का संदर्भ देते हैं और उसका उपयोग के रूप में में

http://my.host.com/document.html#xpointer(id('A01')) 

या उसके लघु संस्करण URL खंड संदर्भ में करने की अनुमति देता

http://my.host.com/document.html#A01 

या, अन्य समकक्ष xPath अभिव्यक्ति:

http://my.host.com/document.html#xpointer(/*/descendant-or-self::*[@id = 'A01']) 

और हां, तो एक ही नाम का उल्लेख कर सकते विशेषताओं

http://my.host.com/document.html#xpointer(/*/descendant-or-self::*[@name = 'A01']) 

या आप अपने गुण

http://my.host.com/document.html#xpointer(/*/descendant-or-self::*[@annotation-id = 'A01']) 

आशा इस मदद करता है नाम जो कुछ भी।

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