Thuộc tính không chuẩn trên thẻ HTML. Điều tốt? Điều tồi tệ? Suy nghĩ của bạn?


92

HTML (hoặc có thể chỉ là XHTML?) Tương đối nghiêm ngặt khi nói đến các thuộc tính không chuẩn trên thẻ. Nếu chúng không phải là một phần của thông số kỹ thuật, thì mã của bạn được coi là không tuân thủ.

Tuy nhiên, các thuộc tính không chuẩn có thể khá hữu ích để truyền siêu dữ liệu sang Javascript. Ví dụ: nếu một liên kết được cho là hiển thị cửa sổ bật lên, bạn có thể đặt tên của cửa sổ bật lên trong một thuộc tính:

<a href="#null" class="popup" title="See the Popup!" 
   popup_title="Title for My Popup">click me</a>

Ngoài ra, bạn có thể lưu trữ tiêu đề cho cửa sổ bật lên trong một phần tử ẩn, như một khoảng:

<style>
    .popup .title { display: none; }
</style>
<a href="#null" title="See the Popup!" class="popup">
    click me
    <span class="title">Title for My Popup</span>
</a>

Tuy nhiên, tôi bị rách vì đó nên là một phương pháp ưu tiên. Phương pháp đầu tiên ngắn gọn hơn và tôi đoán là không ảnh hưởng nhiều đến các công cụ tìm kiếm và trình đọc màn hình. Ngược lại, tùy chọn thứ hai giúp lưu trữ một lượng lớn dữ liệu dễ dàng hơn và do đó, linh hoạt hơn. Nó cũng tuân thủ các tiêu chuẩn.

Tôi tò mò những gì cộng đồng này suy nghĩ. Làm thế nào để bạn xử lý một tình huống như thế này? Sự đơn giản của phương pháp đầu tiên có vượt trội hơn những nhược điểm tiềm ẩn (nếu có) không?


3
Chúng được gọi là thuộc tính "expando" - nếu bạn muốn tìm hiểu thêm về chúng.
Jason Bunting 16/10/08

2
AFAIK, thuộc tính expando được đặt trong thời gian chạy bằng javascript. Chúng không phải là một phần của bản thân XHTML
Philippe Leybaert

Câu trả lời:


50

Tôi là một fan hâm mộ lớn của giải pháp HTML 5 được đề xuất ( data-các thuộc tính có tiền tố). Chỉnh sửa: Tôi muốn nói thêm rằng có lẽ có nhiều ví dụ tốt hơn cho việc sử dụng các thuộc tính tùy chỉnh. Ví dụ: dữ liệu mà một ứng dụng tùy chỉnh sẽ sử dụng không có dữ liệu tương tự trong các thuộc tính tiêu chuẩn (ví dụ: tùy chỉnh cho trình xử lý sự kiện dựa trên một cái gì đó không nhất thiết phải được thể hiện trong className hoặc id).


2
Tôi có xu hướng làm theo giải pháp này ngay bây giờ - mặc dù nó không tuân thủ các tiêu chuẩn.
Tom Ritter

1
Tôi luôn tránh điều này, vì nó không xác thực. Nhưng bây giờ tôi nghĩ về nó, nhồi nhét mọi thứ trong thuộc tính class = "" (như siêu dữ liệu jquery) không nhất thiết phải tốt hơn. Có bất kỳ nhược điểm thực tế nào trong thế giới thực đối với phương pháp này trong <HTML5 land không? Về cơ bản - những vấn đề gì sẽ phát sinh bây giờ? Có vẻ như nó không lý tưởng, nhưng không có tác dụng phụ mà tôi có thể nghĩ đến.
rocketmonkeys

@Rocketmonkeys Tôi không chắc lắm nhưng tôi nghĩ việc sử dụng dữ liệu bên trong thuộc tính lớp có thể buộc trình duyệt thử áp dụng quy tắc css không xác định cho một phần tử, điều này có thể gây ra một số sự cố hoặc sự cố về hiệu suất. Một lần nữa tôi không chắc.
Vitim.us

@ Vitim.us, nếu có thành tích như vậy thì chắc cũng không đáng kể. Các trình duyệt khá hiệu quả trong những việc đó; lượt truy cập để thực sự áp dụng các kiểu sẽ lớn hơn. Và hãy nhớ rằng, các lớp không phải là thứ được tạo ra với mục đích tạo kiểu, chúng chỉ là dữ liệu phần tử giống như bất kỳ thuộc tính nào khác. Bất kỳ thuộc tính nào cũng có thể được sử dụng trong bộ chọn, vì vậy nếu có một lần truy cập hiệu suất như vậy, nó sẽ áp dụng theo nghĩa đen cho bất kỳ thuộc tính nào (bao gồm cả data-tiền tố) mà bạn thêm vào phần tử.
mí mắt,

@eyelidless đó là một lập luận tốt, tôi phải đồng ý, ngay cả khi tôi sử dụng đúng cấu trúc dữ liệu bên trong Javascript Tôi thấy một số trường hợp sử dụng thuộc tính dữ liệu là phù hợp. Tôi tránh jquery như rocketmonkeys đã nói. Tôi thực sự cần ngừng làm phiền mọi người về các tối ưu hóa vi mô.
Vitim.us

27

Các thuộc tính tùy chỉnh cung cấp một cách thuận tiện để mang thêm dữ liệu cho phía khách hàng. Bộ công cụ Dojo đang làm điều này thường xuyên và nó đã được chỉ ra ( Gỡ lỗi lầm tưởng của bộ công cụ Dojo ) chỉ ra rằng:

Các thuộc tính tùy chỉnh luôn là HTML hợp lệ, chúng chỉ không xác thực khi được kiểm tra với DTD. [...] Đặc tả HTML tuyên bố rằng bất kỳ thuộc tính nào không được công nhận sẽ bị công cụ kết xuất HTML bỏ qua trong tác nhân người dùng và Dojo tùy ý tận dụng điều này để cải thiện tính dễ phát triển.


9

Một tùy chọn khác sẽ là xác định một cái gì đó như thế này trong Javascript:

<script type="text/javascript">
var link_titles = {link1: "Title 1", link2: "Title 2"};
</script>

Sau đó, bạn có thể sử dụng điều này sau trong mã Javascript của mình, giả sử liên kết của bạn có ID tương ứng với ID trong bảng băm này.

Nó không có nhược điểm của hai phương pháp còn lại: không có thuộc tính không chuẩn cũng như khoảng ẩn xấu xí.

Điểm bất lợi là nó có thể hơi quá mức cần thiết cho những thứ đơn giản như ví dụ của bạn. Nhưng đối với các tình huống phức tạp hơn, nơi bạn có nhiều dữ liệu hơn để vượt qua, đó là một lựa chọn tốt. Đặc biệt khi xem xét dữ liệu đang được truyền dưới dạng JSON, vì vậy bạn có thể truyền các đối tượng phức tạp một cách dễ dàng.

Ngoài ra, bạn giữ dữ liệu tách biệt với định dạng, đó là một điều tốt cho khả năng bảo trì.

Bạn thậm chí có thể có một cái gì đó như thế này (mà bạn thực sự không thể làm được với các phương pháp khác):

var poi_types = {1: "City", 2: "Restaurant"};
var poi = {1: {lat: X, lng: Y, name: "Beijing", type: 1}, 2: {lat: A, lng: B, name: "Hatsune", type: 2}};

...

<a id="poi-2" href="/poi/2/">Hatsune</a>

Và vì hầu hết bạn có thể sử dụng một số ngôn ngữ lập trình phía máy chủ, bảng băm này sẽ rất nhỏ để tạo động (chỉ cần tuần tự hóa nó thành JSON và đưa nó vào phần tiêu đề của trang).


4

Trong trường hợp này, giải pháp tối ưu là

<a href="#" alt="" title="Title of My Pop-up">click</a>

và sử dụng thuộc tính tiêu đề.

Đôi khi tôi phá vỡ thông số kỹ thuật nếu tôi thực sự cần nó. Nhưng hiếm khi, và chỉ vì lý do chính đáng.

CHỈNH SỬA: Không chắc tại sao -1, nhưng tôi đã chỉ ra rằng đôi khi bạn nghĩ rằng bạn cần phải phá vỡ thông số kỹ thuật, khi bạn không.


4

Tại sao không khai báo thuộc tính popup_title trong DTD tùy chỉnh? Điều này giải quyết vấn đề với xác thực. Tôi làm điều này với mọi phần tử, thuộc tính và giá trị không chuẩn và cảm ơn việc xác thực này chỉ cho tôi thấy các vấn đề thực sự với mã của tôi. Điều này cũng làm cho mọi lỗi trình duyệt ít xảy ra hơn với HTML như vậy.


2

Bạn có thể lồng các phần tử đầu vào ẩn BÊN TRONG phần tử neo

<a id="anchor_id">
  <input type="hidden" class="articleid" value="5">
  Link text here
</a>

Sau đó, bạn có thể dễ dàng lấy dữ liệu ra bằng cách

$('#anchor_id .articleid').val()

1
Có, nhưng cách tốt nhất là để sử dụng: <input type="hidden" title="article_id" value="5" />. Vì lớp là một cái gì đó cho CSS, trên thực tế, mã không hợp lệ nếu lớp không có trong thông tin kiểu. Ngay cả khi JS hoặc CSS bị tắt, dữ liệu sẽ vẫn bị ẩn.
Yeti

1
@Yeti, lớp không phải là thứ dành cho CSS cũng như không hợp lệ nếu nó không xuất hiện trong các kiểu. Nó chỉ là dữ liệu trên phần tử, giống như bất kỳ thuộc tính nào khác. Sự liên kết với CSS là nó là một bộ chọn được hỗ trợ tốt.
mí mắt,

0

Giải pháp của tôi cuối cùng là ẩn dữ liệu bổ sung trong thẻ id được phân tách bằng một số loại dấu phân cách (một dấu gạch dưới là dấu cách, hai là dấu cuối của đối số đó), đối số thứ hai có id:

<a href="#" class="article" id="Title_of_My_Pop-up__47">click</a>

Xấu xí và nó giả định rằng bạn chưa sử dụng thẻ id cho thứ khác, nhưng nó tuân thủ trên mọi trình duyệt.


-1

Cảm nhận cá nhân của tôi trong ví dụ của bạn là lộ trình nhịp thích hợp hơn, vì nó đáp ứng các tiêu chuẩn của đặc tả XHTML. Tuy nhiên, tôi có thể thấy một phân đoạn cho các thuộc tính tùy chỉnh, nhưng tôi nghĩ chúng thêm một mức độ nhầm lẫn không cần thiết.


10
Tuy nhiên, lộ trình SPAN là việc sử dụng sai thẻ. Nó có thể đáp ứng các tiêu chuẩn xác nhận, nhưng không đáp ứng các tiêu chuẩn ngữ nghĩa.
ceejayoz

-1

Tôi cũng đang vắt óc vì chuyện này. Tôi thích khả năng đọc của các thuộc tính không chuẩn, nhưng tôi không thích nó sẽ phá vỡ tiêu chuẩn. Ví dụ về nhịp ẩn là tuân thủ, nhưng nó không dễ đọc. Cái này thì sao:

<a href="#" alt="" title="" rel="{popup_title:'Title of My Pop-up'}">click</a>

Ở đây, mã rất dễ đọc, vì ký hiệu cặp khóa / giá trị của JSON. Bạn có thể biết rằng đây là dữ liệu meta thuộc liên kết chỉ bằng cách nhìn vào nó. Lỗ hổng duy nhất mà tôi có thể thấy bên cạnh việc chiếm đoạt thuộc tính "rel" là điều này sẽ trở nên lộn xộn đối với các đối tượng phức tạp. Tôi thực sự thích ý tưởng đó về các thuộc tính có tiền tố "data-" được đề cập ở trên. Có trình duyệt hiện tại nào hỗ trợ điều này không?

Đây là một cái gì đó khác để suy nghĩ về. Mã không tuân thủ có tác động như thế nào đến SEO?


7
Thuộc tính rel mô tả mối quan hệ giữa trang hiện tại và tài nguyên được liên kết. Đây không phải là thuộc tính chung chung "Lưu trữ bất kỳ dữ liệu nào bạn thích". Vì vậy, điều này là kinh khủng.
Quentin

1
Có trình duyệt hiện tại nào hỗ trợ điều này không? - Có gì để hỗ trợ? Các trình duyệt đã có thể dung nạp mã không tuân thủ. Xét rằng đây là một phần của HTML5 mới, không có gì phải ngại khi thêm thuộc tính data- giống như bạn thêm bất kỳ thuộc tính tùy chỉnh nào khác.
Slavic
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.