Hợp lệ để sử dụng <a> (thẻ neo) mà không có thuộc tính href?


152

Tôi đã sử dụng Twitter Bootstrap để xây dựng một trang web và rất nhiều chức năng của nó phụ thuộc vào việc gói mọi thứ vào <a>, ngay cả khi họ sẽ thực thi Javascript. Tôi đã gặp vấn đề với href="#"chiến thuật mà tài liệu của Bootstrap đề xuất, vì vậy tôi đã cố gắng tìm một giải pháp khác.

Nhưng sau đó tôi đã cố gắng loại bỏ hrefhoàn toàn thuộc tính. Tôi đã sử dụng <a class='bunch of classes' data-whatever='data'>và có Javascript xử lý phần còn lại. Và nó hoạt động.

Tuy nhiên, một cái gì đó nói với tôi rằng tôi không nên làm điều này. Đúng? Ý tôi là, về mặt kỹ thuật <a>được cho là một liên kết đến một cái gì đó, nhưng tôi không hoàn toàn chắc chắn tại sao đây là một vấn đề. Hoặc là nó?


Câu trả lời:


245

Phần <a>tử nchor chỉ đơn giản là một neo đến hoặc từ một số nội dung. Ban đầu, đặc tả HTML được phép cho các neo được đặt tên ( <a name="foo">) và các neo được liên kết ( <a href="#foo">).

Định dạng neo được đặt tên ít được sử dụng hơn, vì định danh phân đoạn hiện được sử dụng để chỉ định một [id]thuộc tính (mặc dù để tương thích ngược, bạn vẫn có thể chỉ định [name]các thuộc tính). Một <a>phần tử không có [href]thuộc tính vẫn hợp lệ .

Theo như ngữ nghĩa và kiểu dáng có liên quan, <a>phần tử không phải là một liên kết ( :link) trừ khi nó có một [href]thuộc tính. Một tác dụng phụ của điều này là một <a>phần tử mà [href]không được đặt theo thứ tự tab theo mặc định.

Câu hỏi thực sự là liệu một <a>phần tử có phải là một đại diện thích hợp của a <button>. Ở cấp độ ngữ nghĩa, có một sự khác biệt rõ ràng giữa a linkvà a button.

Nút là một cái gì đó khi nhấp vào gây ra một hành động xảy ra.

Liên kết là một nút gây ra sự thay đổi trong điều hướng trong tài liệu hiện tại. Điều hướng xảy ra có thể được di chuyển trong tài liệu trong trường hợp định danh phân đoạn ( #foo) hoặc chuyển sang tài liệu mới trong trường hợp url ( /bar).

Vì các liên kết là một loại nút đặc biệt, chúng thường có các hành động được ghi đè để thực hiện các chức năng thay thế. Tiếp tục sử dụng một neo như một nút là ok từ quan điểm nhất quán, mặc dù nó không hoàn toàn chính xác về mặt ngữ nghĩa.

Nếu bạn lo ngại về ngữ nghĩa và khả năng truy cập của việc sử dụng một <a>yếu tố (hoặc <span>, hoặc <div>) làm nút, bạn nên thêm các thuộc tính sau:

<a role="button" tabindex="0" ...>...</a>

Các vai trò nút cho người dùng biết rằng các yếu tố cụ thể đang được coi là một nút như một ghi đè cho bất cứ điều gì ngữ nghĩa các yếu tố cơ bản có thể có.

Đối với <span><div>các thành phần, bạn có thể muốn thêm trình nghe khóa JavaScript cho Spacehoặc Enterđể kích hoạt clicksự kiện. <a href><button>các phần tử làm điều này theo mặc định, nhưng các phần tử không có nút thì không. Đôi khi nó có ý nghĩa hơn để liên kết clickkích hoạt với một khóa khác. Ví dụ: nút "trợ giúp" trong ứng dụng web có thể bị ràng buộc F1.


1
@Zacqary, [role="button"]không làm gì cụ thể, bạn vẫn cần lắng nghe sự kiện nhấp chuột (nhưng dù sao bạn cũng sẽ làm điều đó để tạo nút JS). Nó có nghĩa là được sử dụng để điều hướng được hỗ trợ (còn gọi là trình đọc màn hình) để trình đọc màn hình biết đại diện cho phần tử dưới dạng nút chứ không phải giá trị ngữ nghĩa ban đầu của nó. Thêm [tabindex]các yếu tố để thứ tự tab. Trong trường hợp đặc biệt, bạn có thể không thực sự muốn / cần nút điều hướng theo thứ tự tab, vì vậy đây là một thuộc tính tùy chọn. Các yếu tố đã là nút không cần [role="button"]vì nó dư thừa.
zzzzBov

HTML có hợp lệ để có thẻ neo không có href và không có tên không? Trong ứng dụng của chúng tôi, chúng tôi có một số liên kết xóa bị vô hiệu hóa (do đó thuộc tính no href), nhưng vẫn hiển thị cho người dùng.
Joshua Muheim


Chỉ muốn thêm một lưu ý rằng nếu bạn đang sử dụng điều này để tạo 'nút' cho các hành động javascript ... việc xóa hoàn toàn thuộc tính href cũng sẽ khiến Chrome (và có thể các trình duyệt khác) ngừng thay đổi con trỏ khi di chuột qua. Rõ ràng điều này rất dễ dàng để thêm lại bằng CSS - nhưng chỉ cần một cái đầu lên.
Mir

@Mir, nếu bạn không sử dụng [href], có lẽ bạn nên sử dụng <span>nút cho.
zzzzBov

45

Tôi nghĩ bạn có thể tìm thấy câu trả lời của mình ở đây: Thẻ neo không có thuộc tính href có an toàn không?

Ngoài ra nếu bạn muốn không có hoạt động liên kết với href, bạn có thể sử dụng nó như:

<a href="javascript:void(0);">something</a>

3
Nên thực sự làjavascript:undefined
rybo111

2
@ rybo111 bạn đúng nhưng tôi vẫn thích void (0); về cơ bản vì nó trông tốt hơn. Tôi không thích khách hàng của mình xem mọi thứ là "không xác định" ;-)
Alex

9
<a href="javascript:;">text</a>?
diynevala

javascript:;được sử dụng để phá vỡ những thứ như hiệu ứng cuộn qua và thậm chí hoạt ảnh gif trong IE6. Và đối với không có hoạt động liên kết, có các yếu tố HTML chuyên dụng như button. Đồng thời, những thứ như liên kết AJAX có thể sử dụng hrefs của chúng cho các hành động dự phòng nếu JS thất bại.
Ilya Streltsyn

14

Có, nó là hợp lệ để sử dụng thẻ neo mà không có hrefthuộc tính.

Nếu aphần tử không có hrefthuộc tính, thì phần tử đó đại diện cho một trình giữ chỗ cho nơi liên kết có thể được đặt, nếu nó có liên quan, chỉ bao gồm nội dung của phần tử.

Có, bạn có thể sử dụng classvà các thuộc tính khác, nhưng bạn không thể sử dụng target, download, rel, hreflang, vàtype .

Các target, download, rel, hreflang, và typecác thuộc tính phải được bỏ qua nếu thuộc tính href là không có mặt.

Về phần " Tôi có nên không? ", Xem phần trích dẫn đầu tiên: " nơi liên kết có thể được đặt nếu nó có liên quan ". Vì vậy, tôi sẽ hỏi " Nếu tôi không có JavaScript, tôi có sử dụng thẻ này làm liên kết không? ". Nếu câu trả lời là có, thì có, bạn nên sử dụng <a>mà không cần href. Nếu không, thì tôi vẫn sẽ sử dụng nó, bởi vì năng suất quan trọng đối với tôi hơn là ngữ nghĩa trường hợp cạnh, nhưng đây chỉ là ý kiến ​​cá nhân của tôi.

Ngoài ra, bạn nên coi chừng các hành vikiểu dáng khác nhau (ví dụ: không gạch chân, không con trỏ con trỏ, không phải a :link).

Nguồn: Khuyến nghị HTML5 của W3C


Đó không phải là quá nhiều về "ngữ nghĩa trường hợp cạnh" mà là về khả năng tiếp cận, điều đó đảm bảo rằng người khuyết tật có thể sử dụng và hiểu nội dung của một trang web
neiya

3

Nó hợp lệ. Bạn có thể, ví dụ, sử dụng nó để hiển thị các phương thức (hoặc những thứ tương tự đáp ứng data-toggledata-targetthuộc tính).

Cái gì đó như:

<a role="button" data-toggle="modal" data-target=".bs-example-modal-sm" aria-hidden="true"><i class="fa fa-phone"></i></a>

Ở đây tôi sử dụng biểu tượng phông chữ tuyệt vời, tốt hơn là một athẻ hơn là một button, để hiển thị một phương thức. Ngoài ra, cài đặt role="button"làm cho con trỏ thay đổi thành một loại hành động. Không có hrefhoặc role="button", con trỏ con trỏ không thay đổi.


2
Bạn nên sử dụng một nút trong trường hợp này. Nó phù hợp hơn từ cả hai quan điểm ngữ nghĩa và khả năng tiếp cận. Neo sẽ đưa bạn đến một nơi nào đó, không thực hiện một hành động. Ngoài ra, tại sao bạn ẩn toàn bộ neo với aria-hidden? Biểu tượng, có thể, nhưng người dùng trình đọc màn hình không nên có trải nghiệm giảm bớt.
isherwood
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.