Czy element HTML może mieć wiele identyfikatorów?


310

Rozumiem, że identyfikator musi być unikalny na stronie HTML / XHTML.

Moje pytanie brzmi: czy dla danego elementu mogę przypisać mu wiele identyfikatorów?

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

Zdaję sobie sprawę, że mam proste rozwiązanie, korzystając z klasy. Jestem ciekawy używania identyfikatorów w ten sposób.


Programuję prawie przez jakiś czas w html css i js Często muszę używać wielu klas, ale tak naprawdę nigdy nie używam ani nie muszę używać wielu identyfikatorów. Niemniej jednak jestem trochę ciekawy: czy mogę zapytać, jaka jest sytuacja, w której spotkałeś się przy takiej potrzebie posiadania wielu dokumentów tożsamości?
willy wonka

W rzadkim scenariuszu, gdy nie ma się dostępu do źródłowego kodu HTML (np. Podczas budowania serwerów proxy), jeśli trzeba kierować element na wiele identyfikatorów, selektor css [id = "one two three" '] powinien kierować element.
JisuKim82,

To naprawdę zależy od cytowanej specyfikacji (i prawdopodobnie zaimplementowanej) i kontekstu w niej zawartego. tj. w3.org/TR/html5/dom.html#the-id-attribute i starszy, który wskazuje „tak”? w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

1
@willywonka Wiem, że to już ponad 2 lata później, ale natknąłem się na ten artykuł właśnie w poszukiwaniu odpowiedzi na to pytanie i miałem ochotę podzielić się z tobą scenariuszem, z którym się spotkałem, ponieważ nigdy nie dostałeś odpowiedzi. Robię projekt dla freecodecamp, aby utworzyć kalkulator JS. Chcą, aby identyfikator wyjścia był „display”, aby mogli przeprowadzić na nim testy, ale tworzę kalkulator naukowy z 2 wyświetlaczami: #input i #output, więc #input display RÓWNIEŻ potrzebuje identyfikatora „display” wartość oprócz wartości „wejściowej” Chcę nadać jej spójność.
Tara Stahler,

1
Cześć @ TaraStahler, nie ma za co. O ile wiem, przeglądarka wyświetli pierwszą tylko, jeśli użyjesz zapisu <... id = "input" id = "display" ...>, a także identyfikator nie może zawierać białych spacji (ani tabulatorów), więc notacja <... id = "input display" ...> w ogóle nie jest poprawna. Właśnie eksperymentowałem z javascript z konsolą Chrome i zwraca „Uncaught ReferenceError: display nie jest zdefiniowany” w obu przypadkach. Tylko pierwszy przypadek zwraca obiekt, jeśli otrzymam go z pierwszym identyfikatorem, drugi nie jest osiągalny. W drugim przypadku żaden z identyfikatorów nie jest osiągalny. Może musisz zmienić kod?
willy wonka

Odpowiedzi:


205

Nie. Z specyfikacji XHTML 1.0

W XML identyfikatory fragmentów mają identyfikator typu, a dla elementu może istnieć tylko jeden atrybut identyfikatora typu. Dlatego w XHTML 1.0 atrybut id jest zdefiniowany jako typu ID. Aby mieć pewność, że dokumenty XHTML 1.0 są dobrze ustrukturyzowanymi dokumentami XML, dokumenty XHTML 1.0 MUSZĄ używać atrybutu id podczas definiowania identyfikatorów fragmentów na elementach wymienionych powyżej. Zobacz Wytyczne zgodności HTML, aby uzyskać informacje o tym, czy takie kotwice są wstecznie kompatybilne podczas udostępniania dokumentów XHTML jako typu mediów text / html.


7
„Identyfikatory fragmentów mają identyfikator typu i może istnieć tylko jeden atrybut identyfikatora typu na element”. Mówi się tutaj, że pojedynczy atrybut i atrybut różni się od wartości atrybutu. Nie mówi, że wartości atrybutów nie powinny w żadnym kontekście zakładać wielowartościowości ani poprzez separację spacji, ani przez separację znaków. Chociaż w specyfikacji napisano, że dla kompatybilności wstecznej nie może zawierać znaku spacji w wartościach atrybutów Identyfikatory fragmentów (w3.org/TR/xhtml1/#guidelines) Jeśli więc chcesz wyrażać wielowartościowe identyfikatory, musisz wyrazić to inaczej
Richeve Bebedor

2
Zależy to od podanej przeze mnie specyfikacji. „Ta specyfikacja nie wyklucza elementu posiadającego wiele identyfikatorów ...” w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

Zobacz tutaj, gdzie to zdanie zostało usunięte w3.org/TR/html5/dom.html#the-id-attribute
Mark Schultheiss

Dobra, sprawiłem, że ta odpowiedź osiągnęła poziom 200 głosów pozytywnych. W porządku. Zobaczę się.
KhoPhi

196

W przeciwieństwie do tego, co powiedzieli wszyscy inni, prawidłowa odpowiedź brzmi TAK

Specyfikacja Selektorów jest bardzo jasna na ten temat:

Jeśli element ma wiele atrybutów identyfikatora, wszystkie muszą być traktowane jako identyfikatory tego elementu do celów selektora identyfikatorów. Taka sytuacja może zostać osiągnięta przy użyciu mieszanin xml: id, DOM3 Core, DTD XML i specyficznych dla przestrzeni nazw wiedza, umiejętności.


Edytować

Tylko dla wyjaśnienia: Tak, element XHTML może mieć wiele identyfikatorów, np

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

ale przypisanie wielu identyfikatorów do tego samego idatrybutu przy użyciu listy oddzielonej spacjami nie jest możliwe.


7
Świetna odpowiedź - teraz to umieszcza kota wśród gołębi.
TrojanName

3
Niestety nie działa tutaj specyfikacja CSS. W przypadku HTML / XHTML musisz spojrzeć na tę specyfikację, a specyfikacja tam zdecydowanie mówi, że każdy element może mieć co najwyżej jeden identyfikator, a ten identyfikator musi być unikalny na stronie: w3.org/TR/html401/struct/global. html # h-7.5.2 (dla HTML 4)
tvanfosson

9
@tvanfosson: Zaskakujące, specyfikacja HTML4 NIE mówi, że każdy element może mieć co najwyżej jeden identyfikator. Jeśli spojrzysz na specyfikacje HTML5 , zobaczysz nawet, że 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.(co odpowiada specyfikacjom CSS)
użytkownik123444555621

1
możesz mieć tylko jeden atrybut id, a format zawartości atrybutu id wyklucza spacje. W kontekście pytania - podając identyfikator „HTML” elementu 2 - nie można tego zrobić ani w HTML 4, ani w HTML 5. Zakładasz, że podanie identyfikatora współpracującego z CSS jest wystarczające do co on próbuje zrobić, i może być tak, że posiadanie xmlid zadziałałoby, ale nie rozumiem, jak to wyciągnąć z pytania, jak napisano. Przykład, który pokazuje, nie będzie działał ani w HTML 4, ani w HTML 5 i nie ma sposobu, aby sprawić, że osiągnie to, co pokazano.
tvanfosson

6
Poparłem tę odpowiedź, ponieważ odpowiada ona na pytanie: „ czy możesz przypisać wiele identyfikatorów do elementu?” Powinienem jednak dodać, że wykracza to poza zwykłe specyfikacje; jak pokazano w zaakceptowanej odpowiedzi, jeśli chodzi o sam HTML / XHTML, specyfikacja mówi, że możesz przypisać identyfikator tylko za pomocą idatrybutu. Aby wyjaśnić, xml:idatrybut (i w rzeczywistości dowolny atrybut poza domyślną przestrzenią nazw) nie jest prawidłowy w XHTML. Jednak, jak cytujesz ze specyfikacji HTML5, w żaden sposób nie powoduje xml:id="bar"to cichego niepowodzenia; nadal doda baridentyfikator do tego elementu, umożliwiając dopasowanie #bar.
BoltClock

28

Moje zrozumienie zawsze brzmiało:

  • Identyfikatory są jednorazowego użytku i są stosowane tylko do jednego elementu ...

    • Każdy jest przypisany jako unikalny identyfikator (tylko) jednemu elementowi .
  • Z klas można korzystać więcej niż raz ...

    • Można je zatem zastosować do więcej niż jednego elementu , a podobnie, ale jednocześnie różne, może istnieć więcej niż jedna klasa (tj. Wiele klas) na element .

18
Nie sądzę, że to kwalifikuje się jako odpowiedź na pytanie. Pytanie brzmi: „Czy można użyć wielu identyfikatorów dla jednego elementu?”
Kevin

4
@kevin Ta odpowiedź zakłada, że ​​OP boryka się z problemem XY i może zdecydowanie pomóc komuś, kto próbuje osiągnąć zachowanie klasy za pomocą identyfikatorów - z dowolnego powodu.
Mahdi

Mówisz o „jednorazowym użyciu”, ale może to powodować zamieszanie. Możesz i jest darmową i poprawną rzeczą, używającą wielokrotnie jednego elementu według jego identyfikatora. Wydaje mi się, że zajmujesz się inną interpretacją: możesz użyć jednego (i tylko jednego) identyfikatora dla elementu i TYLKO dla tego elementu.
Mbotet

27

Nie. Chociaż definicja z w3c dla HTML 4 nie wydaje się wyraźnie obejmować twojego pytania, w definicji atrybutu name i id nie ma spacji w identyfikatorze:

Tokeny ID i NAZWA muszą zaczynać się od litery ([A-Za-z]), po której może następować dowolna liczba liter, cyfr ([0-9]), łączników („-”), podkreślników („_”) , dwukropki („:”) i kropki („.”).


20

Nie. Każdy element DOM, jeśli ma identyfikator, ma jeden unikalny identyfikator. Możesz to przybliżyć za pomocą czegoś takiego:

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

a następnie użyj nawigacji, aby uzyskać to, czego naprawdę chcesz.

Jeśli chcesz po prostu zastosować style, nazwy klas są lepsze.


To jednak przerwałoby walidację.
Aupajo,

3
Co jest nielegalne w tej odpowiedzi? Czy ktoś może wyjaśnić głosowanie negatywne?
tpower

19
Nie ja. :-) Nie jestem pewien, co masz na myśli mówiąc o zerwaniu weryfikacji? Identyfikatory div i span są różne (otaczające vs. zamknięte), więc nie ma problemu ze zduplikowanymi identyfikatorami. Może niektórzy ludzie nie czytają bardzo uważnie.
tvanfosson,

4
Rabowanie banku jest nielegalne, problem z oprogramowaniem nigdy nie jest nielegalny. To znowu ta stara rzeczywistość wirtualna a rzeczywisty problem :-P
TrojanName

@BrianFenton debugowanie czyjegoś kodu uświadomiło mi, że powinno to być nielegalne. Mówię 5 lat więzienia za nieprzestrzeganie specyfikacji bez uzasadnionego powodu, aby tego nie robić.
ProblemsOfSumit

18

Możesz mieć tylko jeden identyfikator na element, ale rzeczywiście możesz mieć więcej niż jedną klasę. Ale nie posiadaj wielu atrybutów klas, umieść wiele wartości klas w jednym atrybucie.

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

jest całkowicie legalny.


4

Nie, nie możesz mieć wielu identyfikatorów dla jednego tagu, ale widziałem tag z nameatrybutem i idatrybutem, które są traktowane tak samo przez niektóre aplikacje.


1
w IE, przed IE8, tak. ale teraz naprawili ten błąd w trybie standardów. Metoda getElementById () używana do niepoprawnego zwracania elementów bez rozróżniania wielkości liter w nazwie i identyfikatorze.
scunliffe

4

Nie, powinieneś użyć zagnieżdżonych DIV, jeśli chcesz podążać tą ścieżką. Poza tym, nawet jeśli możesz, wyobraź sobie zamieszanie, jakie spowodowałoby to po uruchomieniu document.getElementByID (). Jaki identyfikator będzie przechwycony, jeśli będzie ich wiele?

W nieco pokrewnym temacie możesz dodać wiele klas do DIV. Zobacz dyskusję Erica Myersa na

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


1
Czy nie otrzyma identyfikatora określonego w nawiasie? getElementById();nic nie robi bez łańcucha określającego, co uzyskać ?! getElementById('foo');dostanie element z foo jako ID! Wiele identyfikatorów nie ma tutaj znaczenia. Wciąż szukałby „foo”.
Rin i 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

Atrybut id przypisuje unikalny identyfikator do elementu (który może być zweryfikowany przez analizator składni SGML).

i

Tokeny ID i NAZWA muszą zaczynać się od litery ([A-Za-z]), po której może następować dowolna liczba liter, cyfr ([0-9]), łączników („-”), podkreślników („_”) , dwukropki („:”) i kropki („.”).

Zatem „id” musi być unikalny i nie może zawierać spacji.


1

Chciałbym powiedzieć technicznie tak, ponieważ tak naprawdę to, co jest renderowane, technicznie zawsze zależy od przeglądarki. Większość przeglądarek stara się zachować specyfikacje najlepiej jak potrafią i o ile wiem, nie ma nic przeciwko specyfikacji css. Zamierzam tylko ręczyć za rzeczywisty kod HTML, CSS, javascript, który jest wysyłany do przeglądarki, zanim pojawi się jakikolwiek inny tłumacz.

Jednak mówię też „nie”, ponieważ każda przeglądarka, na której zwykle testuję, nie pozwala na to. Jeśli chcesz się przekonać, zapisz następujące pliki jako plik .html i otwórz je w głównych przeglądarkach. We wszystkich testowanych przeglądarkach funkcja javascript nie pasuje do elementu. Jednak usuń „hunkojunk” ze znacznika id i wszystko działa dobrze. Przykładowy kod

<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

Nie.

Powiedziawszy to, nic nie stoi na przeszkodzie, abyś to zrobił. Ale uzyskasz niespójne zachowanie w różnych przeglądarkach. Nie rób tego 1 identyfikator na element.

Jeśli chcesz wielu przypisań do elementu, użyj klas (oddzielonych spacją).


0

To ciekawe, ale o ile wiem odpowiedź brzmi zdecydowanie nie. Nie rozumiem, dlaczego potrzebujesz zagnieżdżonego identyfikatora, ponieważ zwykle krzyżujesz go z innym elementem, który ma ten sam zagnieżdżony identyfikator. Jeśli nie, nie ma sensu, jeśli tak, to nadal ma bardzo mało sensu.


1
Chciałbym również użyć 2 identyfikatorów dla kompatybilności wstecznej. na przykład coś było kiedyś artykułem-8 w poprzedniej wersji, ale teraz nazywa się węzłem-8 posiadanie 2 identyfikatorów jednego elementu uniemożliwiłoby kodowanie obejścia w celu zapewnienia kompatybilności wstecznej. Chociaż oba identyfikatory pozostałyby jako unikatowe identyfikatory.
FLY

0

Wiem, że to roczek, ale sam byłem ciekawy tego i jestem pewien, że inni znajdą tu swoją drogę. Prosta odpowiedź brzmi „nie”, jak inni mówili przede mną. Element nie może mieć więcej niż jednego identyfikatora, a identyfikatora nie można użyć więcej niż jeden raz na stronie. Wypróbuj, a zobaczysz, jak dobrze nie działa działa.

W odpowiedzi na odpowiedź tvanfosson dotyczącą zastosowania tego samego identyfikatora w dwóch różnych elementach. O ile mi wiadomo, identyfikatora można użyć tylko raz na stronie, niezależnie od tego, czy jest on dołączony do innego tagu.

Z definicji element wymagający identyfikatora powinien być unikalny, ale jeśli potrzebujesz dwóch identyfikatorów, nie jest on naprawdę unikalny i zamiast tego potrzebuje klasy.


1
Ale jeśli przeczytasz odpowiedź tvanfosson, dwa identyfikatory wyraźnie różnią się „załączanie_id_123”! = „Załączony_id_123”
Ben

0

klasy są specjalnie do tego stworzone, oto kod, który można zrozumieć

<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

Nie sądzę, że możesz mieć dwa Id, ale to powinno być możliwe. Dwukrotne użycie tego samego identyfikatora to inna sprawa ... jak dwie osoby korzystające z tego samego paszportu. Jednak jedna osoba może mieć wiele paszportów ... Przyszło mi ich szukać, ponieważ mam sytuację, w której jeden pracownik może pełnić kilka funkcji. Powiedzmy, że „sysadm” i „koordynator zespołu” o id = „sysadm teamcoordinator” pozwolą mi odnieść się do nich z innych stron, tak aby inaczej może przejąć funkcję koordynatora zespołu, podczas gdy sysadm pozostaje sysadm ... wtedy muszę tylko zmienić identyfikatory na stronie workers.html ... ale jak już powiedziałem - to nie działa :(

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.