2012-05-06 20 views
5

我正在使用哈希的偵聽器來顯示和隱藏內容DIV並滾動到相同名稱的命名定位點的網站上工作。與NAME相同的命名定位點(A)與DIV ID衝突相同

我有一個奇怪的問題,而不是滾動到錨點,它會滾動到ID與錨點的名稱相同的DIV。

一旦我將DIV ID更改爲不同的東西,其行爲與預期相同。

我似乎無法找到任何文件,並想知道這是否是記錄的行爲。

的作品

代碼:

<a name="top">top</a> 

<p id="bottomx" style="height: 1800px;"> 
<a href="#top">top</a> 
<a href="#bottom">bottom</a> 
<br> 
</p> 
<a name="bottom">bottom</a> 

工作不正常:

<a name="top">top</a> 

<p id="bottom" style="height: 1800px;"> 
<a href="#top">top</a> 
<a href="#bottom">bottom</a> 
<br> 
</p> 
<a name="bottom">bottom</a> 

在第二個例子中,它會滾動到名爲 「底」 在P。同樣,如果我在頁面底部創建一個ID爲「bottom」的DIV,並且我點擊page.html#bottom,它會向下滾動到該DIV。

看起來很混亂。一個想法,爲什麼這是這樣工作?在Safari和FF中同樣的行爲。

+0

有趣 - 我很難在HTML5規範中找到它。 –

+1

如果在[HTML4規範](http://www.w3.org/TR/html401/struct/links.html#h-12.2.3)中發現:*「id'和'name'屬性共享相同的名稱空間,這意味着它們不能在同一個文檔中定義具有相同名稱的錨。「*。我認爲這是在HTML5規範中重新定義的,以考慮瀏覽器實現的常見行爲。 –

回答

7

id has precedence over name

對於HTML文檔(和HTML MIME類型),以下處理 模型必須遵循確定 文件中指定部分是什麼。

  1. 解析URL並讓fragid成爲 URL的組件。

  2. 如果fragid是空字符串,那麼 文檔的指示部分是文檔的頂部;在這裏停止算法。

  3. 令解碼fragid是作爲由UTF-8所定義的有效UTF-8序列導入 Unicode字符擴大fragid的 百分比編碼八位位組的任何序列的結果。如果該字符串中任何百分比編碼的 八位組不是有效的UTF-8序列(例如,它們的 擴展爲替代碼點),則跳過此步驟和下一個 之一。

  4. 如果此步驟不是跳過並且有在DOM該 具有ID精確地等於解碼fragid的元素,然後在樹順序第一個這樣的 元件是文檔的所指示的部分;在此停止 算法。

  5. 如果在具有名稱屬性,其 值正好等於fragid(未解碼fragid)的DOM中的一個元素,則在樹順序 第一個這樣的元素是 文檔中指定部分;在這裏停止算法。

  6. 如果fragid是字符串頂部的ASCII不區分大小寫匹配, 然後該文件的指示的部分是文檔的頂部; 在這裏停止算法。

  7. 否則,文檔中沒有指定的部分。

+0

我想我從來沒有考慮過你可以使用散列滾動到除以外的任何其他ID或名稱。我今天學了些新東西。 – Jazzy

1

的HTML 4.01和XHTML 1.0規範要求在a元件的name屬性必須不相同的id屬性中,相同的元件上設置時除外的值,該文件是在錯誤。瀏覽器可以自由應用自己的錯誤處理,這可能是非計劃的。

HTML5草案指定了複雜的錯誤處理規則,但他們還聲明a元素中的name屬性已廢棄。

這將是不合理的(並正式禁止)使用相同的id值兩個元件在同一文件中,作爲非常目的,和唯一的目的,的id是提供一種用於元件的獨特標識符。 <a name=...>構造在HTML歷史上早於id,並且總是意味着在限制的環境中扮演與id相同的角色。因此,自然而然地,它被以同樣的方式對待。