HTML Etiketlerinde Standart Olmayan Özellikler. İyi bir şey? Kötü bir şey? Senin düşüncelerin?


92

HTML (veya belki sadece XHTML?), Etiketlerdeki standart olmayan nitelikler söz konusu olduğunda nispeten katıdır. Spesifikasyonun parçası değillerse, kodunuzun uyumlu olmadığı kabul edilir.

Bununla birlikte, standart olmayan öznitelikler meta verileri Javascript'e geçirmek için oldukça yararlı olabilir. Örneğin, bir bağlantının bir pop-up gösterdiği varsayılıyorsa, pop-up'ın adını bir öznitelikte ayarlayabilirsiniz:

<a href="#null" class="popup" title="See the Popup!" 
   popup_title="Title for My Popup">click me</a>

Alternatif olarak, pop-up'ın başlığını bir aralık gibi gizli bir öğede depolayabilirsiniz:

<style>
    .popup .title { display: none; }
</style>
<a href="#null" title="See the Popup!" class="popup">
    click me
    <span class="title">Title for My Popup</span>
</a>

Ancak hangisinin tercih edilen bir yöntem olması gerektiği konusunda yırtık. İlk yöntem daha özlü ve tahminimce arama motorları ve ekran okuyucularla pek uğraşmıyor. Tersine, ikinci seçenek büyük miktarda verinin depolanmasını kolaylaştırır ve bu nedenle daha çok yönlüdür. Aynı zamanda standartlara da uygundur.

Bu toplulukların düşüncelerinin ne olduğunu merak ediyorum. Böyle bir durumla nasıl başa çıkarsınız? İlk yöntemin basitliği, potansiyel dezavantajlardan (eğer varsa) ağır basıyor mu?


3
Bunlara "expando" özellikleri denir - eğer onlar hakkında daha fazla bilgi edinmek istiyorsanız.
Jason Bunting

2
AFAIK, expando öznitelikleri çalışma zamanında javascript kullanılarak ayarlanır.
XHTML'nin bir

Yanıtlar:


50

Önerilen HTML 5 çözümünün ( data-önekli özellikler) büyük bir hayranıyım . Düzenleme: Özel özniteliklerin kullanımına ilişkin muhtemelen daha iyi örnekler olduğunu eklemeliyim. Örneğin, standart özniteliklerde analogu olmayan özel bir uygulamanın kullanacağı veriler (örneğin, bir sınıfAdı veya id'de mutlaka ifade edilemeyen bir şeye dayalı olarak olay işleyicileri için özelleştirme).


2
Standartlara uygun olmamasına rağmen bu çözümü şimdi takip etme eğilimindeyim.
Tom Ritter

1
Doğrulamadığı için bundan her zaman kaçındım. Ama şimdi düşünüyorum da, her şeyi bir class = "" özniteliğinde (jquery meta verileri gibi) sıkıştırmak ille de daha iyi değil. <HTML5 alanında bu yöntemin pratik, gerçek dünyadaki dezavantajları var mı? Temel olarak - şimdi hangi sorunlar ortaya çıkacak? İdeal değil gibi görünüyor, ancak aklıma gelen hiçbir yan etkisi yok.
rocketmonkeys

@Rocketmonkeys Emin değilim, ancak bir sınıf özniteliği içindeki verileri kullanmanın tarayıcıyı bir öğeye tanımsız css kurallarını uygulamaya zorlayabileceğini düşünüyorum, bu bazı sorunlara veya performans sorunlarına neden olabilir. Yine emin değilim.
Vitim.us

@ Vitim.us, eğer böyle bir performans artışı varsa, ihmal edilebilir. Tarayıcılar bu tür şeylerde oldukça etkilidir; stilleri gerçekten uygulamak için isabet daha büyük olurdu. Unutmayın, sınıflar stil oluşturma amacıyla icat edilmiş bir şey değil, diğer özellikler gibi sadece öğe verileridir. Herhangi bir öznitelik bir seçicide kullanılabilir, bu nedenle böyle bir performans isabeti varsa data-, öğeye eklediğiniz herhangi bir öznitelik ( önekli dahil ) tam anlamıyla geçerli olacaktır .
göz kapaksızlık

@eyelidlessness bu iyi bir argüman, kabul etmeliyim, Javascript içinde doğru veri yapısını kullanmayı tercih etsem bile bazı durumlarda data özelliğini kullanmanın uygun olduğunu buldum. Rocketmonkeys'in dediği gibi jquery'den kaçınıyorum. İnsanları mikro optimizasyonlar konusunda rahatsız etmeyi gerçekten bırakmam gerekiyor.
Vitim.us

27

Özel öznitelikler, ekstra verileri istemci tarafına taşımanın uygun bir yolunu sağlar. Dojo Toolkit bunu düzenli olarak yapıyor ve şu noktalara dikkat çekildi ( Dojo Araç Kiti Efsanelerinin Hatalarını Çıkarma ):

Özel öznitelikler her zaman geçerli HTML olmuştur, ancak bir DTD'ye karşı test edildiklerinde doğrulanmazlar. [...] HTML belirtimi, tanınmayan herhangi bir özniteliğin kullanıcı aracılarındaki HTML oluşturma motoru tarafından yok sayılacağını belirtir ve Dojo isteğe bağlı olarak geliştirme kolaylığını artırmak için bundan yararlanır.


9

Diğer bir seçenek de Javascript'te şöyle bir şey tanımlamak olacaktır:

<script type="text/javascript">
var link_titles = {link1: "Title 1", link2: "Title 2"};
</script>

Daha sonra, bağlantınızın bu hashtable'daki kimliğe karşılık gelen bir kimliğe sahip olduğunu varsayarak, bunu daha sonra Javascript kodunuzda kullanabilirsiniz.

Diğer iki yöntemin dezavantajlarına sahip değildir: standart olmayan nitelikler veya çirkin gizli aralık yok.

Dezavantajı, sizin örneğiniz kadar basit şeyler için biraz abartılı olabilmesidir. Ancak, aktarılacak daha fazla veriye sahip olduğunuz daha karmaşık senaryolar için bu iyi bir seçimdir. Özellikle verilerin JSON olarak aktarıldığı düşünüldüğünde, karmaşık nesneleri kolaylıkla geçirebilirsiniz.

Ayrıca, verileri biçimlendirmeden ayrı tutarsınız, bu da sürdürülebilirlik için iyi bir şeydir.

Hatta bunun gibi bir şeye sahip olabilirsiniz (ki bunu diğer yöntemlerle gerçekten yapamazsınız):

var poi_types = {1: "City", 2: "Restaurant"};
var poi = {1: {lat: X, lng: Y, name: "Beijing", type: 1}, 2: {lat: A, lng: B, name: "Hatsune", type: 2}};

...

<a id="poi-2" href="/poi/2/">Hatsune</a>

Ve büyük olasılıkla bazı sunucu tarafı programlama dili kullandığınız için, bu karma tablo dinamik olarak oluşturmak için önemsiz olmalıdır (sadece JSON'a serileştirin ve sayfanın başlık bölümünde tükürün).


4

Bu durumda en uygun çözüm şudur:

<a href="#" alt="" title="Title of My Pop-up">click</a>

ve başlık özelliğini kullanma.

Bazen gerçekten ihtiyacım olursa şartnameyi bozuyorum. Ama nadiren ve sadece iyi bir nedenle.

DÜZENLEME: -1'in neden olduğundan emin değilim, ama bazen belirtmediğinizde spesifikasyonları kırmanız gerektiğini düşündüğünüzü söylüyordum.


4

Neden özel bir DTD'de popup_title özniteliğini bildirmiyorsunuz? Bu, doğrulama ile sorunu çözer. Bunu standart olmayan her öğe, özellik ve değerle yapıyorum ve bu doğrulama bana kodumla ilgili yalnızca gerçek sorunları gösteriyor. Bu, bu tür HTML ile herhangi bir tarayıcı hatasını daha az olası kılar.


2

Bağlantı öğesinin İÇİNDE gizli giriş öğelerini iç içe yerleştirebilirsiniz

<a id="anchor_id">
  <input type="hidden" class="articleid" value="5">
  Link text here
</a>

Ardından verileri kolayca dışarı çekebilirsiniz.

$('#anchor_id .articleid').val()

1
Evet, ama en iyi yolu kullanımına geçerli: <input type="hidden" title="article_id" value="5" />. Sınıf, CSS için bir şey olduğundan, sınıf stil bilgisinde değilse aslında geçersiz kod verir. JS veya CSS kapalı olsa bile veriler gizli kalacaktır.
Yeti

1
@Yeti, sınıf CSS için bir şey değildir ve stillerde görünmüyorsa geçersizdir. Diğer nitelikler gibi, yalnızca öğeyle ilgili verilerdir. CSS ile olan ilişki, iyi desteklenen bir seçici olmasıdır.
göz kapaksızlık

0

Sonunda benim çözümüm, bir tür sınırlayıcı ile ayrılmış olan id etiketindeki ek verileri gizlemekti (bir alt çizgi bir boşluk, iki bu argümanın sonu), ikinci argüman ise bir id var:

<a href="#" class="article" id="Title_of_My_Pop-up__47">click</a>

Çirkin, ve zaten başka bir şey için id etiketini kullanmadığınızı varsayar, ancak her tarayıcıda uyumludur.


-1

Örneğinizdeki kişisel hissim, XHTML spesifikasyonunun standartlarını karşıladığından, yayılma yolunun daha uygun olduğu yönünde. Bununla birlikte, özel öznitelikler için bir argüman görebiliyorum, ancak bunların gerekli olmayan bir kafa karışıklığı seviyesi eklediklerini düşünüyorum.


10
SPAN yolu yine de etiketin kötüye kullanılmasıdır. Doğrulama standartlarını karşılayabilir, ancak anlamsal standartları karşılamaz.
ceejayoz

-1

Ben de bunun için beynimi yıkıyorum. Standart olmayan özelliklerin okunabilirliğini seviyorum, ancak standardı bozması hoşuma gitmiyor. Gizli aralık örneği uyumludur, ancak çok okunabilir değildir. Peki buna ne dersin:

<a href="#" alt="" title="" rel="{popup_title:'Title of My Pop-up'}">click</a>

JSON'un anahtar / değer çifti gösterimi nedeniyle kod çok okunabilir. Bunun bağlantıya ait meta veri olduğunu sadece ona bakarak anlayabilirsiniz. "Rel" özniteliğini ele geçirmenin yanı sıra görebildiğim tek kusur, bunun karmaşık nesneler için dağınık hale gelmesidir. Yukarıda bahsedilen "veri" önekli öznitelikler fikrini gerçekten seviyorum. Mevcut tarayıcılardan herhangi biri bunu destekliyor mu?

İşte düşünmeniz gereken başka bir şey. Uyumlu kodun SEO üzerinde ne kadar etkisi yoktur?


7
Rel özelliği, geçerli sayfa ile bağlantılı kaynak arasındaki ilişkiyi açıklar. Bu genel bir "İstediğiniz verileri saklayın" özelliği değildir. Yani bu korkunç.
Quentin

1
Mevcut tarayıcılardan herhangi biri bunu destekliyor mu? - Destekleyecek ne var? Tarayıcılar, uyumlu olmayan kodu zaten tolere edebilir. Bunun yeni HTML5'in bir parçası olduğu düşünüldüğünde, tıpkı diğer herhangi bir özel özniteliği eklediğiniz gibi data özniteliğini eklemekten korkulacak bir şey yoktur.
Slav
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.