Là một href href hợp lệ?


179

Một trong những nhà phát triển web của chúng tôi sử dụng html sau đây làm trình giữ chỗ để tạo kiểu cho danh sách thả xuống.

<a href="" class="arrow"></a>

Đây có được coi là thẻ neo hợp lệ không?

Vì không có giá trị href, nó hiển thị như bị hỏng trên một số báo cáo kiểm tra liên kết của chúng tôi.


10
Nó không hoạt động trong IE! Vâng, nó hoạt động trong IE nhưng với một hành vi hoàn toàn khác, chống lại thông số kỹ thuật. Vì vậy, nó là hợp lệ cho mỗi thông số, nhưng không phải trong thực tế: (((
ZhongYu

Mở rộng trên những gì bayou.io đã nói, IE liên kết đến thư mục phía trên tài liệu: stackoverflow.com/questions/7966791/ chủ
Nate

1
Có, một href trong các phiên bản IE cũ hơn (7/8, v.v.) có thể gây ra hậu quả xấu, chẳng hạn như danh sách thư mục. Có rất nhiều tài liệu về chủ đề này nếu bạn google nó
Ringo

ví dụ: gtmetrix.com/avoid-empty-src-or-href.html . Đừng bận tâm chỉ các trình duyệt cũ, nó ảnh hưởng đến các trình duyệt IE, Edge và Webkit hiện tại.
Ringo

Câu trả lời:


60

Mặc dù câu hỏi này đã được trả lời ( tl; dr: yes, một hrefgiá trị trống là hợp lệ), không có câu trả lời nào hiện có tham khảo các thông số kỹ thuật có liên quan.

Một chuỗi rỗng không thể là một URI. Tuy nhiên, hrefthuộc tính không chỉ lấy URI làm giá trị mà còn tham chiếu URI. Một chuỗi rỗng có thể là một tham chiếu URI.

HTML 4.01

HTML 4.01 sử dụng RFC 2396 , trong đó nói trong phần 4.2. Tài liệu tham khảo cùng tài liệu (phần nhấn mạnh của tôi):

Tham chiếu URI không chứa URI là tham chiếu đến tài liệu hiện tại. Nói cách khác, một tham chiếu URI trống trong tài liệu được hiểu là một tham chiếu đến phần đầu của tài liệu đó và một tham chiếu chỉ chứa một định danh phân đoạn là một tham chiếu đến đoạn được xác định của tài liệu đó.

RFC 2396 bị lỗi thời bởi RFC 3986 (hiện đang là tiêu chuẩn URI của IETF ), về cơ bản cũng nói như vậy .

HTML5

Sử dụng HTML5 ( URL hợp lệ có khả năng được bao quanh bởi khoảng trắngURL hợp lệ ) Thông số URL của W3C , đã bị ngưng. Thay vào đó, nên sử dụng Tiêu chuẩn URL của WHATWG (xem phần cuối cùng).

HTML 5.1

HTML 5.1 sử dụng ( URL hợp lệ có khả năng được bao quanh bởi khoảng trắngURL hợp lệ ) Tiêu chuẩn URL của WHATWG (xem phần tiếp theo).

HTML GÌ

HTML của WHATWG sử dụng ( URL hợp lệ có khả năng được bao quanh bởi các khoảng trắng ) định nghĩa của chuỗi URL hợp lệ từ Tiêu chuẩn URL của WHATWG , trong đó nói rằng đó có thể là một chuỗi URL tương đối có phân đoạn , ít nhất phải là một chuỗi URL tương đối , có thể là một chuỗi URL không liên quan đến lược đồ đường dẫn , là một chuỗi URL liên quan đến đường dẫn không bắt đầu bằng một chuỗi lược đồ theo sau :và định nghĩa của nó nói (dấu nhấn mạnh của tôi):

Chuỗi URL liên quan đến đường dẫn phải bằng 0 hoặc nhiều chuỗi phân đoạn đường dẫn URL, được phân tách với nhau bằng U + 002F (/) và không bắt đầu bằng U + 002F (/).


184

Nó hợp lệ.

Tuy nhiên, thực hành tiêu chuẩn là sử dụng href="#"hoặc đôi khi href="javascript:;".


23
Như được nêu trong RFC 2396: Tham chiếu URI không chứa URI là tham chiếu đến tài liệu hiện tại. Nói cách khác, một tham chiếu URI trống trong tài liệu được hiểu là một tham chiếu đến phần đầu của tài liệu đó,
ngày

32
Khi tôi nhấp href="#", tập trung di chuyển lên đầu trang trong IE, vì vậy tôi thkink href="javascript:;"sẽ tốt hơn
Deckard

32
href = "#" là một mô hình chống. Nó thêm một mục bổ sung vào lịch sử trình duyệt và trong một số trường hợp làm cho trình duyệt cuộn lên trên cùng, bạn có thể bỏ qua thuộc tính href nếu bạn không sử dụng nó. nó sẽ mặc định là "" và do đó tải lại trang nếu không được ngăn chặn.
tosh

16
@tosh, không, tôi khá chắc chắn nếu bạn bỏ qua thuộc tính href, phần tử <a> không được đặt tên là liên kết, không thể tập trung và không tạo liên kết dưới dạng <a href = "" > hoặc <a href> không. Nếu nó hoạt động với bạn, bạn có thể chia sẻ một JSFiddle hiển thị nó không?
Gui Prá

6
@tosh, bạn biết điều gì buồn cười? Rõ ràng kể từ HTML5, việc bỏ qua thuộc tính sẽ hoạt động theo cách đó, hãy xem w3.org/TR/html5/text-level-semantics.html#the-a-element (Cảm ơn Halfdan đã gửi câu trả lời bên dưới.) được thực hiện bởi các nhà cung cấp và vì đây vẫn chỉ là đề xuất của ứng viên, thật khó để biết liệu nó sẽ được giữ trong tiêu chuẩn cuối cùng hay liệu các nhà cung cấp sẽ tuân thủ trước đó.
Gui Prá

115

Như những người khác đã nói, nó là hợp lệ.

Có một số nhược điểm đối với từng phương pháp:

href="#" thêm một mục bổ sung vào lịch sử trình duyệt (gây khó chịu khi ví dụ như quay lại nút).

href="" tải lại trang

href="javascript:;" dường như không có bất kỳ vấn đề nào (ngoài việc trông lộn xộn và vô nghĩa) - có ai biết về điều gì không?


22
Một điều thú vị khác là href = "//: 0", sẽ không đưa ra yêu cầu đến máy chủ cũng như không để lại bất kỳ lịch sử nào.
diachedelic

2
//: 0 làm cho một số hình ảnh của tôi không tải được trong Chrome. Có vẻ như Chrome diễn giải rằng khi nhận lệnh hủy.
David Grenier

5
href: "javascript:;" chỉ là những gì tôi cần để làm cho mọi thứ hoạt động trong cả hai lần xem web trên iOS
dumazy

2
IE liên kết đến thư mục phía trên tài liệu: stackoverflow.com/questions/7966791/ Kẻ
Nate

1
Tôi chưa thử nghiệm điều này, nhưng tôi nghi ngờ rằng href = "javascript:;" sẽ vi phạm Chính sách bảo mật nội dung không tuân theo JavaScript nội tuyến. Nếu bạn có ý định bật chính sách này, tôi sẽ sử dụng một trong những lựa chọn thay thế.
Đánh dấu

60

Mặc dù HTML có thể hoàn toàn hợp lệ để không bao gồm một href, đặc biệt là với trình xử lý onclick, có một số điều cần xem xét: nó sẽ không thể tập trung vào bàn phím nếu không đặt giá trị tabindex. Hơn nữa, phần mềm đọc màn hình này không thể truy cập được bằng Internet Explorer, vì IE sẽ báo cáo thông qua các giao diện khả năng truy cập mà bất kỳ phần tử neo nào không có thuộc tính href là không thể lấy nét, bất kể tabindex đã được đặt chưa.

Vì vậy, trong khi những điều sau đây có thể hoàn toàn hợp lệ:

<a class="arrow">Link content</a>

Tốt hơn hết là thêm một thuộc tính null-effect href

<a href="javascript:void(0);" class="arrow">Link content</a>

Để hỗ trợ đầy đủ cho tất cả người dùng, nếu bạn đang sử dụng lớp có CSS ​​để hiển thị hình ảnh, bạn cũng nên bao gồm một số nội dung văn bản, chẳng hạn như thuộc tính tiêu đề để cung cấp mô tả văn bản về những gì đang diễn ra.

<a href="javascript:void(0);" class="arrow" title="Go to linked content">Link content</a>

1
Cảm ơn đã đề cập rằng bỏ qua hrefsẽ gây rối với các giao diện tiếp cận.
Daniel Sokolowski

1
Tôi cũng đã thêm - từ góc độ trợ năng - việc đặt hrefgiá trị thành bất kỳ thứ gì khác ngoài đường dẫn tương đối / tuyệt đối sẽ gây ra sự cố trình đọc màn hình. Tránh sử dụng biểu tượng băm / bảng như cách giải quyết cho vấn đề này vì nó không có nghĩa cho việc này. Trình đọc màn hình có thể (hiện tại VoiceOver) thông báo liên kết của bạn là số nhận dạng phân đoạn (liên kết đến một nơi nào đó trong trang hiện tại) và cũng hợp lệ theo quan điểm tiêu chuẩn. xem w3.org/2001/tag/2011/01/HashInURI-20110115#NakenHash
Michel Hébert

27

Bản nháp HTML5 hiện tại cũng cho phép hoàn toàn loại bỏ thuộc tính href.

Nếu một phần tử có thuộc tính no href, thì phần tử đó đại diện cho một trình giữ chỗ cho nơi mà một liên kết có thể được đặt, nếu nó có liên quan.

Để trả lời câu hỏi của bạn: Có, nó hợp lệ.


6
có, NHƯNG - một <a>yếu tố không có hrefđược tạo kiểu trực tiếp trong một số trình duyệt. Ví dụ: kiểu ": hover" không hoạt động trong Chrome (và những thứ kỳ lạ khác)
Alex

Một <a>thẻ không có hrefđại diện cho một cái gì đó khác , không phải là một liên kết (theo truyền thống là một neo). Ngoài ra, có một sự khác biệt giữa một thuộc tính tùy chọn và một thuộc tính có thể trống.
Kobi

19

Thật vậy, bạn có thể để trống (trình xác nhận W3 không phàn nàn).

Đưa ý tưởng tiến thêm một bước: bỏ qua = "". Ưu điểm của việc này là liên kết không được coi là một điểm neo cho trang hiện tại.

<a href>sth</a>

Mặc dù: <a href></a>Thuộc tính href mà không thấy giá trị rõ ràng. Thuộc tính có thể bị bỏ bởi IE7.
c24w

1
Tôi cũng thích giải pháp này. Bạn có biết bất kỳ nhược điểm nào khác ngoại trừ hành vi IE7 không?
rinat.io

Đây là cú pháp bất hợp pháp. Theo cú pháp spec [Thuộc tính trống] chỉ được phép cho các thuộc tính boolean.
Robert Siemer

9

Trong khi trình xác nhận của W3 có thể không phàn nàn về một hrefthuộc tính trống , Dự thảo làm việc HTML5 hiện tại chỉ định:

Các hrefthuộc tính trên aareacác yếu tố phải có giá trị đó là một URL hợp lệ có khả năng bao quanh bởi không gian.

Một URL hợp lệ phải là một URL mà phù hợp với tiêu chuẩn URL . Bây giờ, Tiêu chuẩn URL hơi khó hiểu khi bạn phải lo lắng, tuy nhiên không nơi nào nói rằng URL có thể là một chuỗi trống.

... có nghĩa là một chuỗi trống không phải là một URL hợp lệ.

Tuy nhiên, Dự thảo làm việc HTML5 tiếp tục nêu rõ:

Lưu ý: Các hrefthuộc tính trên aareacác yếu tố không cần thiết ; khi các yếu tố đó không có hrefthuộc tính, chúng không tạo ra các siêu liên kết.

Điều này có nghĩa là chúng ta có thể bỏ qua hrefthuộc tính hoàn toàn:

<a class="arrow"></a>

Nếu mục đích của bạn là những href-less ayếu tố vẫn nên yêu cầu interraction bàn phím, bạn sẽ phải đi xuống con đường bình thường của gán một roletabindexcùng với nhấp chuột / xử lý KeyDown thông thường của bạn:

<a class="arrow" role="button" tab-index="0"></a>

Thật. Thật không may, như bạn đã trích dẫn, bỏ đi hreflàm cho nó không phải là một siêu liên kết, điều này làm cho onclickchức năng không thể truy cập được đối với người dùng bàn phím.
aij

7

Một lời cảnh báo:

Theo kinh nghiệm của tôi, việc bỏ qua hrefthuộc tính gây ra các vấn đề về khả năng truy cập vì điều hướng bàn phím sẽ bỏ qua nó và không bao giờ tập trung vào nó như khi có. Thủ công bao gồm yếu tố của bạn trong tabindex là một cách xung quanh đó.


3

nó hợp lệ nhưng như UpTheCalet đã nói 'Có một số nhược điểm đối với mỗi phương pháp'

nếu bạn đang gọi ajax thông qua thẻ, hãy để href = "" như thế này sẽ giữ cho trang tải lại và mã ajax sẽ không bao giờ được gọi ...

chỉ cần suy nghĩ này sẽ tốt để chia sẻ


2

Hãy cố gắng làm <a href="#" class="arrow">thay thế. (Lưu ý #ký tự sắc nét ).

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.