Tôi có nên tạo các HTML HTML với 'name' hoặc 'id' không?


783

Khi một người muốn tham khảo một số phần của trang web bằng http://example.com/#foophương thức "", nên sử dụng một phần

<h1><a name="foo"/>Foo Title</h1>

hoặc là

<h1 id="foo">Foo Title</h1>

Cả hai đều hoạt động, nhưng chúng bằng nhau, hoặc chúng có sự khác biệt về ngữ nghĩa?


2
Liên kết nên thực sự là http://example.com#foo(vì vậy không có / trước #)
Dana

71
Trên thực tế, http://example.com#foohttp://example.com/#footương đương như được định nghĩa trong một trong các RFC trên URI.
Oliver

Câu trả lời:


616

Theo đặc tả HTML 5, 5.9.8 Điều hướng đến một định danh phân đoạn :

Đối với các tài liệu HTML (và loại MIME văn bản / html), phải tuân theo mô hình xử lý sau để xác định phần được chỉ định của tài liệu là gì.

  1. Phân tích cú pháp URL và để cho mảnh vỡ là thành phần <Fragment> của URL.
  2. Nếu mảnh là chuỗi rỗng, thì phần được chỉ định của tài liệu là phần trên cùng của tài liệu.
  3. Nếu có một phần tử trong DOM có ID chính xác bằng mảnh, thì phần tử đầu tiên theo thứ tự cây là phần được chỉ định của tài liệu; dừng thuật toán ở đây
  4. Nếu có một phần tử trong DOM có thuộc tính name có giá trị chính xác bằng mảnh, thì phần tử đầu tiên theo thứ tự cây là phần được chỉ định của tài liệu; dừng thuật toán ở đây
  5. Mặt khác, không có phần nào được chỉ định trong tài liệu.

Vì vậy, nó sẽ tìm kiếm id="foo", và sau đó sẽ làm theoname="foo"

Chỉnh sửa: Như được chỉ ra bởi @hsivonen, trong HTML5, aphần tử không có thuộc tính name. Tuy nhiên, các quy tắc trên vẫn áp dụng cho các yếu tố được đặt tên khác.


76
Không có mối quan hệ hàm ý giữa thuật toán và tính hợp lệ. <a name> không hợp lệ trong HTML5 như dự thảo hiện tại.
hsivonen

13
Trên thực tế, nó không áp dụng cho các "yếu tố được đặt tên" khác. Theo như các thuộc tính tên, nó chỉ áp dụng cho <a name>. Tuy nhiên, thuộc tính đó có thể không được sử dụng bởi các tác giả. Nó chỉ cần được vinh danh bởi các tác nhân người dùng cho các trang HTML cũ hơn.
Anne

19
@RafaelSoares <h1 id="foo">Foo Title</h1>làm việc ngay cả trong IE6 và là một phần của HTML 4.01 đặc điểm kỹ thuật
Aprillion

4
Nó sẽ không tìm tên = "foo" mà là <a name="foo">. Xem liên kết
Daniel Herzog

3
Trong tài liệu HTML5 có a name="foo"và a id="foo"(độc lập với thứ tự của chúng trong trang), Chrome và Firefox sẽ nhảy sang id, nhưng IE (đã thử nghiệm trong 11) và Edge sẽ nhảy đếnname
Alvaro Montoro

182

Bạn không nên sử dụng <h1><a name="foo"/>Foo Title</h1>bất kỳ hương vị nào của HTML được phân phát dưới dạng text/html, vì cú pháp phần tử trống XML không được hỗ trợ text/html. Tuy nhiên, <h1><a name="foo">Foo Title</a></h1>vẫn ổn trong HTML4. Nó không hợp lệ trong HTML5 như dự thảo hiện tại.

<h1 id="foo">Foo Title</h1>là OK trong cả HTML4 và HTML5. Điều này sẽ không hoạt động trong Netscape 4, nhưng có lẽ bạn sẽ sử dụng hàng tá các tính năng khác không hoạt động trong Netscape 4.


6
+1 để nói về hỗ trợ trình duyệt. NS4 có phải là người duy nhất không hỗ trợ url # id => Element.id không?
Hashbrown

14
@Hashbrown Không thể tìm thấy câu trả lời, vì vậy tôi đã thực hiện một số thử nghiệm. Tôi thấy rằng ngay cả các trình duyệt rất cũ cũng xử lý idgiống như namecác neo về các đoạn URL và khả năng tương thích của :targetbộ chọn CSS . Đã thử nghiệm: Chrome 6, Firefox 1.5, IE6, Opera 8.02, Safari 3.1.2, Netscape 7.2, Lynx 2.24 và các trình duyệt di động: Android 2.2, Chrome 26, Dolphin 9.3, Firefox 19, IE10, Safari 4 và Opera Mini 5.1.
Stephen M. Harris

1
@smhmic, mình tìm được một cái. Trình duyệt web Off-By-One nhận ra các neo được xác định thông qua <a name="foo"/> nhưng sẽ không nhận ra các neo được xác định qua <somag id = "foo"> OB1 được cập nhật lần cuối> 8 năm trước. Tác giả của nó tự hào rằng nó "có thể là trình duyệt web nhỏ nhất và nhanh nhất thế giới với sự hỗ trợ HTML 3.2 đầy đủ". Nó tuyên bố hỗ trợ cho Win95 qua XP, nhưng nó hoạt động tốt với Win7 64 bit. Vậy, tại sao lại có một con khủng long như vậy? Tất nhiên, để thử nghiệm, để đảm bảo các trang web của tôi không bị hỏng quá nhiều với các trình duyệt thực sự cổ. Ngoài ra, tôi cũng mang OB1 trên ổ đĩa flash. Nó là nhỏ, khép kín và miễn dịch từ nhiễm trùng.
Dave Burton

26
Đọc điều này trong năm 2016 sẽ như thế nào .. Netscape 4?
ADTC

1
sử dụng `<a name="something" id="something> </a> [ELEMENT để di chuyển đến] có lẽ là tốt nhất bởi vì nó tương thích, và nó không phong cách bất cứ điều gì trong phần tử để di chuyển đến.
JustinCB

52

Tôi phải nói rằng nếu bạn sẽ liên kết đến khu vực đó trong trang ... chẳng hạn như page.html # foo và Foo Title không phải là liên kết bạn nên sử dụng:

<h1 id="foo">Foo Title</h1>

Thay vào đó, nếu bạn đặt một <a>tham chiếu xung quanh nó, tiêu đề của bạn sẽ bị ảnh hưởng bởi một <a>CSS cụ thể trong trang web của bạn. Nó chỉ là đánh dấu thêm, và bạn không cần nó. Tôi thực sự khuyên bạn nên đặt id trên tiêu đề, nó không chỉ được hình thành tốt hơn mà còn cho phép bạn giải quyết đối tượng đó trong Javascript hoặc CSS.


Không chỉ vậy mà tôi đã chiến đấu với một lỗi lạ trong đó hiển thị: không có nội dung nào hiển thị trong IE. Không có bất kỳ ý tưởng nào về một điểm tấn công, tôi đã ném nó vào một trình xác nhận hợp lệ gắn cờ <a name="foo"> các mục để tôi thay đổi chúng - và bây giờ màn hình hiển thị: không có gì hoạt động tốt.
Loren Pechtel

Điều này là quá đủ, không có thẻ neo cần thiết cho hiệu quả.
Wallace Sidhrée

27

Wikipedia sử dụng rất nhiều tính năng này như thế này:

<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>

Và Wikipedia đang làm việc cho tất cả mọi người, vì vậy tôi sẽ cảm thấy an toàn khi gắn bó với hình thức này.

Cũng đừng quên, bạn có thể sử dụng điều này không chỉ với các nhịp mà còn với các div hoặc thậm chí các ô của bảng, và sau đó bạn có quyền truy cập vào lớp giả: đích trên phần tử. Chỉ cần xem ra để không thay đổi chiều rộng, như với văn bản in đậm, gây ra di chuyển nội dung xung quanh, đó là đáng lo ngại.

Neo được đặt tên - phiếu bầu của tôi là để tránh:

  • "Tên và id nằm trong cùng một không gian tên ..." - Hai thuộc tính có cùng không gian tên thật điên rồ. Hãy nói rằng đã phản đối rồi.
  • "Các phần tử neo không có thuộc tính" - Một lần nữa, bản chất của một phần tử (siêu liên kết hay không) được xác định bằng cách có một thuộc tính?! Nhân đôi điên cuồng. Thông thường nói để tránh nó hoàn toàn.
  • Nếu bạn từng tạo kiểu cho một neo mà không có lớp giả, kiểu dáng sẽ áp dụng cho từng cái. Trong CSS3, bạn có thể giải quyết vấn đề này bằng các bộ chọn thuộc tính (hoặc cùng kiểu dáng cho mỗi giả kính), nhưng vẫn là một cách giải quyết. Điều này thường không xuất hiện bởi vì bạn chọn màu cho mỗi lớp giả và phần gạch chân hiện diện theo mặc định nó chỉ có ý nghĩa để loại bỏ, điều này làm cho nó giống với văn bản khác. Nhưng bạn đã bao giờ quyết định làm cho các liên kết của bạn đậm, nó sẽ gây rắc rối.
  • Netscape 4 có thể không hỗ trợ tính năng id, nhưng vẫn là một thuộc tính không xác định sẽ không gây ra rắc rối nào. Đó là những gì gọi là khả năng tương thích với tôi.

1
Đề xuất chỉnh sửa dấu đầu dòng 3 trên 4: Nếu bạn từng tạo kiểu, a {color:red}nó sẽ tô màu cả các liên kết <a href> VÀ các đoạn <a name> của bạn. Bạn có thể giải quyết vấn đề này với các lớp giả a:link {color:red]}hoặc bộ chọn thuộc tínha:not([href]) {color:red;}
Bob Stein

Bạn nói đúng, nhưng đối với tôi, viên đạn 3 nói chính xác điều này. Có thể là tiếng Anh của tôi mặc dù ...
Zoltán Morvai

Cuối cùng, tôi đã có quan điểm của bạn: "Nếu bạn từng tạo kiểu cho một mỏ neo mà không có lớp giả, kiểu dáng sẽ áp dụng cho từng loại." Mơ hồ: Bạn có thể nghĩ "mỗi giả hành". Đúng. Nhưng tôi đã nghĩ đến "mỗi trường hợp" về việc sử dụng một neo, có nghĩa là và href-ed. Làm rõ. :) Không cần chỉnh sửa sau bình luận của bạn, nhưng tôi có thể nếu bạn nhấn mạnh. Nhưng nó cũng không dễ xảy ra với màu sắc, vì bạn thường có ý định giữ chúng khác nhau, nhưng vẫn giống nhau với trọng lượng phông chữ ...
Zoltán Morvai

rất thích đọc bình luận của bạn @ ZoltánMorvai. "double crazy" và "Netscape 4" doubleplusgood.
Randy L

1
Hai thuộc tính có cùng không gian tên là điên - không thực sự. Khi thực hiện nội dung do người dùng tạo, sẽ rất hữu ích khi có thể chỉ định nội dung nào đó dưới dạng liên kết phân đoạn <a name="heading1"></a> ... document.html#heading1mà không đặt ID, vì ID có thể xung đột với một ID khác trên trang. Thật xấu hổ khi họ không đưa namethuộc tính vào HTML5.
Jez

14
<h1 id="foo">Foo Title</h1>

là những gì nên được sử dụng. Đừng sử dụng neo trừ khi bạn muốn có một liên kết.


Giống hệt câu trả lời của Tim Knight, được đăng nửa năm trước bài này. -1
Luc

13

Dành cho người dùng JavaScript: tất cả các ID trở thành biến toàn cục dưới cửa sổ .

<h1 id="foo">Foo Title</h1>

Chỉ cần tạo toàn cầu JS:

window.foo

Giá trị của window.foosẽ là HTMLElementcho h1.

Trừ khi bạn có thể đảm bảo tất cả các giá trị được sử dụng trong idcác thuộc tính đều an toàn, bạn có thể thích bám vào name:

<h1 name="foo">Foo Title</h1>

12
Tin tốt là bạn không thể ghi đè các chức năng được xác định trong window. Ví dụ, <div id="open"></div>sẽ không ghi đè chức năng window.open.
Flimm

8

Không có sự khác biệt về ngữ nghĩa; xu hướng trong các tiêu chuẩn là hướng tới việc sử dụng idchứ không phải name. Tuy nhiên, có những khác biệt có thể khiến người ta thích nametrong một số trường hợp. Đặc tả HTML 4.01 cung cấp các gợi ý sau :

Sử dụng idhay name? Tác giả nên xem xét các vấn đề sau đây khi quyết định nên sử dụng idhoặc namecho một tên neo:

  • Thuộc tính id có thể hoạt động không chỉ là một tên neo (ví dụ: bộ chọn biểu định kiểu, mã định danh xử lý, v.v.).
  • Một số tác nhân người dùng cũ không hỗ trợ các neo được tạo bằng thuộc tính id.
  • Thuộc tính name cho phép tên neo phong phú hơn (với các thực thể).

14
Để rõ ràng, khi họ nói "tác nhân người dùng cũ", họ có nghĩa là THỰC SỰ tác nhân người dùng cũ. Tôi sẽ không lo lắng về điều đó.
Eli

1
HTML5 cũng cho phép ID ID phong phú của Wikipedia. Có ai có số phiên bản trình duyệt có thị phần lớn hơn 0,1% mà không thể xử lý các đoạn id neo không? - Hay là khủng long Netscape 4.7 thực sự là loài lây lan nhất?
Robert Siemer

7
FWIW, tôi không thể có idcác neo hoạt động trong Safari cho iOS 5, vì vậy, không chỉ các trình duyệt đã "thực sự cũ" trong '09. Tôi đã phải thêm names để trang web của tôi hoạt động chính xác trên iPad. Điều này có thể đã được khắc phục ngay bây giờ, tôi không sở hữu bất kỳ thiết bị iOS 6 nào để kiểm tra.
Daniel Saner

@DanielSaner thật sao? vì vậy en.wikipedia.org/wiki/IPad#Appluggest không hoạt động trên iPad của bạn?
Aprillion

1
@DanielSaner Tôi đã sử dụng trình giả lập để kiểm tra Mobile Safari 5.0 & 5.1 và Trình duyệt Android 2.2 & 2.3 và các idneo dường như hoạt động phổ biến. Nếu ví dụ đơn giản này không hoạt động trên điện thoại di động của bạn, tôi sẽ kiểm tra cài đặt trợ năng của thiết bị. (@deathApril Trang web dành cho thiết bị di động Wikipedia có Javascript có hiệu quả khiến đoạn URL bị bỏ qua.)
Stephen M. Harris

8

Phương thức ID sẽ không hoạt động trên các trình duyệt cũ hơn, phương thức tên neo sẽ không được dùng trong các phiên bản HTML mới hơn ... Tôi sẽ sử dụng id.


2
Bạn có một nguồn cho những tuyên bố đó? Đừng hiểu lầm tôi; Tôi thường chỉ quan tâm.
Henrik Paul

11
Điều đó không làm sáng tỏ trên mạng sẽ không hoạt động trên các trình duyệt cũ hơn. - Những trình duyệt này là gì, ngoài Netscape 4 ??
Robert Siemer

3
Tôi đã thử sử dụng id trên div và nó hoạt động ngay cả trong IE 7. Mặc dù vậy, không thể kiểm tra trong IE 6 .. nhưng hiện tại ai đang sử dụng IE 6 ...
Gilly

@deathApril trong một số trường hợp nhất định (phụ thuộc vào HASLAYOUT) đó là lỗi.
Knu

@RobertSiemer Hoạt động gần như toàn cầu - xem nhận xét của tôi dưới câu trả lời này .
Stephen M. Harris

3

Tôi có một trang web bao gồm một số container div xếp theo chiều dọc, giống hệt nhau về định dạng và chỉ khác nhau về số sê-ri. Tôi muốn ẩn neo tên ở đầu mỗi div, vì vậy giải pháp kinh tế nhất hóa ra là bao gồm neo như một id trong thẻ div mở, nghĩa là,

<div id="[serial number]" class="topic_wrapper">

2

Chỉ cần quan sát về đánh dấu Biểu mẫu đánh dấu trong các phiên bản trước của HTML đã cung cấp một điểm neo. Các hình thức đánh dấu trong HTML5 bằng cách sử dụng thuộc tính id, trong khi hầu hết tương đương, yêu cầu một yếu tố để xác định, hầu như tất cả chúng thường được dự kiến ​​chứa nội dung.

Chẳng hạn, một khoảng trống hoặc div có thể được sử dụng, nhưng cách sử dụng này có vẻ và có mùi thoái hóa.

Một suy nghĩ là sử dụng yếu tố wbr cho mục đích này. Wbr có một mô hình nội dung trống và chỉ đơn giản tuyên bố rằng có thể ngắt dòng; đây vẫn là một cách sử dụng thẻ đánh dấu một cách vô cớ, nhưng ít hơn nhiều so với các phân chia tài liệu vô cớ hoặc các đoạn văn bản trống.


Đó là một điểm hay. Thông tin thêm về wbr: w3.org/TR/html-markup/wbr.html Sử dụng <wbr id="foo" />thay vì<a name="foo"></a>
Luke

1

Mẫu thứ hai gán một ID duy nhất cho thành phần được đề cập. Phần tử này sau đó có thể được thao tác hoặc truy cập bằng cách sử dụng DHTML.

Mặt khác, vị trí đầu tiên, đặt một vị trí được đặt tên trong tài liệu, gần giống với dấu trang. Được gắn vào một "mỏ neo", nó có ý nghĩa hoàn hảo.


1

Trong html 5, id=""thuộc tính xác định một mã định danh duy nhất cho một phần tử, cũng là một neo cho một liên kết phân đoạn. Trong các tiêu chuẩn html trước đó, name=""thuộc tính của <a>phần tử xác định một neo cho liên kết phân đoạn. Tôi đề nghị một cái gì đó như:
<a name="foo" id="foo"></a><h1>Foo Title</h1>
Bởi vì hỗ trợ choid="" thuộc tính này hơi khó hiểu (mặc dù các bản phát hành mới nhất của tất cả các trình duyệt chính đều hỗ trợ nó, các bản phát hành không quá vài năm tuổi [Và tốt nhất là không phá vỡ thứ gì đó nếu không có lý do chính đáng để]). Nó tương thích, và nó không tạo kiểu bất cứ thứ gì trong phần tử liên kết, cho việc đóng </a> vẫn nằm ngoài phần tử, nhưng nó vẫn hợp lệ trong tất cả các tiêu chuẩn hiện tại.

Hãy chắc chắn rằng các thuộc tính name=""id=""các <a>yếu tố là như nhau.


2
Không phải mọi thứ sử dụng HTML đều là trình duyệt. Tôi đang sử dụng thư viện Java hiển thị thông tin trong cửa sổ bằng HTML. Đây là phương pháp duy nhất có hiệu quả. Đó là namethuộc tính trên thẻ neo được yêu cầu; đặt thuộc tính vào một hNhoặc spankhông làm việc.
Sao Hỏa

0

Làm thế nào về việc sử dụng thuộc tính name cho các trình duyệt cũ và thuộc tính id cho các trình duyệt mới. Cả hai tùy chọn sẽ được sử dụng và phương thức dự phòng sẽ được thực hiện theo mặc định !!!


-3

Toàn bộ khái niệm "neo có tên" sử dụng thuộc tính name, theo định nghĩa. Bạn chỉ nên sử dụng tên, nhưng thuộc tính ID có thể có ích cho một số tình huống javascript.

Như trong các bình luận, bạn luôn có thể sử dụng cả hai để cá cược.


Khi sử dụng cả hai, id: s và tên có phải là duy nhất trên toàn cầu không? như trong, tôi có thể sử dụng cùng một chuỗi cho cả id và tên không?
Henrik Paul

Bạn có thể, nhưng một số người nghĩ rằng đó là thực tế xấu.
Pháo đài Alex

9
Theo đặc tả HTML, nếu cả hai đều có mặt, tên và id phải giống hệt nhau. Nó cũng nói rằng tên và id nằm trong cùng một không gian tên. Dịch vụ trình xác nhận HTML không kiểm tra những điều này và tôi nghi ngờ các trình duyệt quan tâm, nhưng dường như chúng có những hướng dẫn tốt để tuân theo.
erickson

3
Xác định lại thực tế! <một tên ... đã bị bệnh ngay từ đầu và kiểu dáng liên kết CSS làm cho nó thậm chí còn nặng hơn.
Robert Siemer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.