Boş bir href geçerli mi?


179

Web geliştiricilerimizden biri, açılır listeyi şekillendirmek için yer tutucu olarak aşağıdaki html'yi kullanır.

<a href="" class="arrow"></a>

Bu, tutturma etiketi olarak kabul edildi mi?

Href değeri olmadığından, bazı bağlantı denetleyicisi raporlarımızda bozuk olarak görünür.


10
Ama IE'de çalışmıyor! Peki IE'de çalışır ama spec karşı tamamen farklı bir davranış ile. Bu yüzden spesifikasyon başına geçerlidir, ancak uygulamada geçerli değildir: (((
ZhongYu

Bayou.io'nun söylediklerine genişleyen IE, belgenin üzerindeki dizine bağlanır: stackoverflow.com/questions/7966791/…
Nate

1
Evet, IE'nin eski sürümlerindeki boş bir href (7/8 vb.) Dizin listesi gibi kötü sonuçlara yol açabilir. Google'da bu konuda çok fazla belge var
Ringo

örneğin: gtmetrix.com/avoid-empty-src-or-href.html . Sadece eski tarayıcıları boşver, mevcut IE, Edge ve ayrıca Webkit tarayıcılarını etkiler.
Ringo

Yanıtlar:


60

Bu soru zaten cevaplanmış olmasına rağmen ( tl; dr: evet, boş bir hrefdeğer geçerlidir), mevcut cevapların hiçbiri ilgili spesifikasyonlara referans vermemektedir.

Boş bir dize URI olamaz. Ancak, hreföznitelik yalnızca URI'leri değer olarak değil, aynı zamanda URI referanslarını da alır. Boş bir dize bir URI başvurusu olabilir.

HTML 4.01

HTML 4.01 , bölüm 4.2'de söylediği RFC 2396'yı kullanır . Aynı Belge Referansları (cesur vurgu madeni):

URI içermeyen bir URI referansı, geçerli belgeye yapılan bir referanstır. Başka bir deyişle, bir belgedeki boş bir URI başvurusu, belgenin başlangıcına bir başvuru olarak yorumlanır ve yalnızca bir parça tanımlayıcısı içeren bir başvuru, o belgenin tanımlanan parçasına bir referanstır.

RFC 2396, esasen aynı şeyi söyleyen RFC 3986 (şu anda IETF'in URI standardı ) tarafından kullanılmamaktadır .

HTML5

HTML5 kullanımları ( geçerli URL potansiyel boşluklarla çevriligeçerli URL ) W3C URL spec durduruldu. Bunun yerine WHATWG'nin URL Standardı kullanılmalıdır (son bölüme bakın).

HTML 5.1

HTML 5.1 kullanır ( potansiyel olarak boşluklarla çevrili geçerli URLgeçerli bir URL ) WHATWG URL Standardı (bir sonraki bölüme bakınız).

WHATWG HTML

WHATWG HTML kullanımları ( geçerli URL potansiyel boşluklar ile çevrili ) tanımı geçerli URL dizesine gelen WHATWG URL Standardı bunun bir olabileceğini söylüyor, göreli URL-with-parçası dize bir olmak, en azından zorunluluk, bağıl-URL dizesi , bir yola göre göreceli şemadan daha az URL dizesi olabilir , bu da bir şema dizesi ile başlamamış, yola göre göreceli bir URL dizgisidir: ve tanımı şöyle der (kalın vurgu mayını):

Yola bağlı URL dizesi, sıfır veya daha fazla URL yolu segmenti dizesi olmalı , birbirinden U + 002F (/) ile ayrılmış ve U + 002F (/) ile başlamamalıdır.


185

Geçerli.

Bununla birlikte, standart uygulama href="#"veya bazen kullanmaktır href="javascript:;".


23
RFC 2396'da belirtildiği gibi: URI içermeyen bir URI referansı geçerli belgeye bir referanstır. Başka bir deyişle, bir belge içinde boş bir tanım-yeri başvurusu, bu belgenin başlangıcına referans olarak yorumlanır
Ekim

32
tıkladığımda href="#", odak IE'de sayfanın üstüne taşınır, bu yüzden href="javascript:;"daha iyi düşünüyorum
Deckard

32
href = "#" bir anti-modeldir. Tarayıcı geçmişine ekstra bir giriş ekler ve bazı durumlarda tarayıcıyı en üste kaydırır, eğer kullanmıyorsanız href özelliğini dışarıda bırakabilirsiniz. varsayılan olarak "" olarak ayarlanır ve bu nedenle engellenmezse sayfayı yeniden yükler.
tosh

16
@tosh, hayır, href özelliğini dışarıda bırakırsanız, <a> öğesi bir bağlantı olarak biçimlendirilmez, odaklanamaz ve <a href = "" olarak bir bağlantı oluşturmazsa eminim > veya <a href> yapar. İşinize yarıyorsa, bunu gösteren bir JSFiddle paylaşır mısınız?
Gui Prá

6
@tosh, komik olan ne biliyor musun? Görünüşe göre HTML5'ten beri, özelliği atlamak bu şekilde çalışmalıdır, bkz. W3.org/TR/html5/text-level-semantics.html#the-a-element (Aşağıdaki cevabı gönderdiğiniz için teşekkürler halfdan.) henüz satıcılar tarafından uygulanmaktadır ve hala sadece aday tavsiyesi olduğundan, nihai standartta mı tutulacağını mı yoksa satıcıların bundan önce mi uyup uymayacağını söylemek zor.
Gui Prá

115

Diğerlerinin söylediği gibi, geçerlidir.

Yine de her yaklaşımın bazı dezavantajları vardır:

href="#" tarayıcı geçmişine fazladan bir giriş ekler (örneğin geri düğmelerde can sıkıcıdır).

href="" sayfayı yeniden yükler

href="javascript:;" herhangi bir problemi yok gibi görünüyor (dağınık ve anlamsız görünmek dışında) - kimse biliyor mu?


22
Bir başka ilginç olan href = "//: 0", sunucuya istekte bulunmayacak veya geçmiş bırakmayacak.
diachedelic

2
//: 0, bazı resimlerimin Chrome'a ​​yüklenememesine neden oluyor. Chrome'un bunu bir iptal komutu aldığını yorumlar.
David Grenier

5
href: "javascript :;" hem Android'de bir iOS
web görünümleri

2
IE dokümanın üzerindeki dizine
Nate

1
Bunu test etmedim, ama href = "javascript :;" olduğundan şüpheleniyorum satır içi JavaScript'e izin vermeyen İçerik Güvenliği Politikasını ihlal eder. Bu politikayı etkinleştirmeyi planlıyorsanız, alternatiflerden birini kullanırdım.
Mark Good

60

Bir href içermemesi, özellikle bir onclick işleyicisi ile tamamen geçerli bir HTML olsa da, dikkate alınması gereken bazı şeyler vardır: bir tabindex değeri ayarlanmadan klavyeye odaklanmayacaktır. Ayrıca, IE, tabindex'in ayarlanıp ayarlanmadığına bakılmaksızın, href niteliği olmayan herhangi bir bağlantı elemanının odaklanamaz olarak erişilebilirlik arabirimleri aracılığıyla rapor edeceği için, Internet Explorer kullanan ekran okuyucu yazılımı tarafından erişilemez.

Bu nedenle, aşağıdakiler tamamen geçerli olabilir:

<a class="arrow">Link content</a>

Null efektli href niteliğini açıkça eklemek çok daha iyi

<a href="javascript:void(0);" class="arrow">Link content</a>

Tüm kullanıcıların tam desteği için, bir görüntüyü oluşturmak üzere sınıfı CSS ile kullanıyorsanız, neler olup bittiğine ilişkin metinsel bir açıklama sağlamak için title özelliği gibi bazı metin içeriği de eklemeniz gerekir.

<a href="javascript:void(0);" class="arrow" title="Go to linked content">Link content</a>

1
Atlamanın hreferişilebilirlik arayüzleriyle karışacağından bahsettiğiniz için teşekkür ederiz .
Daniel Sokolowski

1
Ayrıca, erişilebilirlik perspektifinden, hrefdeğeri göreceli / mutlak yoldan başka bir şeye ayarlamanın ekran okuyucu sorunlarına neden olacağını da ekleyeceğim . Bunun amacı olmadığı için bu sorunu geçici olarak bir karma / pound simgesi kullanmaktan kaçının. Ekran okuyucular (şu anda VoiceOver) bağlantınızı bir parça tanımlayıcı olarak (geçerli sayfada bir yere bağlantı) ilan edebilir ve ayrıca standartlar açısından da geçerlidir. bkz. w3.org/2001/tag/2011/01/HashInURI-20110115#NakedHash
Michel Hébert

27

Mevcut HTML5 taslağı , href niteliğinin tamamen yerine getirilmesine de izin verir.

A öğesinin href özelliği yoksa, öğe, alakalı olsaydı, bir bağlantının başka türlü yerleştirilmiş olabileceği yer tutucusunu temsil eder.

Sorunuzu cevaplamak için: Evet geçerlidir.


6
evet, AMA - <a>hayır hrefolan bir öğe bazı tarayıcılarda doğrudan stilize edilir. Örneğin, ": vurgulu" stiller Chrome'da (ve diğer garip şeylerde) çalışmaz
Alex

Bir <a>etiketi olmayan bir etiket , bir bağlantıyı (geleneksel olarak bir çapa) değil, başka bir şeyihref temsil eder . Ayrıca, isteğe bağlı bir özellik ile boş olabilecek bir özellik arasında bir fark vardır.
Kobi

19

Gerçekten, boş bırakabilirsiniz (W3 doğrulayıcı şikayet etmiyor).

Fikri bir adım daha ileri götürmek: = "" işaretini dışarıda bırakın. Bunun avantajı, bağlantının geçerli sayfaya bir çapa olarak işlem görmemesidir.

<a href>sth</a>

Yine de: <a href></a>Açık bir değer görülmeyen href özelliği. Özellik IE7 tarafından bırakılabilir.
c24w

1
Ben de bu çözümü seviyorum. IE7 davranışı dışında başka dezavantajlar biliyor musunuz?
rinat.io

Bu yasa dışı bir sözdizimidir. Göre spec “[Boş Özellik] sözdizimi sadece Boole özellikleri için izin verilir.”
Robert Siemer

9

W3'ün doğrulayıcısı boş bir hrefözellikten şikayet etmese de , geçerli HTML5 Çalışma Taslağı şunları belirtir:

Açık hrefözelliğinin ave areaöğelerinin , boşluklarla çevrelenmiş geçerli bir URL olan bir değeri olmalıdır .

Bir Geçerli bir URL uyan URL URL Standardı . Artık URL Standardı başınızı döndürmek için biraz kafa karıştırıcı, ancak hiçbir yerde bir URL'nin boş bir dize olabileceğini belirtmiyor.

... yani boş bir dize geçerli bir URL değildir .

HTML5 Çalışma Taslağı şu şekilde devam eder:

Not: üzerine nitelik ve unsurların gerekli değildir ; bu öğelerin öznitelikleri olmadığında köprüler oluşturmazlar.hrefaareahref

Bu, hrefözelliği tamamen atlayabileceğimiz anlamına gelir :

<a class="arrow"></a>

hrefAmacınız , bu -less aöğelerin yine de klavye müdahalesi gerektirmesiyse, normal a roleveya atama tabindexişleyicilerinizin yanında normal a atama yolundan gitmeniz gerekir :

<a class="arrow" role="button" tab-index="0"></a>

Aslında. Ne yazık ki, alıntıladığınız gibi, bunu bırakmak hrefbir köprü değil, bu da onclickklavye kullanıcıları için işlevselliği erişemez hale getiriyor .
aij

7

Uyarı kelimesi:

Deneyimlerime göre, hrefklavye gezinmesi onu görmezden geleceği ve href mevcutken asla olduğu gibi odaklanmayacağı için özniteliğin atlanması erişilebilirlik sorunlarına neden olur. Öğenizi tabindex'e manuel olarak dahil etmek bunun bir yoludur.


3

geçerli ama UpTheCreek'in dediği gibi 'Her yaklaşımın bazı dezavantajları var'

ajax'ı bir etiket aracılığıyla çağırıyorsanız, bu şekilde sayfanın yeniden yüklenmesini sağlayacak ve ajax kodu asla çağrılmayacak şekilde href = "" bırakın ...

bu düşünceyi paylaşmak iyi olurdu


2

<a href="#" class="arrow">Bunun yerine yapmaya çalışın . (Keskin #karakteri not edin ).

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.