2011-09-21 50 views
9

爲什麼在同一頁面上有多個具有相同id屬性的HTML元素是不好的做法?我正在尋找一種方法來解釋這個對不熟悉HTML的人。爲什麼有多個具有相同id屬性的HTML元素是一件壞事?

我知道HTML規範requires ids to be unique,但這聽起來不像是一個令人信服的理由。爲什麼我應該關心某人在某個文檔中寫什麼?

我能想到的主要原因是具有相同id的多個元素會導致Javascript函數(如document.getElementById)出現奇怪和未定義的行爲。我也知道它可能會導致URL中的片段標識符出現意外的行爲。任何人都可以想到其他任何對HTML新手都有意義的理由嗎?

+0

它使現在的方式有很多意義。雖然課程可能會改變爲類似風格的課程,但具有更多的意義。 – 2011-09-21 19:20:45

+2

你應該關心某人在某些文件中寫什麼。沒有定義,審查和接受的標準,我懷疑你會有這樣的地方來問這個問題:-) – andyb

+0

哈!韋斯利將他的名字改爲@mog。 – Ziggy

回答

2

因爲如果你有多個具有相同ID的HTML元素,它不再是一個標識符,是嗎?

爲什麼兩個人不能有相同的社會安全號碼?根據您的問題

+0

他們可以。雖然這通常被稱爲「身份盜竊」...... :) – cHao

+3

啊,在HTML中它只是被稱爲馬虎。 – JHolyhead

11

你已經知道什麼是W3C不得不說的是:

id屬性指定的HTML元素一個唯一的標識(ID 屬性值必須是HTML文檔中唯一) 。

id屬性可用於指向樣式表中的樣式。

id屬性也可以被JavaScript(通過HTML DOM) 使用來更改具有特定id的HTML元素。

帶id的點是它必須是唯一的。它被用來識別一個元素(或者任何東西:如果兩個學生有相同的學生id,學校在看起來會分開)。它不像人名,不一定是唯一的。如果一個數組中的兩個元素具有相同的索引,或者兩個不同的實數相等......宇宙就會分崩離析。這是身份定義的一部分。

你應該使用class來表達你想要做的事情,我想(ps:你想做什麼?)。

希望這會有所幫助!

+0

我正在一個網站上工作,而有人正在幫助我將幾個元素放在同一個ID中,我試圖找出解釋爲什麼這不是一個好主意的方法。 –

+0

我嘗試將相同的id分配給多個元素,並且我得到了一些有點古怪的行爲,但據我所知,宇宙還沒有分崩離析。 –

+0

您將無法再使用document.getElementByid。這只是荒謬的!這就像使用表格來設置你的網站的格式一樣:確保人們這樣做並且工作,但它不可擴展,這不是表格標籤的用途(它用於顯示錶格數據)。你的同事需要明白,這些標準已經到位,以保持互聯網的不同部分協同工作。您的網站今天不會從多個相同的ID打破。但是,如果他不遵守這些標準,則不能保證它不會破裂。這有意義嗎? – Ziggy

1

我能想到的主要原因是具有相同id的多個元素可能會導致奇怪和未定義的行爲,如document.getElementById等Javascript函數。

...以及依賴於id的XPath表達式,爬行器,刮板等,但是,就是這樣。如果他們不相信,那麼對他們來說太糟糕了;它最終會咬他們,不管他們是否知道(當他們的網站訪問不佳時)。

1

爲什麼社會安全號碼應該是唯一的,還是車牌號碼?出於同樣的原因,任何其他標識符應該是唯一的。爲了確定一件事情,如果你有ID,你可以找到一件事。

1

你可以回答這個問題。我認爲,只要一個elemenet不能再由id唯一標識,那麼駐留在這個功能上的任何函數都將被破壞。你仍然可以選擇像使用類一樣使用id在xpath樣式中搜索元素,但是這很麻煩,容易出錯,以後會讓你頭疼。

4

我爲什麼要關心的一些文件在什麼有人寫?

您應該關心,因爲如果您正在編寫HTML,它將在瀏覽器中呈現,這是由一位關心的人編寫的。 W3C創建了這個規範,谷歌,Mozilla,微軟等......都在關注它,所以你也應該關注它。

3

除了明顯的原因(他們應該是唯一的),你應該小心,因爲具有相同id多個元素可以打破你的應用程序。

比方說,你有這樣的標記:

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

CSS是寬容的,這將色彩元素都紅:

#my_id { color:red; } 

..但使用JavaScript,這隻會樣式第一一個:

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

這只是一個簡單的例子。當您對JavaScript進行任何依賴於id的獨特功能時,您的整個應用程序可能會崩潰。每天在這裏發佈的問題實際上都在發生 - 由於開發人員使用了重複的id屬性,所以關鍵性問題被破壞了。

+1

我看到這是在問題主體中解決的,但我今天必須閱讀至少5篇帖子,詢問爲什麼有些內容被破解(所有這些都是通過修改dupe id來解決的)。我找不到剛纔說的「規範帖子」:「不 - 你*不能*有重複的ID」。希望這會爲教育工作增添一點點燃氣。 –

0

我能想到的主要原因是,與同 ID多個元素可能會導致使用Javascript功能 如的document.getElementById陌生和不確定的行爲。

這也正是問題。 「未定義的行爲」意味着一個用戶的瀏覽器將以單向行爲(可能只有第一個元素),另一個會以另一種方式行事(可能只有最後一個元素),另一個行爲將以另一種方式行事(可能會得到所有數組元件)。編程的全部想法是給計算機(也就是用戶的瀏覽器)準確的說明你想做什麼。當你使用非唯一ID屬性等含糊不清的指令時,你會得到不可預知的結果,這不是程序員想要的結果。

我爲什麼要關心的一些文件在什麼有人寫?

W3C規範不只是 「一些文件」;他們是規則,如果你遵循你的編碼,你可以合理地期待任何瀏覽器服從。當然,所有瀏覽器都很少遵循​​W3C標準,但它們是存在的最普遍接受的基本規則。

0

簡短的回答是,在HTML/JavaScript DOM API中,您有getElementById函數,它返回一個元素,而不是集合。所以如果你有多個具有相同ID的元素,它不知道選擇哪一個。

但問題是不是啞巴實際上,因爲我們有理由希望一個ID可能是指多個元素的HTML。例如,用戶可能會選擇文本並想對其進行註釋。您想用

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

顯示這個如果跨越多個段落,用戶選擇的文本,然後將需要被分解成片段,但所有選取的片段應該是相同的「ID」尋址。

需要注意的是,在過去,你可以把你的HTML

<a name="..."/> 

元素,你可以用getElementsByName找到他們。所以這是相似的。但不幸的是,HTML規範已經開始貶低它,這是一個壞主意,因爲它留下了一個重要的用例而沒有簡單的解決方案。

當然,使用XPath,您可以使用任何屬性或甚至文本節點作爲標識。顯然,XPointer的規範允許您通過任何XPath表達式要參考的元素和使用,在URL片段引用在

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

或它的短版

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

,或者其他等效XPath表達式:

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

等,一個可以參考的name屬性

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']) 

希望這有助於。

相關問題