.prop () ve .attr () karşılaştırması


2299

Yani jQuery 1.6 yeni bir işleve sahiptir prop().

$(selector).click(function(){
    //instead of:
    this.getAttribute('style');
    //do i use:
    $(this).prop('style');
    //or:
    $(this).attr('style');
})

ya da bu durumda aynı şeyi yapıyorlar mı?

Ve eğer do kullanarak anahtara sahip prop(), tüm eski attr()ı 1.6 geçerseniz kıracak aramaları?

GÜNCELLEME

selector = '#id'

$(selector).click(function() {
    //instead of:
    var getAtt = this.getAttribute('style');
    //do i use:
    var thisProp = $(this).prop('style');
    //or:
    var thisAttr = $(this).attr('style');

    console.log(getAtt, thisProp, thisAttr);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.0/jquery.min.js"></script>
<div id='id' style="color: red;background: orange;">test</div>

(ayrıca bkz. şu keman: http://jsfiddle.net/maniator/JpUF2/ )

Konsol getAttribute, bir dize ve bir dize olarak günlüğe kaydedilir attr, ancak propa CSSStyleDeclaration, Neden? Ve bu gelecekte kodlamamı nasıl etkiler?


17
Bu kesinlikle ilgi çekici olacak: books.google.ca/…

28
@Neal, bu değişikliğin jQuery'yi aşması nedeniyle. HTML özellikleri ile DOM özellikleri arasındaki fark çok büyük.

7
JQuery'nin değişiklikleri geri aldığını görmek beni üzüyor. Yanlış yöne gidiyorlar.

4
@Neal. Evet, iki yöntemi ayırmak yerine sorunu daha da karmaşıklaştırıyor.

6
@BritishDeveloper yanıtı, her zaman x veya y kullandığını belirtmekten daha karmaşıktır, çünkü ne elde etmek istediğinize bağlıdır. Özelliği mi istiyorsunuz yoksa mülkü mü istiyorsunuz? onlar çok farklı iki şeydir.
Kevin B

Yanıtlar:


1875

Güncelleme 1 Kasım 2012

Orijinal cevabım özellikle jQuery 1.6 için geçerlidir. Tavsiyem aynı kalıyor, ancak jQuery 1.6.1 işleri biraz değiştirdi: tahmin edilen kırık web sitesi yığını karşısında, jQuery ekibi Boole özellikleri için eski davranışına yakın (ancak tam olarak aynı değil) bir şeye geri döndüattr() . John Resig de bu konuda blog yazdı . İçinde bulundukları zorlukları görebiliyorum ama yine de tercih ettiği tavsiyeye katılmıyorum attr().

Orijinal cevap

Doğrudan DOM'u değil, yalnızca jQuery'yi kullandıysanız, bu kesinlikle kavramsal bir gelişme olmasına rağmen, kafa karıştırıcı bir değişiklik olabilir. Bu değişiklik sonucunda kırılacak jQuery kullanan sitelerin bazilyonları için çok iyi değil.

Ana konuları özetleyeceğim:

  • Genellikle prop()yerine istiyorsun attr().
  • Çoğu durumda, prop()eskiden ne attr()yapar. Çağrıları değiştirilmesi attr()ile prop()kodunuzu genel çalışacaktır içinde.
  • Özelliklerle uğraşmak genellikle niteliklerden daha kolaydır. Bir özellik değeri yalnızca bir dize olabilirken bir özellik herhangi bir türde olabilir. Örneğin, checkedözellik bir Boolean, styleözellik her stil için ayrı özelliklere sahip bir nesnedir, sizeözellik bir sayıdır.
  • Hem bir özellik hem de aynı ada sahip bir öznitelik varsa, genellikle birini güncellemek diğerini günceller, ancak valueve gibi bazı girdilerin öznitelikleri için geçerli değildir checked: bu öznitelikler için, özellik her zaman geçerli durumu temsil eder. özniteliği (IE'nin eski sürümleri hariç) girişin varsayılan değerine / kontrolüne ( defaultValue/ defaultCheckedözelliğinde yansıtılır) karşılık gelir .
  • Bu değişiklik, özniteliklerin ve özelliklerin önünde sıkışmış sihirli jQuery katmanının bazılarını kaldırır, yani jQuery geliştiricilerinin özellikler ve öznitelikler arasındaki fark hakkında biraz bilgi sahibi olması gerekir. Bu iyi birşey.

Bir jQuery geliştiricisiyseniz ve mülkler ve öznitelikler hakkında tüm bu işin kafası karıştıysa, jQuery artık sizi bu şeylerden korumak için çok uğraşmadığından, bir adım geri çekilmeli ve biraz öğrenmelisiniz. Konuyla ilgili yetkili ama biraz kuru bir kelime için özellikler var: DOM4 , HTML DOM , DOM Seviye 2 , DOM Seviye 3 . Mozilla'nın DOM belgeleri çoğu modern tarayıcı için geçerlidir ve okunması teknik özelliklerden daha kolaydır, bu nedenle DOM referanslarını yararlı bulabilirsiniz . Eleman özelliklerinde bir bölüm var .

Özelliklerin özniteliklerden daha kolay ele alınmasına bir örnek olarak, başlangıçta işaretlenmiş bir onay kutusunu düşünün. Bunu yapmak için geçerli HTML'nin iki parçası şunlardır:

<input id="cb" type="checkbox" checked>
<input id="cb" type="checkbox" checked="checked">

Peki, onay kutusunun jQuery ile işaretli olup olmadığını nasıl anlarsınız? Stack Overflow'a bakın ve genellikle aşağıdaki önerileri bulacaksınız:

  • if ( $("#cb").attr("checked") === true ) {...}
  • if ( $("#cb").attr("checked") == "checked" ) {...}
  • if ( $("#cb").is(":checked") ) {...}

Bu aslında checked1995'ten beri her büyük komut dosyası tarayıcısında kusursuz bir şekilde çalışan ve çalışan Boolean özelliği ile ilgili en basit şeydir :

if (document.getElementById("cb").checked) {...}

Tesis ayrıca onay kutusunu işaretlemeyi veya işaretini kaldırmayı önemsiz kılar:

document.getElementById("cb").checked = false

JQuery 1.6'da, bu açıkça

$("#cb").prop("checked", false)

checkedBir onay kutusunu komut dosyası oluşturmak için özniteliği kullanma fikri yararsızdır ve gereksizdir. Özellik ne gerek.

  • Doğru yolu kontrol veya onay kutusunun işaretini kaldırın kullandığını ne belli değil checkedniteliği
  • Öznitelik değeri, geçerli görünür durumu değil, varsayılan durumu yansıtır (IE'nin bazı eski sürümleri hariç, işleri daha da zorlaştırır). Özellik, sayfadaki onay kutusunun işaretli olup olmadığı hakkında hiçbir şey söylemez. Bkz. Http://jsfiddle.net/VktA6/49/ .

2
@TJCrowder, hangileri?
Naftali aka Neal

9
@Neal: DOM öğelerinin hangi özelliklere sahip olduğunu ve niteliklerin değerlerini nasıl tohumlayabileceğini bilmek istiyorsanız, şu bağlantıları el altında tutun: DOM2 HTML belirtimi , DOM2 belirtimi ve DOM3 belirtimi. Her durumda endeksler mükemmel ve sizi doğrudan mülkün tam bir açıklamasına bağlar, değerinin nereden geldiğini vb.
TJ Crowder

4
@Neal: Farklı kılan şey: Bilginin kaynağı ve doğası. valueÖrneğin Tim'in örneğine bakın. "Değer" özelliğinden ziyade özelliğiattr alan bir işlev çok anlamlı değildir (ve farklı olabilirler). Bazıları için geçiş acı verici olsa da, ileriye gitmek, nitelikler yapmak ve özellikler yapmak daha net olacaktır. Bunu yanlış anlamayın, geri adım atmak ve özelliklerin ne olduğu hakkında bir fikir edinmek için özellikleri okumak gibi bir şey yoktur. valueattrprop
TJ Crowder

54
@Neal: DOM öğesi bir nesnedir. Özellikler, diğer nesneler gibi o nesnenin özellikleridir. Bu desteklerden bazıları, başlangıç ​​değerlerini biçimlendirmedeki özelliklerden alır ve bunlar da DOM nesnesinde ayrı bir özellik haritasında saklanır . Çoğu durumda, bir pervaneye yazmak pervaneyi değiştirir, ancak ne yazık ki alttaki attrede ( valueörneğin) herhangi bir değişiklik yazan bazı sahne var , ancak bunu çoğunlukla görmezden gelmeye çalışalım. Zamanın% 99'u sahne ile çalışmak istiyorsunuz. Gerçek bir nitelik ile çalışmanız gerekiyorsa, muhtemelen bunu bileceksiniz.
TJ Crowder

4
@Tim: " valueBir girişin özelliğini değiştirmek, valuemodern tarayıcılardaki niteliğini değiştirmez " Bunu düşünmedim, bu yüzden onu örnek olarak kullanmaya başladım, ancak örneği kodlamaya başladığımda, karartıldım Chrome, Firefox, Opera, IE'de güncellenmediyse ... - jsbin.com/ahire4 Bunun nedeni input[type="button"], denemem için bir kullanıyorum . O değil bir on niteliği güncelleştirmek input[type="text"]- jsbin.com/ahire4/2 kıvrık hakkında konuşun !! Sadece element değil, tipi de ...
TJ Crowder

664

Tim'in çok iyi söylediğini düşünüyorum , ama geri dönelim:

DOM öğesi bir nesnedir, bellekteki bir şeydir. OOP'taki çoğu nesne gibi, özellikleri de vardır . Ayrıca, öğe üzerinde tanımlanan özniteliklerin bir haritasına sahiptir (genellikle tarayıcının öğeyi oluşturmak için okuduğu işaretlemeden gelir). Elementin bazı özellikleri onların olsun başlangıçtaki değerleri nitelikler aynı veya benzer isimlerle (ile value; "değer" özelliğindeki başlangıç değerini alır href"href" özelliğindeki başlangıç değerini alır, ama tam olarak aynı değeri değil; classNamedan "sınıf" özniteliği). Diğer özellikler başlangıç ​​değerlerini başka şekillerde alır: Örneğin, parentNodeözellik üst öğesinin ne olduğuna bağlı olarak değerini alır;style "stil" özniteliğine sahip olsun ya da olmasın.

Bu çapayı şu adreste bir sayfada ele alalım http://example.com/testing.html:

<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>

Bazı gereksiz ASCII sanatı (ve birçok şeyi dışarıda bırakarak):

+ ------------------------------------------- +
| HTMLAnchorElement |
+ ------------------------------------------- +
| href: "http://example.com/foo.html" |
| adı: "fooAnchor" |
| id: "fooAnchor" |
| className: "bir test" |
| nitelikler: |
| href: "foo.html" |
| adı: "fooAnchor" |
| id: "fooAnchor" |
| sınıfı: "bir test" |
+ ------------------------------------------- +

Özelliklerin ve niteliklerin farklı olduğunu unutmayın.

Şimdi, her ne kadar farklı olsalar da, tüm bunlar sıfırdan tasarlanmış olmaktan ziyade geliştiğinden, bir dizi özellik, onları ayarlarsanız, türetdikleri özelliğe geri yazar. Ancak hepsi yapmaz ve hrefyukarıdan da görebileceğiniz gibi, haritalama her zaman düz bir "değeri aktar" değildir, bazen yorumlama söz konusudur.

Bir nesnenin özellikleri olan özelliklerden bahsettiğimde, soyutta konuşmuyorum. Bazı jQuery kodu yok:

var link = document.getElementById('fooAnchor');
alert(link.href);                 // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"

(Bu değerler çoğu tarayıcı için geçerlidir; bazı varyasyonlar vardır.)

linkNesne gerçek bir şey olduğunu ve bir erişmek arasındaki gerçek ayrım olduğu görülüyor özelliği üzerinde ve bir erişen niteliğini .

Tim'in dediği gibi, zamanın büyük çoğunluğu , mülklerle çalışmak istiyoruz. Kısmen bunun nedeni, değerlerinin (adlarının bile) tarayıcılarda daha tutarlı olma eğiliminde olmasıdır. Çoğunlukla yalnızca kendisiyle ilgili bir özellik olmadığında (özel özellikler) veya bu özel özellik için özelliğin ve özelliğin 1: 1 ( hrefyukarıdaki ve "href" ile olduğu) olmadığını bildiğimizde özniteliklerle çalışmak isteriz. .

Standart özellikler çeşitli DOM özelliklerinde belirtilmiştir:

Bu özellikleri mükemmel dizinler var ve ben onlara linkler kullanışlı tutmak öneririz; Onları her zaman kullanıyorum.

Özel öznitelikler, örneğin, data-xyzkodunuza meta veri sağlamak için öğelere koyabileceğiniz tüm öznitelikleri içerir (artık data-ön eke bağlı kaldığınız sürece HTML5'ten itibaren geçerlidir ). (JQuery'nin son sürümleri data-xyz, dataişlev aracılığıyla öğelere erişmenizi sağlar , ancak bu işlev yalnızca nitelikler için bir erişimci değildirdata-xyz [hem daha fazla hem de daha az yapar]; aslında özelliklerine ihtiyacınız olmadıkça, attretkileşim için işlevi kullanırdım ile data-xyzöznitelik.)

attrFonksiyon onlar tam anlamıyla özelliği alınırken yerine, istediğini ne düşündüğünü alma çevresindeki bazı dolambaçlı mantığı için kullanılır. Kavramları birleştirdi. Onlara taşınmak propve attronları sınırlandırmak anlamına geliyordu. GO v1.6.0 jQuery Kısaca çok ileri bu konuda gitti, ama işlevselliği hızla geri eklendi için attrinsanlar kullanmaya ortak durumları işlemek için attrteknik olarak kullandıkları gerekirken prop.


Vay. 1.6.1 güncellemesi gerçekten bu soruyu biraz etkisiz hale getiriyor (ama çok fazla değil) ama bu bağlantı temel olarak şimdi cevaplıyor
Naftali aka Neal

Benim için geçersiz kılmadı, sadece .attr ('class', 'bla') ayarladığım jquery1.7 kullanarak bir hatayı düzelttim ve .prop ('className', 'bla' ) çalıştı
PandaWood

@PandaWood: Chrome 17, Firefox 11, Opera 11, IE6, IE8, IE9 ve Safari 5'de 1.7.0 , 1.7.1 ve 1.7.2'de.attr('class', 'bla') beklediğim gibi çalışıyor .
TJ Crowder

Teşekkürler, benim durumumda belirli bir şey olmalı, bunu kontrol edeyim ve bir test vakasıyla geri geleyim. Ancak kodu şu anda sahip olduğumuz gibi değiştirmek, "attr" yerine "prop / className" yerine, tüm tarayıcılarda
jquery1.4'ten

3
@TJCrowder re: .data- varsa özniteliğin varsayılan değerini okuyacaktır , ancak buna yazarsanız , öğenin gizli özelliğini değiştirir ve özniteliği güncellemez.
Alnitak

250

Bu değişiklik jQuery için uzun zamandır geliyor. Yıllardır, attr()adından beklediğiniz sonucu değil, çoğunlukla DOM mülklerini alan bir işleve sahip içeriklerdi . Ayrılığı attr()ve prop()HTML özelliği ve DOM özelliklerini arasındaki karışıklığı hafifletmek yardımcı olmalıdır. $.fn.prop()belirtilen DOM özelliğini, $.fn.attr()belirtilen HTML özelliğini alır.

Nasıl çalıştıklarını tam olarak anlamak için, HTML özellikleri ve DOM özellikleri arasındaki fark hakkında genişletilmiş bir açıklama:

HTML Özellikleri

Sözdizimi:

<body onload="foo()">

Amaç: İşaretlemenin etkinlikler, oluşturma ve diğer amaçlar için kendisiyle ilişkili verilere sahip olmasını sağlar.

Görselleştirme: HTML Özellikleri Sınıf özelliği, burada gövde üzerinde gösterilir. Aşağıdaki kodla erişilebilir:

var attr;
attr = document.body.getAttribute("class");
//IE 8 Quirks and below
attr = document.body.getAttribute("className");

Öznitelikler dize biçiminde döndürülür ve tarayıcıdan tarayıcıya tutarsız olabilir. Bununla birlikte, bazı durumlarda hayati olabilirler. Yukarıda örneklendiği gibi IE 8 Quirks Mode (ve aşağısı), özellik adı yerine get / set / removeAttribute öğesinde bir DOM özelliğinin adını bekler. Bu farkı bilmenin önemli olmasının birçok nedeninden biridir.

DOM Özellikleri

Sözdizimi:

document.body.onload = foo;

Amaç: Eleman düğümlerine ait özelliklere erişim sağlar. Bu özelliklere özniteliklere benzer, ancak yalnızca JavaScript aracılığıyla erişilebilir. Bu, DOM mülklerinin rolünü netleştirmeye yardımcı olan önemli bir farktır. Bu olay işleyici ataması işe yaramaz olduğundan ve olayı almayacağından, özniteliklerin özelliklerden tamamen farklı olduğunu unutmayın (gövdenin bir onload olayı yoktur, yalnızca bir onload özniteliği vardır).

Görselleştirme: DOM Özellikleri

Burada, Firebug'daki "DOM" sekmesi altındaki özelliklerin bir listesini göreceksiniz. Bunlar DOM mülkleridir. Daha önce bilmeden kullanacağınız için, bunlardan birkaçını hemen fark edeceksiniz. Onların değerleri JavaScript üzerinden alacağınız değerlerdir.

belgeleme

Misal

HTML: <textarea id="test" value="foo"></textarea>

JavaScript: alert($('#test').attr('value'));

JQuery'nin önceki sürümlerinde, bu boş bir dize döndürür. 1.6'da uygun değeri döndürür foo.

Her iki işlev için yeni koda bakmadan, karışıklığın kodun kendisinden çok HTML öznitelikleri ve DOM özellikleri arasındaki farkla daha fazla ilgisi olduğunu güvenle söyleyebilirim. Umarım, bu sizin için bazı şeyleri temizledi.

-Mat


7
$.prop()DOM özelliklerini, $.attr()HTML özelliklerini alır. İkisi arasındaki farkı anlayabilmeniz için boşluğu psikolojik olarak kapatmaya çalışıyorum.

10
Evlat, şimdi de kafam karıştı. Öyleyse $('#test').prop('value')hiçbir şey iade etmiyor mu? .attr('checked')Onay kutusu için de geçerli değildir ? Ama eskiden mi? Şimdi bunu değiştirmek zorunda kalır prop('checked')mısın? Bu ayrımın gereğini anlamıyorum - HTML özellikleri ile DOM özellikleri arasında ayrım yapmak neden önemlidir? Bu değişikliği "uzun süre" yapan ortak kullanım durumu nedir? İkisi arasındaki ayrımı soyutlamakta yanlış olan şey , çünkü kullanım durumları çoğunlukla örtüşüyor gibi görünüyor mu?
BlueRaja - Danny Pflughoeft

5
@MaviRaja: jQuery gibi halının altına fırçalarsanız, beklenmedik arızalara neden olan iki kavram arasında ciddi bir temel fark var. özellik, bir alanın geçerli değerini vereceğinden, ancak özellik size, özellik olarak belirtilen öznitelikte bildirilen orijinal değeri verecek valueolan en belirgin durumlardan biridir . (Bu özel durum IE <9 hataları ile tekrar karıştırılsa da)valuevaluevalue="..."defaultValue
bobince

4
@BlueRaja: Bunun cevabı daha da karmaşık. :-) attr('value', ...)jQuery <1.6'da ayar özelliği ayarlar, böylece geçerli değer değişir ve varsayılan değer değişmez. 1.6'da özniteliği ayarlar, bu nedenle teoride varsayılan değer değişir ve geçerli değer değişmez. Ancak, valueözelliğin tam olarak ne ayarlandığına ilişkin (daha fazla) tarayıcı tutarsızlığı vardır . IE'de geçerli değeri de ayarlar; bazı tarayıcılarda yalnızca geçerli değer önceden ayarlanmamışsa geçerli değeri ayarlar. [ağlıyor]
bobince

1
@Quentin'in dediği gibi, "Nitelikler HTML ile tanımlanır. Özellikler DOM tarafından tanımlanır." Okuduğum en basit sürüm.
Alan Dong

241

DOM'da bir özellik var; HTML'de, DOM'a ayrıştırılan bir özellik bulunur.

Daha fazla ayrıntı

Bir özelliği değiştirirseniz, değişiklik DOM'a (bazen farklı bir adla) yansıtılır.

Örnek: classBir etiketin niteliğini değiştirmek, DOM'daki etiketin classNameözelliğini değiştirir . Bir etikette hiçbir özelliğiniz yoksa, yine de boş veya varsayılan bir değere sahip karşılık gelen DOM özelliğiniz vardır.

Örnek: Etiketinizde hiçbir classözellik classNamebulunmamakla birlikte , DOM özelliği boş bir dize değerine sahip.

Düzenle

Birini değiştirirseniz, diğeri bir denetleyici tarafından değiştirilir veya tersi de geçerlidir. Bu denetleyici jQuery'de değil, tarayıcının yerel kodundadır.


Bu, özniteliği güncellemenin daha iyi olduğu anlamına mı geliyor, çünkü o zaman özniteliğin ve özelliğin hem güncellenmesini hem de uyumlu olmasını sağlıyor musunuz?
Luke

1
@ DOM DOM iç teknik temsil, model. HTML nitelikleri bir dış gösterim, bir görünümdür. Birini değiştirirseniz, diğeri bir denetleyici tarafından değiştirilir veya tersi de geçerlidir.
yunzen

@HerrSerker Yani ikisi de bir kontrolör aracılığıyla senkronize mi tutuldu? Bu sadece jQuery's attr ve prop yöntemleri içinde olduğunu varsayalım? İşte bunu daha fazla keşfettiğim kemanınızda bir değişiklik var - jsfiddle.net/v8wRy - ve şimdiye kadar eşdeğer görünüyorlar.
Luke

3
"Birini değiştirirseniz, diğeri bir denetleyici tarafından değiştirilir veya tersi de geçerlidir. Bu denetleyici jQuery'de değil, tarayıcıların yerel kodundadır." Bu değil çoğu nitelikler / özellikler için de geçerlidir. Çoğunluk için, bir özniteliğin karşılık gelen özelliğin başlangıç değerini belirlediği tek yönlü bir çeviri . İlk iki cevap bunu ayrıntılı olarak açıklamaktadır.
ᴠɪɴᴄᴇɴᴛ

@Vincent. İlk iki cevabın cevabımın aksine bir şey söylediğini görmüyorum. Elbette çoğu öznitelik, karşılık gelen DOM özelliklerinin başlangıç ​​değerleridir. Fakat karşılıklı olarak birbirlerine bağımlılar. jQuery('p').prop('className', 'foo');Chrome konsolunda olduğu gibi bir şey deneyin ve her paragrafın nasıl bir classözellik kazandığını göreceksiniz 'foo'. Tabii ki sunucudan gelen kaynak kodunda değil. Bu bir sabit.
yunzen

140

Bu sadece HTML nitelikleri ve karmaşaya neden olan DOM nesneleri arasındaki ayrımdır. DOM elemanları üzerinde rahat hareket edenler için böyle bir özellik this.src this.value this.checked, vb .prop., Aile için çok sıcak bir karşılama. Diğerleri için, sadece ek bir karışıklık katmanı. Bunu temizleyelim.

En kolay yolu arasındaki farkı görmek .attrve .propaşağıdaki örnektir:

<input blah="hello">
  1. $('input').attr('blah'): 'hello'beklendiği gibi döner . Burada sürpriz yok.
  2. $('input').prop('blah'): döndürür undefined- çünkü yapmaya çalışıyor [HTMLInputElement].blah- ve bu DOM nesnesinde böyle bir özellik yok. Bu kapsamda yalnızca o öğenin bir özelliği olarak bulunur;[HTMLInputElement].getAttribute('blah')

Şimdi bunun gibi birkaç şeyi değiştiriyoruz:

$('input').attr('blah', 'apple');
$('input').prop('blah', 'pear');
  1. $('input').attr('blah'): döndürür 'apple'ha? Neden "armut" olmasın, çünkü bu element üzerinde son olarak ayarlandı. Özellik, DOM giriş öğesinin kendisi değil, giriş özelliğinde değiştirildiğinden, temel olarak neredeyse birbirinden bağımsız çalışırlar.
  2. $('input').prop('blah'): İadeler 'pear'

Gerçekten dikkatli olmanız gereken şey , yukarıdaki nedenlerden ötürü uygulamanız boyunca aynı mülk için bunların kullanımını karıştırmamaktır .

Farkı gösteren bir kemanı görün: http://jsfiddle.net/garreh/uLQXc/


.attrvs .prop:

1. Tur: Stil

<input style="font:arial;"/>
  • .attr('style') - eşleşen öğe için satır içi stiller döndürür yani "font:arial;"
  • .prop('style') - bir stil bildirim nesnesi döndürür yani CSSStyleDeclaration

2. Tur: değer

<input value="hello" type="text"/>   

$('input').prop('value', 'i changed the value');
  • .attr('value')- döndürür 'hello'*
  • .prop('value') -- İadeler 'i changed the value'

* Not: jQuery bu nedenle .val()dahili olarak eşdeğer bir yönteme sahiptir ..prop('value')


@Noel jquery fonksiyonlarının yapısına daha iyi atıfta bulunur. "$ ('input'). prop ('blah'): undefined döndürür - çünkü [HTMLInputElement] .blah yapmaya çalışır - ve bu DOM nesnesinde böyle bir özellik yoktur. [HTMLInputElement] .getAttribute ('blah') "
Uğur Gümüşhan

2
Doc'den farklı görünüyor, api.jquery.com/prop : ".attr () yöntemi yerine devre dışı bırakılmış ve işaretlenmiş olarak .prop () yöntemi kullanılmalı ve .val () yöntemi ayar değeri."
kuğu

53

TL; DR

Kullanım prop()üzerinde attr()vakaların çoğunda.

Bir özelliği giriş elemanı mevcut durumudur. Bir özellik varsayılan değerdir.

Bir mülk farklı türden şeyler içerebilir. Bir özellik yalnızca dizeler içerebilir


1
Mümkünse ne söylediğinizin birkaç kolay örneğiyle gelmek ve ne zaman kullanılacağını göstermek prop() and when to go for attr(). cevap bekliyorum :)
Mou

36

Kirli kontrol

Bu kavram, farkın gözlemlenebilir olduğu bir örnek sağlar: http://www.w3.org/TR/html5/forms.html#concept-input-checked-dirty

Denemek:

  • düğmeye bas. Her iki onay kutusu da işaretlendi.
  • her iki onay kutusunun işaretini kaldırın.
  • düğmesine tekrar tıklayın. Yalnızca proponay kutusu işaretlendi. BANG!

$('button').on('click', function() {
  $('#attr').attr('checked', 'checked')
  $('#prop').prop('checked', true)
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>attr <input id="attr" type="checkbox"></label>
<label>prop <input id="prop" type="checkbox"></label>
<button type="button">Set checked attr and prop.</button>

Bazı özellikler gibi For disabledüzerinde buttonekleme veya content özelliğini kaldırarak, disabled="disabled"çünkü her zaman (HTML5 içinde IDL özellik olarak adlandırılır) özelliği geçiş yapılır http://www.w3.org/TR/html5/forms.html#attr-fe-disabled diyor ki:

Devre dışı bırakılan IDL özelliği, devre dışı bırakılmış içerik özelliğini yansıtmalıdır.

HTML'yi ihtiyaç duymadan değiştirdiği için çirkin olmasına rağmen ondan kaçabilirsiniz.

checked="checked"Tarihinde olduğu gibi diğer özellikler için input type="checkbox"işler bozulur, çünkü bir kez tıkladığınızda kirlenir ve daha sonra checked="checked"içerik niteliğini eklemek veya kaldırmak artık kontrolü değiştirmez .

Bu nedenle .prop, HTML'yi değiştirmenin karmaşık yan etkilerine güvenmek yerine, etkili özelliği doğrudan etkilediği için çoğunlukla kullanmalısınız .


Tamlık için şu varyasyonları da deneyin: 1) Düğmeyi tıklamadan önce kontrol edin ve ardından ilk onay kutusunun işaretini kaldırın 2) (Bunun için snippet'i değiştirmeniz gerekir) İlk girişe bir checkedözellik verin:checked="checked"
ᴠɪɴᴄᴇɴᴛ

33

Her şey dokümanda :

Nitelikler ve özellikler arasındaki fark, belirli durumlarda önemli olabilir. JQuery 1.6'dan önce .attr () yöntemi, bazı öznitelikleri alırken bazen özellik değerlerini dikkate alarak tutarsız davranışlara neden olabilir. JQuery 1.6 itibariyle .prop () yöntemi, özellik değerlerini açıkça almak için bir yol sağlarken, .attr () öznitelikleri alır.

Yani prop kullanın!


2
Yani bu 1.6'ya geçtiğimde, bir sürü şey kırılacak mı demek?
Naftali aka Neal

Hayır, bu sadece tutarsız bir davranış, daha önce çalışırsa, her zaman jQuery 1.6 ile çalışır, sadece prop daha güvenlidir;)
Arnaud F.

6
Hatırlıyorum. $.attr()özellikleri alıyorum çoğu zaman onunla çalıştım, "bazen" değil. Bunun neden olduğu karışıklık bugün hala yankılanıyor. Ne yazık ki, DOM özellikleri vs HTML öznitelikleri üzerinde kesin bir okuma bulmakta çok sorun yaşıyorum , bu yüzden burada biraz cevap yazabilirsiniz.

3
@ Arnaud-f Doğru değil. Onay kutularını işaretlemek için attr ('işaretli') kullanan 1.6'dan önceki tüm kodlar artık bozuk olacaktır.
CaptSaltyJack

3
@Matt McDonald: Ne tür bir "... HTML özelliklerine karşı DOM özelliklerine ilişkin kesin bir okuma bulmakta sorun ..." demek istediniz? Özellikler (yansıtılan ve başka şekilde) DOM2 HTML spesifikasyonunda açıklanmıştır ; DOM2 ve DOM3 spesifikasyonlarına da başvurmanız gerekebilir .
TJ Crowder

28

özellikleri HTML metin belgenizde / dosyanızda (== bunun html işaretlemenizin ayrıştırılmış bir sonucu olduğunu düşünün),
özellikler HTML DOM ağacında (== temelde JS anlamında bazı nesnelerin gerçek bir özelliği).

Önemli olarak, birçoğu senkronize edilir ( classözelliği güncellerseniz , classhtml'deki özellik de güncellenir; aksi takdirde). Ancak bazı özellikler beklenmedik özelliklerle senkronize edilebilir - örneğin, özellik checked için karşılık gelir mülkiyet defaultChecked böylece,

  • bir onay kutusunu manuel olarak işaretlemek .prop('checked')değeri değiştirir , ancak değişmez .attr('checked')ve .prop('defaultChecked')değerleri değiştirmez
  • ayar $('#input').prop('defaultChecked', true) da değişir .attr('checked'), ancak bu bir öğede görünmez.

Temel kural :.prop() boolean öznitelikleri / özellikleri ve html'de bulunmayan özellikler (window.location gibi) için yöntem kullanılmalıdır. Diğer tüm öznitelikler (html'de görebileceğiniz özellikler), .attr() yöntemle değiştirilmeye devam edilebilir ve değiştirilmeye devam etmelidir . ( http://blog.jquery.com/2011/05/10/jquery-1-6-1-rc-1-released/ )

Ve burada nerede .prop()tercih edildiğini gösteren bir tablo ( .attr()hala kullanılabilir olsa da).

tercih edilen kullanımlı masa


Neden ikincisinin resmi olarak önerildiği .attr () yerine neden .prop () kullanmak istersiniz?

  1. .prop()herhangi bir türü döndürebilir - dize, tamsayı, boolean; süre.attr() her zaman bir dize döndürür.
  2. .prop()den yaklaşık 2.5 kat daha hızlı olduğu söyleniyor .attr().

bir şey bu gibi değiştirildi: $('#myImageId').prop('src', 'http://example.com/img.png'), var class = $('.myDivClass').prop('class')veya $('#myTextBox').prop('type', 'button'). Ve benzeri ...

@ Mr.Wolf, üzgünüm, ne demek istediğini anlamıyorum. Ne değişti'? sözdizimi hep böyle olmuştur.
lakesare

Cevabınızdaki masanın gereksiz olduğunu düşünüyorum. Çünkü .prop()tüm özelliklerle iyi çalışıyor. .prop()Sütundaki tüm özellikleri işaretlemek istemezsiniz , değil mi?

@ Mr.Wolf, bence gerekli, çünkü daha önce de belirtildiği gibi, 'nerede .prop()tercih edildiğini gösterir ( .attr()hala kullanılabilir olsa da)'
lakesare

Genellikle .attr()bir olayı tanımlamak için .prop()kullanamam. Bunun gibi: $('.myDiv').attr('onclick', 'alert("Hello world!")'). Eğer değiştirirseniz .attr()için .prop(), bu iş olmaz. Tamamen, .attr()ayarlamak veya değerini almak için kullanmak için bir neden olmadığını düşünüyorum id/class/href/checked/src...... Yanlış olduğunu söylemediğime dikkat et.

20

.attr():

  • Bir özelliğin değerini almaEşleşen öğeler kümesindeki ilk öğe için .
  • Öğenin değerini, sayfa yüklemedeki html'de tanımlandığı şekilde verir

.prop():

  • Bir mülkün değerini almaEşleşen öğeler kümesindeki ilk öğe için .
  • Javascript / jquery ile değiştirilen öğelerin güncellenmiş değerlerini verir

13

Genellikle özellikleri kullanmak istersiniz. Nitelikleri yalnızca şunlar için kullanın:

  1. Özel bir HTML özelliği alma (bir DOM özelliğiyle senkronize edilmediğinden).
  2. DOM özelliğiyle senkronize edilmeyen bir HTML özelliği alma, örneğin standart bir HTML özelliğinin "orijinal değerini" alma, örneğin <input value="abc">.

7

attributes -> HTML

properties -> DOM


8
Ne söylemek istediğini biliyorum, ama HTML bir biçimlendirme dilidir ve DOM HTML'den oluşturulan bir temsildir. Bir DOMElement hem sahiptir özelliklerini ve özelliklerini .
t.niese

@ t.niese, attirbutesayrıca bir özelliğiDOM
NkS

Kısa cevap basit.
Nabi KAZ

6

JQuery 1.6'dan önce, attr()yöntem bazen öznitelikleri alırken özellik değerlerini hesaba katmıştır, bu durum oldukça tutarsız davranışlara neden olmuştur.

prop()Yöntemin tanıtılması, .attr()öznitelikleri alırken özellik değerlerini açıkça almak için bir yol sağlar .

Dokümanlar:

jQuery.attr() Eşleşen öğeler kümesindeki ilk öğe için bir özniteliğin değerini alın.

jQuery.prop() Eşleşen öğeler kümesindeki ilk öğe için bir özelliğin değerini alın.


3

Kullanımla ilgili nazik bir hatırlatma prop(), örnek:

if ($("#checkbox1").prop('checked')) {
    isDelete = 1;
} else {
    isDelete = 0;
}

Yukarıdaki işlev, onay kutusunun1 işaretli olup olmadığını kontrol etmek için kullanılır, işaretliyse: dönüş 1; değilse: döndür 0. Burada bir GET işlevi olarak kullanılan işlev prop ().

if ($("#checkbox1").prop('checked', true)) {
    isDelete = 1;
} else {
    isDelete = 0;
}

Yukarıdaki fonksiyon, kontrol edilecek onay kutusunu1 ve HER ZAMAN 1'i ayarlamak için kullanılır. Şimdi bir fonksiyon olarak prop () fonksiyonu kullanılır.

Berbat etme.

P / S: Image src özelliğini kontrol ederken . Eğer src boştur, prop sayfasında (yanlış) mevcut URL ve dönüş özn dönüş boş bir dize (sağda).


Bu örnekte yanılıyorsun: <img src="smiley.gif" alt="Smiley face" width="42" height="42" onclick="alert($(this).prop('src'))">. Çalışmalı ve görüntü konumunu döndürmelidir.

2

Bunu .attr()yapamayacak bir şey var .prop(): CSS seçicilerini etkilemek

İşte diğer cevaplarda görmediğim bir konu.

CSS seçici [name=value]

  • cevap verecek .attr('name', 'value')
  • ama her zaman değil .prop('name', 'value')

.prop() yalnızca birkaç özellik seçiciyi etkiler

.attr() tüm özellik seçicileri etkiler


0

1) DOM'da bir mülk; HTML'de, DOM'a ayrıştırılan bir özellik bulunur.

2) $ (elem) .attr ("işaretli") (1.6.1+) "işaretli" (Dize) Onay kutusu durumuyla değişecek

3) $ (elem) .attr ("işaretlendi") (1.6 öncesi) true (Boolean) Onay kutusu durumuyla değiştirildi

  • Çoğunlukla, gibi özel özellik yerine DOM nesnesi için kullanmak istiyoruz data-img, data-xyz.

  • Ayrıca farkın bazı erişirken checkboxve değer href ile attr()ve prop()DOM çıkışı ile şey değişikliği gibi prop()tam gelen bağlantı olarak originve Booleanonay kutusunu değeri (pre-1.6)

  • DOM öğelerine yalnızca propdiğer öğelerle erişebiliriz.undefined


0

Prop () vs attr () 'da dikkat edilmesi gereken birkaç nokta vardır:

  • selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked ve defaultSelected..etc .prop () yöntemiyle alınmalı ve ayarlanmalıdır. Bunlar karşılık gelen özelliklere sahip değildir ve sadece özelliklerdir.

  • Giriş türü onay kutusu için

       .attr('checked') //returns  checked
       .prop('checked') //returns  true
       .is(':checked') //returns true
  • prop yöntemi işaretli, seçili, devre dışı, readOnly..etc için Boole değerini döndürürken, attr tanımlı dize döndürür. Böylece, eğer durumunda doğrudan .prop ('işaretli') kullanabilirsiniz.

  • .attr (), .prop () öğesini dahili olarak çağırır, bu nedenle .attr () yöntemi, doğrudan .prop () üzerinden erişmekten biraz daha yavaş olacaktır.


-2

Gary Hole cevabı, kod bu şekilde yazılırsa sorunu çözmek için çok önemlidir.

obj.prop("style","border:1px red solid;")

Prop işlevi return CSSStyleDeclarationnesnesi olduğundan, yukarıdaki kod bazı tarayıcılarda düzgün çalışmaz (IE8 with Chrome Frame Plugin benim durumumda .

Böylece aşağıdaki koda dönüştürmek

obj.prop("style").cssText = "border:1px red solid;"

sorunu çözdü.

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.