HTML'deki özellikler ve özellikler arasındaki fark nedir?


408

JQuery 1.6.1 yapılan değişiklikler sonra, HTML özellikleri ve öznitelikleri arasındaki farkı tanımlamak çalışıyorum.

JQuery 1.6.1 sürüm notlarındaki listeye (altta yakın) bakıldığında, HTML özelliklerini ve özelliklerini aşağıdaki gibi sınıflandırabiliriz:

  • Özellikler: Bir boolean değeri olan veya selectIndex gibi UA olarak hesaplanan tümü.

  • Nitelikler: Boolean olmayan veya UA tarafından üretilen bir değer içermeyen bir HTML öğesine eklenebilen 'Özellikler'.

Düşünceler?


Yanıtlar:


826

HTML kaynak kodunu yazarken , HTML öğelerinizde öznitelikler tanımlayabilirsiniz . Ardından, tarayıcı kodunuzu ayrıştırdığında, karşılık gelen bir DOM düğümü oluşturulur. Bu düğüm bir nesnedir ve bu nedenle özellikleri vardır .

Örneğin, bu HTML öğesi:

<input type="text" value="Name:">

2 özniteliğe ( typeve value) sahiptir.

Tarayıcı bu kodu ayrıştırdıktan sonra, bir HTMLInputElement nesnesi oluşturulur ve bu nesne düzinelerce özellik içerir: accept, accessKey, align, alt, nitelikler, autofocus, baseURI, işaretli, childElementCount, childNodes, children, classList, className, clientHeight vb.

Belirli bir DOM düğümü nesnesi için özellikler o nesnenin özellikleridir ve öznitelikler attributeso nesnenin özelliğinin öğeleridir .

Belirli bir HTML öğesi için bir DOM düğümü oluşturulduğunda, özelliklerinin çoğu aynı veya benzer adlara sahip özniteliklerle ilgilidir, ancak bire bir ilişki değildir. Örneğin, bu HTML öğesi için:

<input id="the-input" type="text" value="Name:">

karşılık gelen DOM düğümü olacaktır id, typeve value(diğerlerinin yanı sıra) özellikleri:

  • idTesiste olduğunu yansıyan özellik için idöznitelik: özelliği alınıyor öznitelik değerini okur ve özelliğini ayarlayarak özellik değerini yazar. ida, saf yansıyan özelliği, düzeltme veya değeri sınırlamaz.

  • typeTesiste olduğunu yansıyan özellik için typeöznitelik: özelliği alınıyor öznitelik değerini okur ve özelliğini ayarlayarak özellik değerini yazar. bilinen değerlerletype sınırlı olduğu için (örneğin, bir girişin geçerli türleri) salt yansıtılan bir özellik değildir . Eğer olsaydı , o zaman verir ama verir .<input type="foo">theInput.getAttribute("type")"foo"theInput.type"text"

  • Buna karşılık, valueözellik valueözniteliği yansıtmaz . Bunun yerine, girişin geçerli değeridir . Kullanıcı giriş kutusunun değerini el ile değiştirdiğinde, valueözellik bu değişikliği yansıtır. Kullanıcı "John"giriş kutusuna girerse , o zaman:

    theInput.value // returns "John"

    buna karşılık:

    theInput.getAttribute('value') // returns "Name:"

    valueÖzelliği yansıtan akım ise, giriş kutusu içindeki metin içeriğine valueözellik içeren ilk metin içeriği valueHTML kaynak kodundan öznitelik.

    Şu anda metin kutusunun içinde ne olduğunu bilmek istiyorsanız, özelliği okuyun. Bununla birlikte, metin kutusunun başlangıç ​​değerinin ne olduğunu bilmek istiyorsanız, niteliği okuyun. Veya defaultValueözelliğin saf bir yansıması olan valueözelliği kullanabilirsiniz:

    theInput.value                 // returns "John"
    theInput.getAttribute('value') // returns "Name:"
    theInput.defaultValue          // returns "Name:"

Doğrudan kendi özelliğini (yansıtacak birkaç özellik vardır rel, id), bazı hafif-farklı adlarla doğrudan yansımaları (vardır htmlForyansıtan forözelliği, classNameyansıtan classözelliği) onların niteliğini yansıtacak ama birçok kısıtlamalar / modifikasyonlar (ile src, href, disabled, multiple) ve bu yüzden üzerinde. Spec , çeşitli yansıma türlerini kapsar.


1
Hey Sime, bunun oldukça belirsiz olduğunu düşünüyorum, özellikle buraya bir göz attıysanız : w3.org/TR/html4/index/attributes.html ve net bir cevap yok. Birinin temelde jQuery blogunda özette belirtilenleri takip etmesi gerekir ve o zaman bile, diğerini
eşleyecek ve

4
@oss Bağlantınız HTML özelliklerinin bir listesini ifade ediyor. Bu liste belirsiz değil - bunlar niteliklerdir.
Šime Vidas

ilişki hakkında bazı belgeler var mı? @ ŠimeVidas
SKing7

3
Özelliklere ilişkin özelliklerin tam bir listesini (gibi for-> htmlFor) ve benzer şekilde başlangıç ​​değerlerini bir özellikten alan, ancak yansıtmayan özelliklerin listesini nerede bulabilirim ( input.value). Bunun github.com/Matt-Esch/virtual-dom gibi bir kütüphane kaynağında bir yerde olmasını bekliyorum ama gerçekten belgelenmiyor.
sstur

1
@Pim Kendim okumadım, ancak bu 4 bölümlük makale serisi harika bir kaynak gibi görünüyor: twitter.com/addyosmani/status/1082177515618295808
Šime Vidas

53

Sime Vidas'ın cevabını okuduktan sonra daha fazla araştırdım ve açısal dokümanlar üzerinde çok basit ve anlaşılması kolay bir açıklama buldum .

HTML özelliği ile DOM mülkü karşılaştırması


Öznitelikler HTML ile tanımlanır. Özellikler DOM (Belge Nesne Modeli) tarafından tanımlanır.

  • Birkaç HTML özelliğinin özelliklerle 1: 1 eşlemesi vardır. idbuna bir örnektir.

  • Bazı HTML özelliklerinin karşılık gelen özellikleri yoktur. colspanbuna bir örnektir.

  • Bazı DOM mülklerinin karşılık gelen özellikleri yoktur. textContent buna bir örnektir.

  • Birçok HTML özelliği özelliklerle eşleşiyor gibi görünüyor ... ancak düşündüğünüz şekilde değil!

Bu genel kuralı, bu genel kuralı kavrayıncaya kadar kafa karıştırıcı:

Öznitelikler DOM özelliklerini başlatır ve sonra yapılır. Özellik değerleri değişebilir; özellik değerleri olamaz.

Örneğin, tarayıcı <input type="text" value="Bob">oluşturulduğunda value, "Bob" olarak başlatılan bir özelliğe sahip karşılık gelen bir DOM düğümü oluşturur .

Kullanıcı giriş kutusuna "Sally" girdiğinde, DOM elementi value özelliği "Sally" olur. Ancak, giriş öğesine bu özellik hakkında sorarsanız , HTML value özelliği değişmeden kalır: input.getAttribute('value')"Bob" döndürür.

HTML özelliği başlangıç değerini valuebelirtir ; DOM özelliği geçerli değerdir.value


disabledÖzellik, başka bir tuhaf bir örnektir. Bir düğmenin disabledözelliği falsevarsayılan olarak düğmedir. disabledÖzniteliği eklediğinizde, tek başına varlığı düğmenin disabledözelliğini başlatarak truedüğmenin devre dışı bırakılmasını sağlar.

disabledÖzniteliğin eklenmesi ve kaldırılması düğmeyi devre dışı bırakır ve etkinleştirir. Özelliğin değeri önemsizdir, bu yüzden bir düğmeyi yazarak etkinleştiremezsiniz<button disabled="false">Still Disabled</button>.

Düğmenin disabled özelliğini ayarlamak düğmeyi devre dışı bırakır veya etkinleştirir. Değeri mülkiyet konularında.

HTML özniteliği ve DOM özelliği, aynı ada sahip olsalar bile aynı şey değildir.


Bu örnek doğru değil: colspanözniteliğin özelliği vardır colSpan. ... Peki, hangi özelliğin şu anda ilgili bir özelliği yok?
Robert Siemer

46

Cevaplar zaten niteliklerin ve özelliklerin nasıl farklı şekilde ele alındığını açıklıyor, ancak bunun ne kadar çılgın olduğunu belirtmek istiyorum . Bir dereceye kadar spesifikasyon olsa bile.

Bazı özniteliklerin (örneğin id, sınıf, foo, bar ) DOM'da yalnızca bir tür değeri tutması çılgınca, bazı özniteliklerin (örneğin işaretli, seçili ) iki değeri tutması çılgınca ; yani "yüklendiğinde" değeri ve "dinamik durum" değeri. (DOM'un belgenin durumunu tam olarak temsil etmesi gerekmiyor mu?)

Bir metin ve bir onay kutusunun iki giriş alanının aynı şekilde davranması kesinlikle önemlidir . Metin giriş alanı ayrı bir "yüklendiğinde" değerini ve "geçerli, dinamik" değerini tutmazsa, neden onay kutusu kullanılır? Onay kutusunun işaretli özellik için iki değeri varsa , neden sınıf ve kimlik özellikleri için iki değeri yoktur ? Bir metin * girdi * alanının değerini değiştirmeyi bekliyorsanız ve DOM'un (yani "serileştirilmiş gösterim") değişmesini ve bu değişikliği yansıtmasını bekliyorsanız, neden bir giriş alanından aynı şeyi beklemezsiniz? tip onay kutusu işaretli özellikte?

"Bu bir boolean özniteliğidir" ayrımı benim için hiçbir anlam ifade etmiyor ya da en azından bunun için yeterli bir sebep değil.


21
Bu bir cevap değil ama sana katılıyorum; tamamen delice.
Samuel

Evet, bu kavram berbat ve çok kötü bir şekilde standardize edilmemeli. Bu, eski IE'de iyi olan ve standartlar tarafından benimsenmesi gereken vakalardan biriydi (örneğin innerHTML gibi). Özellikler ve öznitelikler mümkün olduğunda senkronize edildi, özel öznitelikler bile çok güzel okunabilir js dot sözdizimi yaptı. HTML5 birinci sınıf vatandaşları özel HTML etiketleri yapar, özel nitelikleri de olmalıdır. Bu özellik eski IE hala kaldırıldığı için kaldırılıyor - sadece şimdi eski sistemler için IE ile geleneksel olarak sıkışmış pek çok şirketin şimdi IE10'da kırık olduğunu görüyoruz.
mike nelson

48
Deli değil. Yanlış anladın. checkedNiteliği ile temsil edilmektedir defaultChecked(aynı şekilde, bir metin girişi için özelliği valueniteliği ile temsil edilir defaultValueözelliği). İkinci bir özellik, checkedonay kutusunun işaretli olup olmadığını göstermek için gereklidir, çünkü bu bir onay kutusunun işlevselliğinin gerçek bir parçasıdır: etkileşimli ve kullanıcı tarafından değiştirilebilir (ve bir form sıfırlama düğmesi varsa varsayılana sıfırlanabilir) , başka bir niteliğin böyle idolmadığı bir şekilde. Bunun bir boolean niteliği olmasıyla ilgisi yoktur.
Tim Down

3
@TimDown - Teşekkürler. Bu beni WTF'nin üzerinden mi geçirdi? atlarlar.
pedz

12
@TimDown Herhangi bir mantıksal yaklaşım özellik adı ve öznitelik adı eşleşmesini yapacak veya en azından ilişkili olmayan bir öznitelik adı ve özellik adı eşleşmesine sahip olmayacağından hala "deli" olduğunu hissediyorum (yani, kontrol edilen öznitelik, defaultChecked özelliği, işaretli özellik ilgisizken). Aslında, herkesin varsaydığı mantıksal yaklaşım başlangıçta durumun nitelikleri ve özellikleri hiç ayırmamak olacaktır. Öznitelikler değişmez olmamalı, ancak her zaman özellik değerlerini yansıtmalıdır. İkisi arasında bir ayrım olmamalıdır.
dallin

10

bunlar w3c tarafından bir özellik nedir ve bir özellik nedir belirtilir http://www.w3.org/TR/SVGTiny12/attributeTable.html

ancak şu anda attr ve prop çok farklı değil ve neredeyse aynı

ama bazı şeyleri desteklemeyi tercih ediyorlar

Tercih Edilen Kullanım Özeti

.Prop () yöntemi, boolean öznitelikleri / özellikleri ve html'de bulunmayan özellikler (window.location gibi) için kullanılmalıdır. Diğer tüm öznitelikler (html'de görebileceğiniz özellikler) .attr () yöntemiyle değiştirilmeye devam edilebilir ve değiştirilmeye devam edilmelidir.

iyi aslında attr veya pervane veya her ikisini de kullanırsanız bir şey değiştirmek zorunda değilsiniz, ama her ikisi de çalışır kendi pervane atrr nerede işe yaramadı gördüm bu yüzden benim 1.6 app prop = aldı)


Hey Daniel, bunu okudum. Aşağıdaki gibi Sime'den bahsettiklerimizden bazıları HTML öğesine, örneğin alt eklenebilir, çünkü ikisini ayırmak için net bir kesim tanımı var gibi görünüyor. Bazı HTML spesifikasyonlarını okumaya devam edecek ve pratikte ikisini açıkça ayırt etmenin bir yolu olup olmadığını görecek.
schalkneethling

3
Bu belge HTML değil SVG ile ilgilidir.
Luzado

5

Fark HTML özellikleri ve özellikleri:

HTML'deki farkın ne olduğunu değerlendirmeden önce bu kelimelerin tanımlarına bakalım:

İngilizce tanımı:

  • Öznitelikler, bir nesnenin ek bilgilerine atıfta bulunur.
  • Özellikler, bir nesnenin özelliklerini tanımlar.

HTML bağlamında:

Tarayıcı HTML'yi ayrıştırdığında, temel olarak HTML'nin bellek temsilindeki bir ağaç veri yapısı oluşturur. Ağaç veri yapısı, HTML öğeleri ve metin olan düğümleri içerir. Bununla ilgili özellikler ve özellikler şu şekildedir:

  • Nitelikler , belirli DOM özelliklerini başlatmak için HTML'ye ekleyebileceğimiz ek bilgilerdir .
  • Tarayıcı HTML'yi ayrıştırıp DOM'u oluşturduğunda özellikler oluşur. DOM'deki öğelerin her biri, tarayıcı tarafından ayarlanan kendi özellik kümesine sahiptir. Bu özelliklerden bazılarının başlangıç ​​değerleri HTML özellikleri tarafından ayarlanmış olabilir. Oluşturulan sayfa üzerinde etkisi olan bir DOM mülkü her değiştiğinde, sayfa hemen yeniden oluşturulur

Bu özelliklerin eşleşmesinin 1 ila 1 olmadığını fark etmek de önemlidir. Diğer bir deyişle, bir HTML öğesinde verdiğimiz her özniteliğin DOM adlı benzer bir özelliği olmayacaktır.

Ayrıca farklı DOM elemanları farklı özelliklere sahiptir. Örneğin, bir <input>öğe bir <div>özellik üzerinde bulunmayan bir değer özelliğine sahiptir .

Misal:

Aşağıdaki HTML belgesini alalım:

 <!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">  <!-- charset is a attribute -->
  <meta name="viewport" content="width=device-width"> <!-- name and content are attributes -->
  <title>JS Bin</title>
</head>
<body>
<div id="foo" class="bar foobar">hi</div> <!-- id and class are attributes -->
</body>
</html>

Ardından <div>, JS konsolunda aşağıdakileri inceleriz:

 console.dir(document.getElementById('foo'));

Aşağıdaki DOM özelliklerini görüyoruz (gösterilen tüm mülkleri değil, krom aygıtları):

html özellikleri ve öznitelikleri

  • HTML'deki öznitelik kimliğinin artık DOM'daki bir id özelliği olduğunu görebiliyoruz. Kimlik HTML tarafından başlatıldı (javascript ile değiştirebilmemize rağmen).
  • HTML'deki sınıf özelliğinin karşılık gelen bir sınıf özelliği olmadığını ( classJS'de ayrılmış anahtar kelime) görebiliyoruz. Ama aslında 2 özellik,classList ve className.
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.