Thẻ neo không có thuộc tính href có an toàn không?


232

Có ổn không khi sử dụng thẻ neo mà không bao gồm hrefthuộc tính và thay vào đó sử dụng trình xử lý sự kiện nhấp vào JavaScript? Vì vậy, tôi sẽ bỏ qua hrefhoàn toàn, thậm chí không có nó trống ( href="").


1
Sự kiện onclick vẫn kích hoạt mặc dù? Tôi muốn sử dụng thẻ neo thay vì span / div vì đây là thẻ hợp lý duy nhất hỗ trợ CSS: hover trong IE
john

3
@Martin ANCHORS có thể được truy cập và kích hoạt thông qua bàn phím. Yếu tố SPAN thông thường không thể. Xem tại đây: jsfiddle.net/simevidas/4DTxv/2
Šime Vidas


2
Trong HTML5, các neo không có thuộc tính href là các siêu liên kết giữ chỗ: dev.w3.org/html5/markup/a.html
Ignacio Lago

1
Bạn có chắc chắn không muốn có một nút thay thế? Điều này có nghĩa là việc gắn thẻ vv hoạt động và bạn có thể tạo kiểu cho các nút của mình trông giống như các liên kết nếu cần thiết. Phải thừa nhận rằng tôi không biết về di chuột trong IE.
robbie_c

Câu trả lời:


217

Trong HTML5, sử dụng một aphần tử không có hrefthuộc tính là hợp lệ. Nó được coi là một "siêu liên kết giữ chỗ."

Thí dụ:

<a>previous</a>

Tìm "siêu liên kết giữ chỗ" trên trang tham chiếu thẻ neo w3c: https://www.w3.org/TR/2016/REC-html51-20161101/textlevel-semantics.html#the-a-element .

Và nó cũng được đề cập trên wiki ở đây: https://www.w3.org/wiki/Elements/a

Liên kết giữ chỗ dành cho các trường hợp bạn muốn sử dụng phần tử neo, nhưng không có nó điều hướng ở bất cứ đâu. Điều này rất hữu ích để đánh dấu trang hiện tại trong menu điều hướng hoặc đường dẫn bánh mì. (Cách tiếp cận cũ sẽ là sử dụng thẻ span hoặc thẻ neo với một lớp có tên là "hoạt động" hoặc "hiện tại" để tạo kiểu cho nó và JavaScript để hủy điều hướng.)

Liên kết giữ chỗ cũng hữu ích trong trường hợp bạn muốn tự động đặt đích của liên kết qua JavaScript khi chạy. Bạn chỉ cần đặt giá trị của thuộc tính href và thẻ neo trở nên có thể nhấp được.

Xem thêm:


3
Định nghĩa của một "liên kết giữ chỗ" là gì?
Gyum Fox

14
Hãy lưu ý rằng nếu không có một hrefsự cursor: pointerphong cách sẽ không được tự động thêm vào nguyên tố này.
Lu-ca

38

Không sao, nhưng đồng thời có thể khiến một số trình duyệt bị chậm.

http://webdesignfan.com/yslow-tutorial-part-2-of-3-reducing-server-calls/

Lời khuyên của tôi là sử dụng <a href="#"> </a>

Nếu bạn đang sử dụng JQuery, hãy nhớ sử dụng:

.click(function(event){
    event.preventDefault();
    // Click code here...
});

7
Tôi không thể sử dụng href = "#" vì tôi đang sử dụng đánh dấu ajax liên quan đến việc thay đổi hàm băm, tôi phải làm gì?
John

5
Thay vì sử dụng javascript: void (0); bên trong href tôi sử dụng javascript:; nó ngắn hơn để viết.
minh

16
Hình phạt hiệu suất chỉ áp dụng nếu bạn thực sự chỉ định một thuộc tính trống href. Câu hỏi cho biết không có thuộc tính no href nào cả.
Pete B

18
Trên thực tế, theo bài viết (và nó có ý nghĩa) hình phạt hiệu suất tiềm năng chỉ áp dụng cho các thuộc tính src trống . Nó không nói bất cứ điều gì về hiệu năng-khôn ngoan về các thuộc tính trống.
bergie3000

1
Xin chào @Gunnar, liên kết dường như không còn nữa. Bạn có một tài liệu tham khảo cho yêu cầu?
dùng31782

25

Câu trả lời ngắn gọn: Không.

Câu trả lời dài:

Đầu tiên, không có thuộc tính href, nó sẽ không phải là một liên kết. Nếu đó không phải là một liên kết thì nó sẽ không phải là bàn phím (hoặc công tắc hơi thở, hoặc nhiều thiết bị đầu vào không dựa trên con trỏ khác) có thể truy cập được (trừ khi bạn sử dụng các tính năng HTML 5 tabindexkhông được hỗ trợ chung). Rất hiếm khi điều khiển không có quyền truy cập bàn phím.

Thứ hai. Bạn nên có một giải pháp thay thế khi JavaScript không chạy (vì tải chậm từ máy chủ, kết nối Internet bị ngắt (ví dụ: tín hiệu di động trên tàu di chuyển), JS bị tắt, v.v.).

Sử dụng tăng cường lũy ​​tiến bằng cách sử dụng JS không phô trương.


Vấn đề là, tôi muốn một cái gì đó tôi có thể đính kèm một sự kiện nhấp chuột bằng phương thức "nhấp chuột" của jQuery, nó cũng được tô sáng và gạch chân như một liên kết khi con chuột lăn qua nó. Còn gì nữa, ngoài thẻ neo không có mã có thể thực hiện điều đó mà không cần CSS? (tức là as-is mà không cần thêm thủ công tương tác cơ bản đó, trong khi vẫn giữ được tính đơn giản của việc gán chức năng nhấp trực tiếp qua jQuery).
Triynko

@Triynko - Sử dụng một liên kết, nhưng làm điều đó đúng. Xem dòng cuối cùng của câu trả lời.
Quentin

5
Các thẻ Tabindex trên 'a' đã hợp lệ kể từ HTML4 (ít nhất) w3schools.com/tags/att_global_tabindex.asp
technoTarek

@technoTarek - Có, nhưng hreflà bắt buộc (trừ khi đó là một mỏ neo có tên trong trường hợp tabindex không có ý nghĩa). Việc sử dụng tabindexđể thêm các yếu tố không thể tập trung vào thứ tự tab là một cải tiến mới trong HTML 5.
Quentin

4
Điều này chỉ đơn giản là sai. Cho dù bạn đang tham khảo một thông số cũ hơn cho HTML vào thời điểm đó, tôi không thể nói, nhưng theo thông số HTML5, điều đó thực sự hoàn toàn hợp lệ khi có một athẻ không có hrefthuộc tính.
michael

23

Nếu bạn phải sử dụng href để có khả năng tương thích ngược, bạn cũng có thể sử dụng

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

thay vì #, nếu bạn không muốn sử dụng thuộc tính


1
Tôi cần một thẻ <a> hoạt động giống như một liên kết trong tất cả ngoại trừ chức năng. Điều này đã lừa tôi.
Jad S

13

Thẻ này là tốt để sử dụng mà không có thuộc tính href. Trái với nhiều câu trả lời ở đây, thực sự có những lý do tiêu chuẩn để tạo ra một mỏ neo khi không có href. Về mặt ngữ nghĩa, "a" có nghĩa là một mỏ neo hoặc một liên kết. Nếu bạn sử dụng nó cho bất cứ điều gì theo ý nghĩa đó, thì bạn vẫn ổn.

Một cách sử dụng tiêu chuẩn của thẻ mà không có href là tạo các liên kết được đặt tên. Điều này cho phép bạn sử dụng một neo với name = blah và sau này bạn có thể tạo một neo với href = # blah để liên kết đến phần được đặt tên của trang hiện tại. Tuy nhiên, điều này đã không được chấp nhận vì bạn cũng có thể sử dụng ID theo cách tương tự. Ví dụ: bạn có thể sử dụng thẻ tiêu đề với id = title và sau đó bạn có thể có một neo trỏ tới href = # tiêu đề.

Quan điểm của tôi, tuy nhiên, không đề xuất sử dụng thuộc tính tên. Chỉ cung cấp một trường hợp sử dụng khi bạn không cần href, và do đó lý do tại sao không cần thiết.


2
Tôi nghĩ câu hỏi đang cố gắng hỏi và câu trả lời khác đang trả lời là gì, liệu có an toàn khi bỏ qua hrefthuộc tính cho một <a>yếu tố được sử dụng làm yếu tố tương tác (tức là liên kết). Như bạn đã đề cập, không có hrefthuộc tính, nó hoàn toàn đơn giản ... không phải là một liên kết, chỉ là một mỏ neo, đó là một điều hoàn toàn khác.
BoltClock

1
Đúng, nhưng - chỉ để nhấn mạnh - thẻ <a> vẫn hợp lệ trong các trường hợp sử dụng này.
đơn sắc

9

Từ góc độ khả năng truy cập <a>mà không có a href thì không thể có tab, tất cả các liên kết phải có khả năng tab, vì vậy hãy thêm tabindex = '0 "nếu bạn không có a href.


1
Hoặc sử dụng nút nếu nó sẽ thực hiện hành động trong trang thay vì chuyển hướng.
SimonDever

8

Các <a>thẻ nếu không có sự "href" có thể được thuận tiện khi sử dụng menu đa cấp và bạn cần phải mở rộng cấp độ tiếp theo nhưng không muốn điều đó nhãn menu để trở thành một liên kết hoạt động. Tôi chưa bao giờ có bất kỳ vấn đề sử dụng nó theo cách đó.


1
Bạn đã thử truy cập menu đó bằng bàn phím chưa?
aij

Tôi chỉ phát hiện ra rằng trên IE, nếu bạn di chuột qua một số liên kết và một liên kết là neo mà không có href, cửa sổ bật lên nhỏ với URL bên dưới vẫn ở đó, hiển thị url trước đó, thay vì biến mất. Neo không thể nhấp được mặc dù vậy, nó không phải là vấn đề lớn, nhưng đủ để tôi đi với một div thay thế.
Andrew

1

Trong một số trình duyệt, bạn sẽ gặp vấn đề nếu bạn không cung cấp thuộc tính href. Tôi đề nghị bạn viết mã của bạn một cái gì đó như thế này:

<a href="#" onclick="yourcode();return false;">Link</a>

bạn có thể thay thế yourcode () bằng hàm hoặc logic của riêng bạn, nhưng hãy nhớ thêm return false; tuyên bố ở cuối


Tôi đang sử dụng Backbone.js với Backbone.Router và có #cho trang chỉ mục. Đối với một số liên kết thanh điều hướng của tôi, tôi không muốn kích hoạt tuyến đường #xảy ra nếu bạn sử dụng a href="#"chính nó. Việc sử dụng <a href="#" onclick="return false;"dừng tuyến đường được kích hoạt nhưng sự kiện nhấp vẫn xuất hiện trên trình xử lý của tôi (sử dụng các sự kiện DOM được nối thông qua jQuery và Backbone.Radio). Cảm ơn @ shashwat13 :)
David Williamson
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.