2012-05-06 11 views
5

ハッシュのリスナーを使用してコンテンツDIVを表示および非表示にし、同じ名前の名前付きアンカーにスクロールするサイトで作業しています。DIV IDと同じ名前の名前付きアンカー(A)

アンカーにスクロールする代わりに、アンカーの名前と同じ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> 

は期待通りに動作していない:2番目の例では

<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 spec](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が空の文字列の場合、 文書の指定された部分が文書の先頭になります。ここでアルゴリズムを停止してください。 UTF-8で定義されている Unicode文字に有効なUTF-8シーケンスのあるfragidに パーセントエンコードオクテットの任意のシーケンスを展開した結果であるfragidデコード

  3. てみましょう。その文字列のパーセントコード化された オクテットが有効なUTF-8シーケンスではない場合(たとえば、 が代理コードポイントに拡張されている場合)、このステップをスキップして次の をスキップします。このステップはスキップされなかったと 復号fragidに正確に等しいIDを有することがDOMの要素が存在する場合

  4. 、次いで、ツリー順で最初のそのような 要素は、文書の指示された部分です。アルゴリズムはここで 停止してください。

  5. 値fragidに正確に等しい(fragid復号されない)、name属性を有しているDOMの要素がある場合、ツリー順に 最初のそのような要素は 文書の指示された部分であります;ここでアルゴリズムを停止してください。

  6. fragidが文字列トップのASCII大文字小文字を区別しない一致である場合、 の場合、ドキュメントの指定された部分がドキュメントの先頭になります。 ここでアルゴリズムを停止します。

  7. それ以外の場合は、記載されていない部分があります。

+0

私は、あなたがIDまたは以外の何かの名前にスクロールするためにハッシュを使用することができるとは思わなかったと思います。私は今日何か新しいことを学んだ。 – Jazzy

1

4.01とXHTML 1.0の仕様は同じ要素に設定すると、文書が入っている以外a要素でname属性は、id属性の値と同じであってはならないことを要求HTMLエラー。ブラウザは独自のエラー処理を自由に適用することができますが、これはむしろ計画できません。

HTML5ドラフトでは、複雑なエラー処理ルールを指定していますが、a要素のname属性も廃止予定であると宣言しています。

非常に目的、及び唯一の目的として、idの要素の一意識別子を提供することで、同じ文書内の二つの要素に同じid値を使用することは不合理(正式禁止)であろう。 <a name=...>構成は、HTMLの履歴にあるidよりも前であり、常に制限された設定でidと同じ役割を果たすことを意味していました。したがって、それは同じように扱われることは当然である。

関連する問題