Bir html öğesinin birden fazla kimliği olabilir mi?


310

Bir kimliğin HTML / XHTML sayfasında benzersiz olması gerektiğini anlıyorum.

Benim sorum, belirli bir eleman için, ona birden fazla kimlik atayabilir miyim?

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

Sadece bir sınıf kullanarak kolay bir çözüm bulduğumun farkındayım. Sadece kimlikleri bu şekilde kullanmayı merak ediyorum.


Ben html css ve js neredeyse bir süredir programlıyorum Sık sık birden fazla sınıf kullanma ihtiyacı var ama gerçekten asla ne ben birden fazla kimlik kullanmaya gerek yoktur. Yine de biraz merak ediyorum: Böyle durumlarda birden fazla kimliğe ihtiyaç duyduğunuz durumun ne olduğunu sorabilir miyim?
willy wonka

Çok sayıda kimliğe sahip bir öğeyi hedeflemeniz gerekiyorsa, kaynak HTML'ye erişiminin olmadığı nadir senaryoda (örn. Proxy oluştururken) css selector [id = "bir iki üç" '] öğeyi hedeflemelidir.
JisuKim82

Bu gerçekten alıntılanan (ve muhtemelen uygulanacak) spesifikasyona ve içerisindeki bağlama bağlıdır. yani w3.org/TR/html5/dom.html#the-id-attribute ve "evet" i gösteren daha eski olanı? w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

1
@willywonka Bunun 2+ yıl sonra olduğunu biliyorum, ama şimdi bu cevabı aramak için bu makaleye girdim ve hiç cevap alamadığınız için senaryoyu sizinle paylaşmak gibi hissettim. JS hesap makinesi oluşturmak için freecodecamp için bir proje yapıyorum. Onlar çıkış için kimliği "ekran" olmasını istiyoruz, bu yüzden testlerini buna karşı çalıştırabilirler, ancak 2 ekranlı bilimsel bir hesap makinesi oluşturuyorum: #input ve #output, böylece #input display AYRICA "display" kimliğine ihtiyaç duyuyor değeri "girdi" değerine ek olarak tutarlılık vermek istiyorum.
Tara Stahler

1
Merhaba @TaraStahler bekliyoruz. Bildiğim kadarıyla tarayıcı ilkini yalnızca <... id = "input" id = "display" ...> gösterimini kullanırsanız ve aynı zamanda bir kimlik beyaz boşluklar (sekmeler) içermemelidir. <... id = "giriş ekranı" ...> notasyonu hiç geçerli değil. Sadece Chrome konsolu ile javascript ile denedim ve her iki durumda da "Yakalanmayan ReferenceError: ekran tanımlı değil" döndürür. Sadece ilk durum nesneyi ilk kimlikle alırsam, ikincisi ulaşılamaz. İkinci durumda hiçbir kimliğe ulaşılamaz. Belki kodunuzu yeniden düzenlemeniz gerekir?
willy wonka

Yanıtlar:


205

Hayır. XHTML 1.0 Spec'ten

XML'de, parça tanımlayıcıları tip tanıtıcısıdır ve öğe başına yalnızca tek bir tür tanıtıcısı özelliği olabilir. Bu nedenle, XHTML 1.0'da id özniteliği, ID türünde olarak tanımlanır. XHTML 1.0 belgelerinin iyi yapılandırılmış XML belgeleri olduğundan emin olmak için, XHTML 1.0 belgelerinin yukarıda listelenen öğelerdeki parça tanımlayıcılarını tanımlarken id niteliğini kullanması GEREKİR. Ortam türü metin / html olarak XHTML belgelerini sunarken bu tür bağlantıların geriye dönük olarak uyumlu olduğundan emin olmak için HTML Uyumluluk Yönergeleri'ne bakın.


7
"parça tanımlayıcıları tip tanıtıcısıdır ve öğe başına yalnızca tek bir tür tanıtıcısı olabilir." Burada tek öznitelik ve öznitelik, öznitelik değerlerinden farklıdır. Öznitelik değerlerinin hiçbir bağlamda boşluk bırakmama veya karakter ayırma yoluyla çok değerli olduğunu varsayması gerekmiyor. Spesifikasyonda, geriye dönük uyumluluk için özellik değerlerinde boşluk karakteri içermemesi gerektiğini söylese de Parça Tanımlayıcıları (w3.org/TR/xhtml1/#guidelines) Çok değerli kimlikleri ifade etmek istiyorsanız farklı ifade etmeniz gerekir
Richeve Bebedor

2
Sanırım teklif spec bağlıdır. "Bu belirtim, birden fazla kimliği olan bir öğeyi engellemiyor ..." w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Mark Schultheiss

Bu cümlenin kaldırıldığı yere bakın w3.org/TR/html5/dom.html#the-id-attribute
Mark Schultheiss

Tamam, ben bu cevabı 200 üst oyu aldım. Tamam. Kendimi göreceğim.
KhoPhi

196

Herkesin söylediklerinin aksine, doğru cevap EVET

Spec Seçiciler bu konuda çok net:

Bir öğenin birden fazla kimlik özelliği varsa, tümünün kimlik seçici amaçları için o öğe için kimlik olarak ele alınması gerekir. bilgi.


Düzenle

Açıklığa kavuşturmak için: Evet, bir XHTML öğesinin birden fazla kimliği olabilir, ör.

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

ancak idboşlukla ayrılmış bir liste kullanarak aynı özelliğe birden fazla kimlik atamak mümkün değildir.


7
Harika cevap - şimdi bu kediyi güvercinlerin arasına koydu.
TrojanName

3
Ne yazık ki, burada çalışan CSS özelliği değil. HTML / XHTML için, bu spesifikasyona bakmalısınız ve oradaki spesifikasyon kesinlikle her bir elemanın en fazla bir kimliğe sahip olabileceğini ve o kimliğin sayfada benzersiz olması gerektiğini söylüyor : w3.org/TR/html401/struct/global. html # h-7.5.2 (HTML 4 için)
tvanfosson

9
@tvanfosson: Şaşırtıcı bir şekilde, HTML4 spesifikasyonu her öğenin en fazla bir kimliğe sahip olabileceğini söylemez. HTML5 spesifikasyonlarına bakarsanız, 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.(CSS spesifikasyonlarına karşılık gelir) bile bulabilirsiniz
user123444555621

1
yalnızca bir id özelliğiniz olabilir ve id niteliği içeriğinin biçimi boşluk içermez. Soru bağlamında - bir öğe 2 "HTML" kimlikleri vermek - bunu HTML 4 veya HTML 5'te yapmak mümkün değildir. CSS ile çalışan bir kimlik vermenin yeterli ne yapmaya çalışıyorsa ve bir xmlid'e sahip olmak işe yarayabilir, ancak bunu yazılı olarak sorudan nasıl çıkardığınızı görmüyorum. Gösterdiği örnek, HTML 4 veya HTML 5'te çalışmaz ve gösterileni gerçekleştirmek için çalışmasını sağlamanın bir yolu yoktur.
tvanfosson

6
O soru cevaplar gibi ben bu cevabı upvoted: " olabilir Eğer atamak bir öğeye birden fazla kimlikleri?" Ancak bu sadece belirtimlerin ötesinde olduğunu eklemeliyim; kabul edilen cevapta gösterildiği gibi, HTML / XHTML söz konusu olduğunda, spesifikasyon sadeceid özelliği kullanarak bir kimlik atayabileceğinizi söyler . Açıklığa kavuşturmak için, xml:idöznitelik (ve aslında varsayılan ad alanının dışındaki herhangi bir öznitelik) XHTML'de geçerli değildir. Ancak HTML5 spesifikasyonundan alıntı yaptığınızda, bu hiçbir şekilde xml:id="bar"sessizce başarısızlığa neden olmaz; yine barde bu öğeye kimliği ekleyerek eşleşmesine izin verir #bar.
BoltClock

28

Benim anlayışım hep şöyle olmuştur:

  • Kimlikler tek kullanımlıktır ve yalnızca bir öğeye uygulanır ...

    • Her biri tek bir öğeye (yalnızca) Benzersiz Tanımlayıcı olarak atfedilir .
  • Sınıflar birden fazla kullanılabilir ...

    • Bu nedenle, birden fazla elemana uygulanabilirler ve benzer şekilde farklı olsalar da , element başına birden fazla sınıf (yani birden fazla sınıf) olabilir .

18
Bunun soruya bir cevap olmaya uygun olduğunu düşünmüyorum. Soru şudur: "Tek bir öğe için birden fazla kimlik kullanılabilir mi?"
Kevin

4
@kevin Bu cevap OP'nin XY problemi ile karşı karşıya olduğunu ve herhangi bir nedenden ötürü kimlikler yoluyla sınıf davranışına ulaşmaya çalışan birine kesinlikle yardımcı olabileceğini varsayar.
Mehdi

"Tek kullanımlık" anlamına gelirsiniz, ancak bu karışıklığa neden olabilir. Sen-ebilmek yapmak ve kimliğidir ve doğru şey kimliğine göre bir öğe birden çok kez kullanın. Ben adresleme düşündüğüm başka bir yorum olan şudur: bir öğe için bir (ve sadece bir) kimliği ve bu öğe için SADECE kullanmalısınız.
Mbotet

27

Hayır iken W3C tanım HTML 4 için açıkça sorunuzu kapsayacak şekilde görünmüyor, isim ve kimlik özelliğinin tanımı tanımlayıcı hiçbir boşluk diyor ki:

Kimlik ve NAME belirteçleri bir harfle ([A-Za-z]) başlamalı ve ardından herhangi bir sayıda harf, rakam ([0-9]), kısa çizgi ("-"), alt çizgi ("_") gelmelidir. , iki nokta üst üste (":") ve nokta (".") içerir.


20

Hayır. Her DOM öğesinin kimliği varsa tek, benzersiz bir kimliği vardır. Şuna benzer bir şey kullanarak tahmin edebilirsiniz:

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

ve sonra istediğinizi elde etmek için navigasyonu kullanın.

Sadece stil uygulamak istiyorsanız, sınıf adları daha iyidir.


Bu doğrulamayı bozar.
Aupajo

3
Bu cevapta yasadışı olan nedir? Birisi aşağı oyu açıklayabilir mi?
tpower

19
Ben değilim. :-) Ve doğrulamayı bozma konusunda ne demek istediğinden emin değilim? Div ve span kimlikleri farklıdır (kapalı veya kapalı), bu nedenle yinelenen kimliklerle ilgili bir sorun yoktur. Belki bazı insanlar çok yakından okumuyor.
tvanfosson

4
Bir bankayı soymak yasa dışıdır, yazılım sorunu asla yasadışı değildir. Yine gerçek gerçeklik sorununa karşı bu eski sanal gerçeklik :-P
TrojanName 18:03

@BrianFenton bir başkasının kodu hata ayıklama bana yasa dışı olması gerektiğini fark yaptı. Teknik özellikleri takip etmemek için iyi bir sebep olmadan 5 yıl hapishane diyorum.
ProblemsOfSumit

18

Öğe başına yalnızca bir kimliğiniz olabilir, ancak aslında birden fazla sınıfınız olabilir. Ancak birden fazla sınıf özelliğine sahip olmayın, birden fazla sınıf değerini bir özelliğe yerleştirin.

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

tamamen yasaldır.


4

Hayır, tek bir etiket için birden fazla kimliğiniz olamaz, ancak bazı uygulamalar tarafından aynı şekilde ele alınan bir nameözniteliğe ve bir idözniteliğe sahip bir etiket gördüm .


1
IE'de, IE8'den önce, evet. ancak bu hatayı şimdi standart modda düzelttiler. getElementById (), ad ve kimliğe büyük / küçük harfe karşılık gelen elemleri yanlış döndürmek için kullanılır.
scunliffe

4

Hayır, bu yola gitmek istiyorsanız iç içe DIV'ler kullanmalısınız. Üstelik, yapabilseniz bile, document.getElementByID () öğesini çalıştırdığınızda neden olacağı karışıklığı hayal edin. Birden fazla kimlik varsa hangi kimliği alacak?

Biraz ilgili bir konuda, bir DIV'ye birden fazla sınıf ekleyebilirsiniz . Eric Myers'deki tartışmaya bakın,

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


1
Parantez arasında belirttiğiniz kimliği alamaz mıydı? getElementById();ne almak belirten bir dize olmadan hiçbir şey yapmaz ?! getElementById('foo');kimlik olarak foo ile eleman alacak! Birden fazla kimlik burada önemli değildir. Hala "foo" yu arardı.
Rin ve 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

İd özelliği, bir öğeye benzersiz bir tanımlayıcı atar (bu, bir SGML ayrıştırıcısı tarafından doğrulanabilir).

ve

Kimlik ve NAME belirteçleri bir harfle ([A-Za-z]) başlamalı ve ardından herhangi bir sayıda harf, rakam ([0-9]), kısa çizgi ("-"), alt çizgi ("_") gelmelidir. , iki nokta üst üste (":") ve nokta (".") içerir.

Bu nedenle "id" benzersiz olmalı ve boşluk içeremez.


1

Teknik olarak evet demek istiyorum, çünkü gerçekten işlenen şey teknik olarak her zaman tarayıcıya bağımlı. Çoğu tarayıcı özellikleri mümkün olan en iyi şekilde tutmaya çalışır ve bildiğim kadarıyla css özelliklerinde buna karşı hiçbir şey yoktur. Ben sadece diğer yorumlayıcı adımlardan önce tarayıcıya gönderilen gerçek html, css, javascript kodu için kefil olacak.

Bununla birlikte hayır diyorum, çünkü genellikle test ettiğim her tarayıcı aslında izin vermiyor. Kendiniz görmeniz gerekiyorsa, aşağıdakileri bir .html dosyası olarak kaydedin ve büyük tarayıcılarda açın. Javascript işlevinde test ettiğim tüm tarayıcılarda bir öğeyle eşleşmez. Ancak, "hunkojunk" id etiketinden kaldırın ve tüm iyi çalışıyor. Basit 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

Hayır.

Bunu söyledikten sonra, bunu yapmanı engelleyecek bir şey yok. Ancak çeşitli tarayıcılarla tutarsız davranışlar elde edersiniz. Yapma. Öğe başına 1 kimlik.

Bir öğeye birden çok atama yapmak istiyorsanız (boşlukla ayrılmış) sınıflar kullanın.


0

Bu ilginç, ama bildiğim kadarıyla cevap kesin bir hayır. Neden aynı yuvalanmış kimliğe sahip başka bir öğeyle geçeceğiniz için yuvalanmış bir kimliğe ihtiyacınız olduğunu anlamıyorum. Yapmazsan anlamsız, yaparsan hala çok az puan var.


1
Geriye dönük uyumluluk için de 2 id kullanmak isterdim. örneğin, önceki bir sürümde makale-8 olarak kullanılan ancak şimdi bir öğenin 2 kimliğine sahip düğüm-8 olarak adlandırılan bir şey, geriye doğru uyumlu hale getirmek için bir geçici çözümün kodlanmasını önleyecektir. Her iki kimlik de benzersiz tanımlayıcı (lar) olarak kalır.
FLY

0

Bunun bir yaşında olduğunu biliyorum ama bunu kendim merak ettim ve eminim başkaları burada yolunu bulacaklar. Diğerlerinin benden önce söylediği gibi basit cevap hayır. Bir öğenin birden fazla kimliği olamaz ve bir kimlik bir sayfada birden fazla kullanılamaz. Deneyin ve bunu ne kadar iyi görürsünüz yapmaz çalışır.

Aynı kimliğin iki farklı unsurda kullanımına ilişkin tvanfosson'un cevabına yanıt olarak. Farkında olduğum kadarıyla, bir kimlik farklı bir etikete bağlı olup olmadığına bakılmaksızın bir sayfada yalnızca bir kez kullanılabilir.

Tanım gereği, bir kimliğe ihtiyaç duyan bir öğe benzersiz olmalıdır, ancak iki kimliğe ihtiyacınız varsa, o gerçekten benzersiz değildir ve bunun yerine bir sınıfa ihtiyaç duyar.


1
Ancak, tvanfosson'un cevabını okuduysanız, iki kimlik açıkça "exting_id_123"! = "Enced_id_123"
Ben

0

sınıflar bunun için özel olarak yapılmıştır, işte anlayabileceğiniz kod

<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

Ben iki Id haves olabilir sanmıyorum ama mümkün olmalı. Aynı kimliği iki kez kullanmak farklı bir durumdur ... aynı pasaportu kullanan iki kişi gibi. Ancak bir kişinin birden fazla pasaportu olabilir ... Tek bir çalışanın birçok işlevi olabileceği bir durumum olduğu için bunu aradım. "Sysadm" ve "ekip koordinatörü" id = "sysadm teamcoordinator" olan diğer sayfalardan referans almama izin verin diyelim ki çalışanlar. Sysadm sysadm olarak kalırken başka takım koordinatörü işlevini devralabilir ... o zaman sadece çalışanları.html sayfasındaki kimlikleri değiştirmek zorundayım ... ama dediğim gibi - işe yaramaz :(

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.