Một phần tử html có thể có nhiều id không?


310

Tôi hiểu rằng một id phải là duy nhất trong trang HTML / XHTML.

Câu hỏi của tôi là, đối với một yếu tố nhất định, tôi có thể gán nhiều id cho nó không?

<div id="nested_element_123 task_123"></div>

Tôi nhận ra rằng tôi có một giải pháp dễ dàng chỉ bằng cách sử dụng một lớp học. Tôi chỉ tò mò về việc sử dụng id theo cách này.


Tôi đang lập trình gần một lúc trong html css và js Tôi thường có nhu cầu sử dụng nhiều lớp nhưng tôi thực sự không bao giờ sử dụng cả tôi cũng không có nhu cầu sử dụng nhiều ID. Tuy nhiên, tôi hơi tò mò: tôi có thể hỏi tình huống bạn gặp phải trong những dịp như thế nào để cần nhiều ID không?
willy wonka

Trong trường hợp hiếm gặp khi người ta không có quyền truy cập vào HTML nguồn (ví dụ: khi xây dựng proxy) nếu bạn cần nhắm mục tiêu một phần tử có nhiều id, bộ chọn css [id = "một hai ba" '] sẽ nhắm mục tiêu phần tử.
JisuKim82

Điều này thực sự phụ thuộc vào đặc điểm kỹ thuật được trích dẫn (và có khả năng được thực hiện) và bối cảnh trong đó. tức là w3.org/TR/html5/dom.html#the-id-attribution và cái cũ hơn cho biết "có"? w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribution
Mark Schultheiss

1
@willywonka Tôi biết điều này giống như hơn 2 năm sau, nhưng tôi vừa mới đọc bài viết này để tìm câu trả lời cho điều này, và cảm thấy như chia sẻ kịch bản với bạn, tôi đã gặp, vì bạn không bao giờ có câu trả lời. Tôi đang thực hiện một dự án cho freecodecamp để tạo ra một máy tính JS. Họ muốn id cho đầu ra là "hiển thị" để họ có thể chạy thử nghiệm với nó nhưng tôi đang tạo một máy tính khoa học với 2 màn hình: #input và #output, vì vậy màn hình #input CSONG cần id "display" giá trị ngoài giá trị của "đầu vào" tôi muốn cung cấp cho nó để thống nhất.
Tara Stahler

1
Xin chào @TaraStahler bạn được chào đón. Theo như tôi biết, trình duyệt sẽ chỉ hiển thị cái đầu tiên nếu bạn sử dụng ký hiệu <... id = "input" id = "display" ...> và một id không được chứa khoảng trắng (cũng không phải tab) ký hiệu <... id = "hiển thị đầu vào" ...> hoàn toàn không hợp lệ. Chỉ cần thử nghiệm với javascript với bảng điều khiển Chrome và nó trả về "Uncaught ReferenceError: hiển thị không được xác định" trong cả hai trường hợp. Chỉ trường hợp đầu tiên trả về đối tượng nếu tôi nhận được nó với id đầu tiên, trường hợp thứ hai là không thể đạt được. Trong trường hợp thứ hai, không có id nào có thể đạt được. Có lẽ bạn cần cấu trúc lại mã của mình?
willy wonka

Câu trả lời:


205

Không. Từ Thông số XHTML 1.0

Trong XML, các định danh phân đoạn là loại ID và chỉ có thể có một thuộc tính duy nhất của loại ID cho mỗi phần tử. Do đó, trong XHTML 1.0, thuộc tính id được xác định là loại ID. Để đảm bảo rằng các tài liệu XHTML 1.0 là các tài liệu XML có cấu trúc tốt, các tài liệu XHTML 1.0 PHẢI sử dụng thuộc tính id khi xác định các định danh phân đoạn trên các thành phần được liệt kê ở trên. Xem Nguyên tắc tương thích HTML để biết thông tin về việc đảm bảo các neo như vậy tương thích ngược khi phục vụ các tài liệu XHTML dưới dạng văn bản / html loại phương tiện.


7
"số nhận dạng phân đoạn là loại ID và chỉ có thể có một thuộc tính duy nhất của loại ID cho mỗi phần tử." Nó nói ở đây, thuộc tính và thuộc tính duy nhất khác với giá trị của thuộc tính. Nó không nói bất cứ điều gì mà các giá trị thuộc tính không nên có trong bất kỳ bối cảnh nào giả định đa trị thông qua không gian được phân tách hoặc bất kỳ sự phân tách ký tự nào. Mặc dù trong đặc tả, nó nói rằng để tương thích ngược, nó không được chứa ký tự khoảng
trắng

2
Phụ thuộc vào thông số kỹ thuật bạn trích dẫn tôi cho rằng. "Thông số kỹ thuật này không loại trừ một yếu tố có nhiều ID ..." w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribution
Mark Schultheiss

Xem ở đây nơi câu đó được xóa w3.org/TR/html5/dom.html#the-id-attribution
Mark Schultheiss

Được rồi, tôi đã thực hiện câu trả lời này đạt mốc 200 upvote. Không sao cả. Tôi sẽ thấy mình ra ngoài.
KhoPhi

196

Trái với những gì người khác nói, câu trả lời đúng là

Thông số kỹ thuật của Selector rất rõ ràng về điều này:

Nếu một phần tử có nhiều thuộc tính ID, tất cả chúng phải được coi là ID cho phần tử đó cho mục đích của bộ chọn ID. Có thể đạt được một tình huống bằng cách sử dụng các hỗn hợp của xml: id, DOM3 Core, XML DTD và không gian tên cụ thể hiểu biết.


Biên tập

Chỉ cần làm rõ: Có, một phần tử XHTML có thể có nhiều id, ví dụ:

<p id="foo" xml:id="bar">

nhưng không thể gán nhiều id cho cùng một idthuộc tính bằng cách sử dụng danh sách được phân tách bằng dấu cách.


7
Câu trả lời tuyệt vời - bây giờ điều đó đã đưa con mèo vào giữa những con chim bồ câu.
TrojanName

3
Thật không may, đó không phải là đặc điểm kỹ thuật CSS hoạt động ở đây. Đối với HTML / XHTML, bạn phải xem thông số kỹ thuật đó và thông số đó chắc chắn nói rằng mỗi phần tử có thể có nhiều nhất một id và id đó phải là duy nhất trên trang: w3.org/TR/html401/struct/global. html # h-7.5.2 (cho HTML 4)
tvanfosson

9
@tvanfosson: Đáng ngạc nhiên, thông số HTML4 KHÔNG nói rằng mỗi phần tử có thể có nhiều nhất một id. Nếu bạn nhìn vào thông số kỹ thuật HTML5 , bạn thậm chí sẽ thấy rằng This specification doesn't preclude an element having multiple IDs, if other mechanisms (e.g. DOM Core methods) can set an element's ID in a way that doesn't conflict with the id attribute.(tương ứng với thông số kỹ thuật CSS)
user123444555621

1
bạn chỉ có thể có một thuộc tính id và định dạng của nội dung thuộc tính id không có bất kỳ khoảng trắng nào. Trong ngữ cảnh của câu hỏi - đưa ra một id 2 phần tử "HTML" - không thể thực hiện điều này trong HTML 4 hoặc HTML 5. Bạn đang giả định rằng cung cấp cho nó một id hoạt động với CSS là đủ cho những gì anh ấy đang cố gắng làm, và có thể là có một xmlid sẽ hoạt động, nhưng tôi không thấy làm thế nào bạn đưa ra câu hỏi như đã viết. Ví dụ mà ông cho thấy sẽ không hoạt động trong cả HTML 4 hoặc HTML 5 và không có cách nào để làm cho nó hoạt động để hoàn thành những gì được hiển thị.
tvanfosson

6
Tôi nêu lên câu trả lời này khi nó trả lời câu hỏi: " bạn có thể gán nhiều ID cho một phần tử không?" Tuy nhiên tôi nên thêm rằng điều này vượt xa các thông số kỹ thuật đơn thuần; như được hiển thị trong câu trả lời được chấp nhận, khi nói đến HTML / XHTML, thông số kỹ thuật nói rằng bạn chỉ có thể gán ID bằng idthuộc tính. Để làm rõ, xml:idthuộc tính (và trên thực tế, bất kỳ thuộc tính nào ngoài không gian tên mặc định) đều không hợp lệ trong XHTML. Tuy nhiên, khi bạn trích dẫn từ thông số HTML5, điều này không gây ra sự xml:id="bar"thất bại trong âm thầm; nó vẫn sẽ thêm barID vào thành phần này, cho phép nó khớp #bar.
BoltClock

28

Sự hiểu biết của tôi luôn luôn là:

  • ID là sử dụng một lần và chỉ được áp dụng cho một yếu tố ...

    • Mỗi cái được quy cho một Định danh duy nhất cho (chỉ) một yếu tố duy nhất .
  • Các lớp học có thể được sử dụng nhiều lần ...

    • Do đó, chúng có thể được áp dụng cho nhiều hơn một phần tử và tương tự nhưng khác nhau, có thể có nhiều hơn một lớp (tức là nhiều lớp) cho mỗi phần tử .

18
Tôi không nghĩ rằng điều này đủ điều kiện để trở thành một câu trả lời cho câu hỏi. Câu hỏi là: "Có thể sử dụng nhiều ID cho một yếu tố không?"
Kevin

4
@kevin Câu trả lời này cho rằng OP đang đối mặt với vấn đề XY và chắc chắn có thể giúp đỡ ai đó đang cố gắng đạt được hành vi của lớp thông qua ID - vì bất kỳ lý do gì.
Mahdi

Bạn đề cập đến "sử dụng một lần" nhưng điều đó có thể gây nhầm lẫn. Bạn có thể và là một thứ không chính xác và chính xác sử dụng nhiều lần một yếu tố theo id của nó. Điều tôi nghĩ rằng bạn đang giải quyết là một cách hiểu khác đó là: bạn nên sử dụng một (và chỉ một) id cho một phần tử và CHỈ cho phần tử đó.
Mbotet

27

Không. Mặc dù định nghĩa từ w3c cho HTML 4 dường như không bao gồm rõ ràng câu hỏi của bạn, định nghĩa của tên và thuộc tính id nói không có khoảng trắng trong mã định danh:

Mã thông báo ID và NAME phải bắt đầu bằng một chữ cái ([A-Za-z]) và có thể được theo sau bởi bất kỳ số lượng chữ cái, chữ số ([0-9]), dấu gạch ngang ("-"), dấu gạch dưới ("_") , dấu hai chấm (":") và dấu chấm (".").


20

Không. Mỗi phần tử DOM, nếu nó có một id, có một id duy nhất. Bạn có thể ước chừng nó bằng cách sử dụng một cái gì đó như:

<div id='enclosing_id_123'><span id='enclosed_id_123'></span></div>

và sau đó sử dụng điều hướng để có được những gì bạn thực sự muốn.

Nếu bạn chỉ muốn áp dụng các kiểu, tên lớp sẽ tốt hơn.


Điều đó sẽ phá vỡ xác nhận mặc dù.
Aupajo

3
Điều gì là bất hợp pháp về câu trả lời này? Ai đó có thể giải thích bỏ phiếu xuống?
sức mạnh

19
Không phải tôi. :-) Và tôi không chắc ý của bạn về việc phá vỡ xác nhận? Các id của div và span là khác nhau (kèm theo so với kèm theo) vì vậy không có vấn đề gì với các id trùng lặp. Có thể một số người không đọc kỹ.
tvanfosson

4
Cướp ngân hàng là bất hợp pháp, một vấn đề phần mềm không bao giờ là bất hợp pháp. Đó là thực tế ảo cũ so với vấn đề thực tế thực tế một lần nữa :-P
TrojanName

@BrianFenton gỡ lỗi mã elses khiến tôi nhận ra nó là bất hợp pháp. Tôi nói 5 năm tù vì không theo thông số kỹ thuật mà không có lý do chính đáng để không.
Vấn

18

Bạn chỉ có thể có một ID cho mỗi phần tử, nhưng bạn thực sự có thể có nhiều hơn một lớp. Nhưng không có nhiều thuộc tính lớp, đặt nhiều giá trị lớp vào một thuộc tính.

<div id="foo" class="bar baz bax">

là hoàn toàn hợp pháp.


4

Không, bạn không thể có nhiều id cho một thẻ, nhưng tôi đã thấy một thẻ có namethuộc tính và idthuộc tính được đối xử giống nhau bởi một số ứng dụng.


1
trong IE, trước IE8, vâng. nhưng họ đã sửa lỗi đó trong chế độ tiêu chuẩn. getEuityById () được sử dụng để trả lại không chính xác trường hợp phù hợp không nhạy cảm với tên và id.
scunliffe

4

Không, bạn nên sử dụng các DIV lồng nhau nếu bạn muốn đi xuống con đường đó. Bên cạnh đó, ngay cả khi bạn có thể, hãy tưởng tượng sự nhầm lẫn mà nó sẽ gây ra khi bạn chạy document.getEuityByID (). ID nào sẽ lấy nếu có nhiều ID?

Trong một chủ đề hơi liên quan, bạn có thể thêm nhiều lớp vào DIV. Xem thảo luận của Eric Myers tại,

http://meyerweb.com/eric/articles/webrev/199802a.html


1
Nó sẽ không nhận được id bạn chỉ định giữa dấu ngoặc đơn? getElementById();không làm bất cứ điều gì mà không có một chuỗi xác định những gì sẽ nhận được?! getElementById('foo');sẽ lấy phần tử với foo làm ID! Nhiều ID sẽ không quan trọng ở đây. Nó vẫn sẽ tìm kiếm "foo".
Rin và Len

3
Any ID assigned to a div element is unique.
However, you can assign multiple IDs "under", and not "to" a div element.
In that case, you have to represent those IDs as <span></span> IDs.

Say, you want two links in the same HTML page to point to the same div element in  the page.

The two different links
<p><a href="#exponentialEquationsCalculator">Exponential Equations</a></p>         

<p><a href="#logarithmicExpressionsCalculator"><Logarithmic Expressions</a></p>

Point to the same section of the page. 
<!-- Exponential / Logarithmic Equations Calculator -->
<div class="w3-container w3-card white w3-margin-bottom">      
   <span id="exponentialEquationsCalculator"></span>
   <span id="logarithmicEquationsCalculator"></span>
</div>

2

http://www.w3.org/TR/REC-html40/struct/global.html#h-7.5.2

Thuộc tính id gán một định danh duy nhất cho một phần tử (có thể được xác minh bởi trình phân tích cú pháp SGML).

Mã thông báo ID và NAME phải bắt đầu bằng một chữ cái ([A-Za-z]) và có thể được theo sau bởi bất kỳ số lượng chữ cái, chữ số ([0-9]), dấu gạch ngang ("-"), dấu gạch dưới ("_") , dấu hai chấm (":") và dấu chấm (".").

Vì vậy, "id" phải là duy nhất và không thể chứa một khoảng trắng.


1

Tôi muốn nói về mặt kỹ thuật là có, vì thực sự những gì được kết xuất là về mặt kỹ thuật luôn phụ thuộc vào trình duyệt. Hầu hết các trình duyệt cố gắng tuân thủ các thông số kỹ thuật tốt nhất có thể và theo như tôi biết không có gì trong thông số kỹ thuật css chống lại nó. Tôi sẽ chỉ xác nhận mã html, css, javascript thực tế được gửi tới trình duyệt trước khi có bất kỳ bước phiên dịch nào khác.

Tuy nhiên tôi cũng nói không vì mọi trình duyệt tôi thường kiểm tra không thực sự cho phép bạn. Nếu bạn cần phải tự mình xem, hãy lưu dưới đây dưới dạng tệp .html và mở nó trong các trình duyệt chính. Trong tất cả các trình duyệt tôi đã kiểm tra chức năng javascript sẽ không khớp với một phần tử. Tuy nhiên, xóa "hunkojunk" khỏi thẻ id và tất cả đều hoạt động tốt. Mã mẫu

<html>
<head>
</head>
<body>
    <p id="hunkojunk1 hunkojunk2"></p>

<script type="text/javascript">
    document.getElementById('hunkojunk2').innerHTML = "JUNK JUNK JUNK JUNK JUNK JUNK";
</script>
</body>
</html>

1

Không.

Đã nói rằng, không có gì để ngăn bạn làm điều đó. Nhưng bạn sẽ có hành vi không nhất quán với các trình duyệt khác nhau. Đừng làm điều đó. 1 ID cho mỗi phần tử.

Nếu bạn muốn nhiều bài tập cho một phần tử, hãy sử dụng các lớp (cách nhau bởi khoảng trắng).


0

Điều đó thật thú vị, nhưng theo tôi biết câu trả lời là không. Tôi không thấy lý do tại sao bạn cần một ID lồng nhau, vì bạn sẽ thường xuyên vượt qua nó với một yếu tố khác có cùng ID được lồng. Nếu bạn không có điểm, nếu bạn vẫn còn rất ít điểm.


1
Tôi cũng thích sử dụng 2 id để tương thích ngược. ví dụ, một cái gì đó từng là bài viết 8 trong phiên bản trước nhưng bây giờ được gọi là nút-8 có 2 id của một phần tử sẽ ngăn việc mã hóa một cách giải quyết để làm cho nó tương thích ngược. Mặc dù cả hai ID sẽ vẫn là một định danh duy nhất.
FLY

0

Tôi biết đây là một năm tuổi nhưng tôi đã tò mò về điều này bản thân mình và tôi chắc chắn những người khác sẽ tìm thấy đường của họ ở đây. Câu trả lời đơn giản là không, như những người khác đã nói trước tôi. Một yếu tố không thể có nhiều hơn một ID và một ID không thể được sử dụng nhiều lần trong một trang. Hãy dùng thử và bạn sẽ thấy nó không hoạt động tốt như thế nào .

Đáp lại câu trả lời của tvanfosson liên quan đến việc sử dụng cùng một ID trong hai yếu tố khác nhau. Theo như tôi biết thì ID chỉ có thể được sử dụng một lần trong một trang bất kể nó có được gắn vào một thẻ khác hay không.

Theo định nghĩa, một phần tử cần ID phải là duy nhất nhưng nếu bạn cần hai ID thì nó không thực sự độc đáo và cần một lớp thay thế.


1
Nhưng, nếu bạn đọc câu trả lời của tvanfosson, hai ID rõ ràng khác nhau "kèm theo_id_123"! = "Kèm_id_123"
Ben

0

các lớp được tạo đặc biệt cho điều này, đây là mã mà bạn có thể hiểu

<html>
<head>
    <style type="text/css">
     .personal{
            height:100px;
            width: 100px;   

        }
    .fam{
            border: 2px solid #ccc;
        }   
    .x{
            background-color:#ccc;
        }   

    </style>
</head>
<body>

    <div class="personal fam x"></div>

</body> 
</html>



-4

Tôi không thể nghĩ rằng bạn có thể có hai Id Ids nhưng điều đó là có thể. Sử dụng cùng một id hai lần là một trường hợp khác nhau ... giống như hai người sử dụng cùng một hộ chiếu. Tuy nhiên, một người có thể có nhiều hộ chiếu ... Đã tìm kiếm điều này vì tôi gặp tình huống một nhân viên có thể có một số chức năng. Nói "sysadm" và "điều phối viên nhóm" có id = "sysadm teamcoordinator" sẽ cho phép tôi tham khảo chúng từ các trang khác để nhân viên.html # sysadm và staff.html # teamcoordinator sẽ dẫn đến cùng một nơi ... Một ngày nào đó người khác có thể đảm nhiệm chức năng điều phối viên nhóm trong khi sysadm vẫn là sysadm ... thì tôi chỉ phải thay đổi id trên trang worker.html ... nhưng như tôi đã nói - nó không hoạt động :(

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.