'Name' veya 'id' ile HTML Bağlantıları oluşturmalı mıyım?


783

Bir web sayfasının bir kısmına " http://example.com/#foo" yöntemiyle başvurmak istediğinde ,

<h1><a name="foo"/>Foo Title</h1>

veya

<h1 id="foo">Foo Title</h1>

İkisi de çalışıyor, ama eşit mi, yoksa anlamsal farklılıkları var mı?


2
Bağlantı aslında http://example.com#foo(yani / öncesi # olmadan) olmalıdır
Dana

71
Aslında http://example.com#foove http://example.com/#fooURI'lerdeki RFC'lerden birinde tanımlandığı gibi eşdeğerdir.
Oliver

Yanıtlar:


616

HTML 5 spesifikasyonuna göre, 5.9.8 Bir parça tanımlayıcıya gitme :

HTML belgeleri (ve metin / html MIME türü) için, belgenin belirtilen bölümünün ne olduğunu belirlemek için aşağıdaki işleme modeli izlenmelidir.

  1. URL'yi ayrıştırın ve fragid'in URL'nin <fragment> bileşeni olmasına izin verin.
  2. Kırık boş dizeyse, belgenin belirtilen kısmı belgenin üst kısmıdır.
  3. DOM'de kimliğe tam olarak eşit olan bir öğe varsa, ağaç düzenindeki bu tür ilk öğe belgenin belirtilen parçasıdır; algoritmayı burada durdurun.
  4. Bir varsa bir değer fragid tam olarak eşit olan bir ad özelliği vardır DOM elemanı, daha sonra ağaç amacıyla birinci böyle bir elemanın belge belirtilen parçasıdır; algoritmayı burada durdurun.
  5. Aksi takdirde, belgenin belirtilen bir parçası yoktur.

Yani, arayacak id="foo"ve takip edecekname="foo"

Düzenleme: @hsivonen tarafından işaret edildiği gibi, HTML5'te aöğenin ad özelliği yoktur. Ancak, yukarıdaki kurallar diğer adlandırılmış öğeler için de geçerlidir.


76
Bu algoritma ile geçerlilik arasında zımni bir ilişki yoktur. <a name> HTML5'te şu anda hazırlandığı gibi geçersiz.
09:33

13
Aslında diğer "adlandırılmış elemanlar" için geçerli değildir. Name özniteliklerine gelince, sadece <a name> için geçerlidir. Ancak, bu özellik yazarlar tarafından kullanılamaz. Eski HTML sayfaları için kullanıcı aracıları tarafından onurlandırılmalıdır.
Anne

19
@RafaelSoares <h1 id="foo">Foo Title</h1>IE6 bile çalışır ve bir parçası olan HTML 4.01 şartname
Aprillion

4
Name = "foo" değil, <a name="foo"> için arama yapar. Bkz. Bağlantı
Daniel Herzog

3
A name="foo"ve a id="foo"(sayfadaki sıralarından bağımsız olarak) olan bir HTML5 belgesinde , Chrome ve Firefox, adrese atlayacak id, ancak IE (11'de test edildi) ve Edge,name
Alvaro Montoro

182

XML boş öğe sözdizimi desteklenmediği için, <h1><a name="foo"/>Foo Title</h1>sunulan herhangi bir HTML aromasında kullanmamalısınız . Ancak, HTML4'te sorun yok. HTML5'te şu anda hazırlandığı gibi geçerli değil.text/htmltext/html<h1><a name="foo">Foo Title</a></h1>

<h1 id="foo">Foo Title</h1>HTML4 ve HTML5'te sorun yoktur. Bu Netscape 4'te çalışmaz, ancak muhtemelen Netscape 4'te çalışmayan bir düzine başka özellik kullanacaksınız.


6
Tarayıcı desteği hakkında konuşmak için +1. NS4, url # id => element.id'i desteklemeyen tek kişi mi?
Hashbrown

14
@Hashbrown Bir cevap bulunamadı, bu yüzden biraz test yaptım. Çok eski tarayıcıların bile URL parçaları ve CSS seçicisinin uyumluluğu açısından ankraj idgibi davrandığını gördüm . Test edildi: Chrome 6, Firefox 1.5, IE6, Opera 8.02, Safari 3.1.2, Netscape 7.2, Lynx 2.24 ve mobil tarayıcılar: Android 2.2, Chrome 26, Dolphin 9.3, Firefox 19, IE10, Safari 4 ve Opera Mini 5.1. name:target
Stephen M. Harris

1
@smhmic, birini buldum. Off-By-One web tarayıcısı <a name="foo"/> aracılığıyla tanımlanan bağlantıları tanır, ancak 8 yıl önce <sometag id = "foo"> OB1 tarafından güncellendi> çapalar tanımaz. Yazarı, "tam HTML 3.2 desteği ile dünyanın en küçük ve en hızlı web tarayıcısı olabileceğini" iddia ediyor. Win95 ve XP için destek talep ediyor, ancak 64-bit Win7 ile iyi çalışıyor. Peki neden böyle bir dinozor var? Test için, elbette, sitelerimin gerçekten antika tarayıcılarla çok kötü bir şekilde kırılmadığından emin olmak için. Ayrıca, bir flash sürücüde OB1 taşıyorum. Küçük, kendine yeten ve enfeksiyonlardan bağışıklık.
Dave Burton

26
2016 yılında bunu okumak gibi .. Netscape 4?
ADTC

1
"<a name="something" id="something> </a> [[ELEMEK İÇİN KAYDIRMA ELEMANI] kullanmak muhtemelen en iyisidir çünkü uyumludur ve kaydırılacak öğede ne varsa
biçimlendirmez

52

Sayfadaki o bölgeye bağlantı veriyorsanız ... page.html # foo ve Foo Title gibi kullanmanız gereken bir bağlantı olmadığını söylemeliyim:

<h1 id="foo">Foo Title</h1>

Bunun yerine bir <a>referans koyarsanız , başlığınız sitenizdeki <a>belirli bir CSS'den etkilenir . Bu sadece ekstra işaretleme ve buna ihtiyacınız yok. Başlığa bir kimlik yerleştirmenizi şiddetle tavsiye ediyorum, sadece daha iyi oluşturulmuş değil, aynı zamanda Javascript veya CSS'de bu nesneyi ele almanızı sağlayacaktır.


Sadece bu değil ama ben ekran garip bir hata ile mücadele ediyor: hiçbir şey IE görünüyordu. Herhangi bir saldırı noktası fikrinden yoksun olarak, <a name="foo"> girişlerini işaretleyen bir doğrulayıcıya attım, böylece onları değiştirdim - ve şimdi ekran: hiçbiri iyi çalışmıyor.
Loren Pechtel

Bu fazlasıyla yeterli, efekt uğruna hiçbir bağlantı etiketine gerek yok.
Wallace Sidhrée

27

Wikipedia bu özelliği şu şekilde yoğun bir şekilde kullanmaktadır:

<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>

Vikipedi herkes için çalışıyor, bu yüzden bu forma sadık kalmak güvende olurdum.

Ayrıca unutmayın, bunu yalnızca yayılma alanlarıyla değil, div'ler ve hatta tablo hücreleriyle de kullanabilirsiniz ve daha sonra öğedeki target pseudo-class'a erişebilirsiniz. Kalın metinlerde olduğu gibi genişliği değiştirmemeye dikkat edin, bu da içeriği hareket ettiren rahatsız edici bir durumdur.

İsimli çapa - benim oyum kaçınmaktır:

  • "İsimler ve kimlikler aynı ad alanında ..." - Aynı ad alanına sahip iki özellik sadece çılgınca. Diyelim ki zaten kullanımdan kaldırıldı.
  • "Href özniteliği olmayan elemanları tutturur" - Yine, bir elemanın doğası (köprü ya da değil) bir öznitelik ile tanımlanır ?! Çift deli. Sağduyu tamamen bundan kaçınmayı söylüyor.
  • Bir sözde sınıf olmadan bir çapa stil uygularsanız, stil her birine uygulanır. CSS3'te, öznitelik seçicilerle (veya her sahte cam için aynı stille) bunun üstesinden gelebilirsiniz, ancak yine de bir çözümdür. Bu genellikle ortaya çıkmaz, çünkü sözde sınıf başına renk seçersiniz ve alt çizgi varsayılan olarak mevcut olur, yalnızca diğer metinlerle aynı hale getiren kaldırılması mantıklıdır. Ancak bağlantılarınızı kalınlaştırmaya karar verdiniz, bu sorun yaratacaktır.
  • Netscape 4 id özelliğini desteklemeyebilir, ancak yine de bilinmeyen bir özellik herhangi bir soruna neden olmaz. Benim için uyumluluk denen şey buydu.

1
Düzenleme madde işareti 3 / 4'ü öner: Stil verirseniz a {color:red}, hem <a href> bağlantılarınızı hem de <a name> parçalarınızı renklendirir. Bu sözde dersler a:link {color:red]}veya nitelik seçicileri ile başa çıkabilirsiniza:not([href]) {color:red;}
Bob Stein

Haklısın, ama benim için mermi 3 tam olarak bunu söylüyor. Benim ingilizce olsa olabilir ...
Zoltán Morvai

Son olarak, şunu anladım: "Eğer sahte bir sınıf olmadan bir çapa stil yaparsanız, stil her biri için geçerlidir." Belirsiz: "Her sahte sınıfı" düşünebilirsiniz. Sağ. Ama bir çapa kullanmanın “her vakasını” düşünüyordum, yani adlandırılmış ve href-ed. Aydınlatılmış. :) Yorumundan sonra düzenlemeye gerek yok, ama ısrar edersen yapabilirim. Ama aynı zamanda hala renkleri farklı olmaya eğilimli değil, genellikle onları farklı tutmak niyetinde, ama yine de yazı tipi ağırlığı ile aynı durum ...
Zoltán Morvai

yorumlarınızı okumaktan keyif aldım @ ZoltánMorvai. "çift çılgın" ve "netscape 4" doubleplusgood.
Randy L

1
Aynı ad alanına sahip iki özellik çılgınca - gerçekten değil. Kullanıcı tarafından oluşturulan içerik yapılırken <a name="heading1"></a> ... document.html#heading1, kimlik ayarlanmadan bir şeyi parça bağlantısı olarak belirleyebilmek çok yararlıdır , çünkü kimlik sayfadaki başka bir kimlikle çakışabilir. Bu nameözelliği HTML5'e koymadıkları için utanç verici .
Jez

14
<h1 id="foo">Foo Title</h1>

ne kullanılması gerektiğidir. Bir bağlantı istemiyorsanız çapa kullanmayın.


Tim Knight'ın cevabı ile aynı, bundan yarım yıl önce yayınlandı. -1
Luc

13

JavaScript kullanıcıları için uyarı: tüm kimlikler pencere altında global değişkenler haline gelir .

<h1 id="foo">Foo Title</h1>

Az önce JS global'i oluşturduk:

window.foo

Değeri window.fooolacaktır HTMLElementiçinh1 .

Özelliklerde kullanılan tüm değerlerin idgüvenli olduğunu garanti edemezseniz, aşağıdakilere bağlı kalmayı tercih edebilirsiniz name:

<h1 name="foo">Foo Title</h1>

12
İyi haber şu ki, içinde tanımlanan işlevlerin üzerine yazamazsınız window. Örneğin <div id="open"></div>, işlevin üzerine yazılmaz window.open.
Flimm

8

Anlamsal bir fark yoktur; standartlardaki eğilim iddaha ziyade kullanımına yöneliktir name. Bununla birlikte, namebazı durumlarda tercih edilmesine neden olabilecek farklılıklar vardır . HTML 4.01 belirtimi aşağıdaki ipuçlarını sunar :

Kullan idveya name? Yazarlar kullanmaya karar verirken aşağıdaki konuları dikkate almalıdır idya namebir çapa adı için:

  • İd niteliği, yalnızca bir bağlantı adından (ör. Stil sayfası seçici, işleme tanımlayıcısı vb.) Daha fazlası gibi davranabilir.
  • Bazı eski kullanıcı aracıları id özelliğiyle oluşturulan bağlantı noktalarını desteklemez.
  • Name özniteliği (varlıklarla) daha zengin bağlantı adlarına izin verir.

14
Açıkça söylemek gerekirse, "eski kullanıcı aracıları" dediklerinde GERÇEKTEN eski kullanıcı aracıları anlamına gelir. Bunun için endişelenmezdim.
Eli

1
HTML5 "zengin" kimliklere de izin verir. Herkesin kimliğine bağlı parçaları işleyemeyen pazar payı% 0,1'den büyük tarayıcı sürüm sürümleri var mı? - Veya dinozor Netscape 4.7 aslında en yaygın olanı mı?
Robert Siemer

7
FWIW, idiOS 5 için Safari'de çalışmak için çapa alamadım , bu yüzden '09'da zaten "gerçekten eski" olan tarayıcılar değil. nameSitemin iPad'de düzgün çalışmasını sağlamak için s eklemem gerekiyordu. Bu şimdiye kadar düzeltilmiş olabilir, kontrol edilecek herhangi bir iOS 6 cihazım yok.
Daniel Saner

@DanielSaner gerçekten mi? yani en.wikipedia.org/wiki/IPad#Applications iPad'inizde çalışmıyor?
Aprillion

1
@DanielSaner Mobile Safari 5.02 & 5.1 ve Android Browser 2.2 & 2.3'ü test etmek için simülatörler kullandım ve idçapalar evrensel olarak çalışıyor gibi görünüyor. Eğer bu basit örnek mobil çalışmıyor, ben cihaz erişilebilirlik ayarlarını kontrol ederim. (@deathApril Wikipedia mobil sitesinde, URL parçasının etkili bir şekilde yok sayılmasına neden olan Javascript vardır.)
Stephen M. Harris

8

Kimlik yöntemi eski tarayıcılarda çalışmaz, çapa adı yöntemi daha yeni HTML sürümlerinde kullanımdan kaldırılacaktır ... id ile giderdim.


2
Bu iddialar için bir kaynağınız var mı? Beni yanlış anlamayın; Sadece genel olarak ilgileniyorum.
Henrik Paul

11
Bu, “eski tarayıcılarda çalışmaz” a ışık tutmaz. - Netscape 4 dışında hangi tarayıcılar bunlar ??
Robert Siemer

3
Bir div üzerinde kimliği kullanarak denedim ve IE 7 bile çalışıyor. Yine de IE 6 test olamazdı .. ama günümüzde IE 6 kullanan ...
Gilly

Bazı durumlarda Nisan (HASLAYOUT'a bağlıdır) buggy.
Knu

@RobertSiemer Neredeyse evrensel olarak çalışıyor - bu cevabın altındaki yorumuma bakın .
Stephen M. Harris

3

Dikey olarak yığılmış div kapsayıcı, biçiminde aynı ve sadece seri numarası farklı bir dizi oluşan bir web sayfası var. Her div'in üstündeki çapayı gizlemek istedim, bu yüzden en ekonomik çözüm, çapayı açılış div etiketi içinde bir kimlik olarak dahil ettiği ortaya çıktı, yani,

<div id="[serial number]" class="topic_wrapper">

2

Yalnızca biçimlendirme hakkında bir gözlem HTML'nin önceki sürümlerindeki biçimlendirme formu bir bağlantı noktası sağlamıştır. HTML5'te id niteliğini kullanan biçimlendirme formları, çoğunlukla eşdeğer olsa da, hemen hemen hepsinin normalde içerik içermesi beklenen bir öğe gerektirir.

Örneğin boş bir açıklık veya div kullanılabilir, ancak bu kullanım dejenere görünüyor ve kokuyor.

Bir düşünce wbr elemanını bu amaçla kullanmaktır. Wbr boş bir içerik modeline sahiptir ve basitçe satır kesmenin mümkün olduğunu bildirir; bu hala bir biçimlendirme etiketinin hafifçe küçük bir kullanımıdır, ancak ücretsiz belge bölümlerinden veya boş metin aralıklarından çok daha azdır.


İyi bir noktaya değindin. Daha fazla bilgi için wbr: w3.org/TR/html-markup/wbr.html Kullanım <wbr id="foo" />yerine<a name="foo"></a>
Luke

1

İkinci örnek, söz konusu öğeye benzersiz bir kimlik atar. Bu eleman daha sonra DHTML kullanılarak manipüle edilebilir veya erişilebilir.

İlki, öte yandan, belge içinde bir yer işaretine benzer şekilde adlandırılmış bir konum belirler. Bir "ankraj" a bağlı, mükemmel bir mantıklı.


1

Html 5'te id=""öznitelik, bir öğe için benzersiz bir tanımlayıcı tanımlar; bu, aynı zamanda bir parça bağlantısı için bir bağlantıdır. Önceki html standartlarında, öğenin name=""niteliği <a>bir parça bağlantısı için bir çapa tanımlar. Şöyle bir şey öneriyorum: Özellik
<a name="foo" id="foo"></a><h1>Foo Title</h1>
için destek id=""biraz sivilceli (tüm büyük tarayıcıların en son sürümleri desteklese de, birkaç yıldan eski olmayan sürümler [Ve bir şeyleri kırmamak en iyisi) için iyi bir neden yoksa]). Uyumludur ve link'd öğesinde ne varsa biçimlendirmez, çünkü kapanış </a> hala öğenin dışındadır, ancak mevcut tüm standartlarda hala geçerlidir.

Öğenin name=""ve id=""özniteliklerinin <a>aynı olduğundan emin olun .


2
HTML kullanan her şey bir tarayıcı değildir. HTML kullanarak bir pencerede bilgi görüntüleyen bir Java kütüphanesi kullanıyorum. Bu işe yarayan tek yöntemdir. Gerekli namebir bağlantı etiketindeki özelliktir; özellikleri yerleştirme hNveya spançalışmadı.
Mars

0

Eski tarayıcılar için ad niteliğini ve yeni tarayıcılar için kimlik niteliğini kullanma hakkında. Her iki seçenek de kullanılacak ve geri dönüş yöntemi varsayılan olarak uygulanacaktır !!!


-3

Tüm "adlandırılmış çapa" kavramı, tanım gereği ad özniteliğini kullanır. Sadece adı kullanmaya devam etmelisiniz, ancak ID özelliği bazı javascript durumları için kullanışlı olabilir.

Yorumlarda olduğu gibi, bahislerinizi korumak için her zaman her ikisini de kullanabilirsiniz.


Her ikisini de kullanırken id: s ve names global olarak benzersiz mi? olduğu gibi, hem id hem de adla aynı dizeyi kullanabilir miyim?
Henrik Paul

Yapabilirsiniz, ancak bazı insanlar bunun kötü bir uygulama olduğunu düşünüyor.
Alex Fort

9
HTML spesifikasyonuna göre, her ikisi de mevcutsa, ad ve kimlik aynı olmalıdır. Ayrıca adların ve kimliklerin aynı ad alanında olduğunu söylüyor. HTML doğrulayıcı hizmeti bunları kontrol etmez ve tarayıcıların bakımından şüpheliyim, ancak yine de takip etmek için iyi yönergeler gibi görünüyorlar.
erickson

3
Gerçeklik yeniden tanımlandı! <bir isim ... en başından beri hastaydı ve CSS bağlantı stili onu daha da rahatsız ediyor.
Robert Siemer
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.