İçinde tire bulunan bir javascript nesnesi özelliğine nasıl başvurabilirim?


106

Devralınan tüm vb. Stillerin bir stil nesnesi oluşturmak için bu komut dosyasını kullanma .

var style = css($(this));
alert (style.width);
alert (style.text-align);

aşağıdakilerle, ilk uyarı iyi çalışır, ancak ikincisi çalışmaz .. bunu -eksi olarak yorumluyor sanırım .. hata ayıklayıcı 'yakalanmamış referans hatası' diyor. Yine de tırnak işareti koyamam çünkü bu bir dizge değil. Peki bu nesne özelliğini nasıl kullanırım?


Damon, belirsizliği ve karışıklığı ele alır (farklı cevaplar ve yoruma bağlı olarak eklenen / kaldırılan olumsuz oylar da yansıtılır ...): Örneğinizde ima edildiği ve çoğu cevapta varsayıldığı şekliyle CSS özelliklerini veya herhangi bir JS özelliğini özellikle mi kastettiniz? , genel olarak, başlıkta ve bir CSSetiketin olmamasında belirtildiği gibi ? [Evet, 7 yıl olduğunu biliyorum. :)]
Sz.

@Sz. Demek istediğim any js property, içinde tire bulunan bir mülke başvuruda bulunmakla ilgili bir sorun yaşıyordum (ki bu da bir css özelliğiydi ... yapmaya çalıştığım şeyle ilgili başka bir sorun olduğunu fark etmemiştim). Yani 2 farklı konuyu ele alan garip bir konu. ama en iyi cevabın her iki sorunu da açıkladığını söyleyebilirim.
Damon

Yanıtlar:


155

DÜZENLE

Yorumlara bakın, css özellikleri için anahtar gösteriminin bir dizi özellikle uyumlu olmadığını göreceksiniz. Bu nedenle, deve durumu anahtar gösterimini kullanmak şu anki yoldur

obj.style-attr // would become 

obj["styleAttr"]

Nokta yerine anahtar gösterimi kullanın

style["text-align"]

Js'deki tüm diziler nesnelerdir ve tüm nesneler yalnızca ilişkilendirilebilir dizilerdir, bu, bir dizideki bir anahtara başvurduğunuz gibi bir nesnedeki bir yere başvurabileceğiniz anlamına gelir.

arr[0]

veya nesne

obj["method"] == obj.method

bu şekilde mülklere erişirken hatırlanması gereken birkaç şey

  1. bunlar değerlendirilir, bu nedenle bir sayaçla bir şey yapmadığınız veya dinamik yöntem adları kullanmadığınız sürece dizeleri kullanın.

    bu, obj [yöntem] 'in tanımsız bir hata vereceği, obj ["yöntem"] ise vermeyeceği anlamına gelir.

  2. Js değişkenlerinde izin verilmeyen karakterler kullanıyorsanız, bu gösterimi kullanmalısınız.

Bu normal ifade bunu özetliyor

[a-zA-Z_$][0-9a-zA-Z_$]*

1
anahtar gösterimi burada geçerli değildir - css, anahtarlarda deve harf durumunu kullanarak stilleri tanımlar: jsfiddle.net/49vkD
Brian

hangi tarayıcı? Kısa çizgi IE7, IE8, FFX 3.5'e girdiğinde benim için başarısız. Ve başarısızlık derken, her ikisi için de "tanımsız" ifadesini kastediyorum ...
Brian

@brian, safari ve kromda test edildi kırmızı, kırmızı, merkez, merkez. Şimdi ff'de deneyeceğim
austinbv

@brian ilginç, firefox6'da işe yaramadı, bilmiyordum ... her gün yeni bir şeyler öğren
austinbv

1
Başka bir yanıtlayıcı, CSS koleksiyonunun hte sorununun konusu olduğunu belirttiği için olumsuz oyum kaldırıldı, ancak asıl soru tirelenmiş özelliğin nasıl elde edileceğiydi.
Brian

18

A ile CSS özellikleri -, Javascript nesnelerinde camelCase'de temsil edilir. Olurdu:

alert( style.textAlign );

Dizeyi kullanmak için köşeli parantez gösterimi de kullanabilirsiniz:

alert( style['text-align'] );

Mülk adları yalnızca karakterler, sayılar, iyi bilinen $işaret ve _(pimvdb sayesinde) içerebilir.


ikincisi işe yarıyor .. az önce kaçırdığım sözdizimi şeylerinden biri. Referans verdiğim komut dosyası normal css stil adlarını kullanıyor, ancak yine de bilinmesi yararlı!
Damon

yine de mülk adları sayılarla başlayamaz
austinbv

Özellik adları, çok sayıda Unicode karakter içerebilir. Spesifikasyonda sorun yok ve tarayıcılarda sorun yok. Örneğin:var ò_ó = 'angry';
Camilo Martin

İkinci kodu kullanmayın. CSS özellikleri deve kasalıdır. Kodunuz bazı tarayıcılarda çalışabilir ancak standart değildir.
Oriol

17

Orijinal sorunun cevabı şudur: özellik adını tırnak içine alın ve dizi stili indekslemeyi kullanın:

obj['property-with-hyphens'];

Bazıları, ilgilendiğiniz mülkün bir CSS mülkü olduğuna işaret etti. Kısa çizgiye sahip CSS özellikleri otomatik olarak deve harfli büyüklüğe dönüştürülür. Bu durumda deve kasalı adını şu şekilde kullanabilirsiniz:

style.textAlign;

Ancak bu çözüm yalnızca CSS özellikleri için işe yarar. Örneğin,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2

2
@Brian CSS özellikleri için haklısınız. Ancak, "İçinde tire olan bir javascript nesnesi özelliğine nasıl başvurabilirim?" Genel sorusunu yanıtlıyordum. İşte jsfiddle'ınızın güncellenmiş bir sürümü: jsfiddle.net/49vkD/1
Stoney

1
aslında buradaki cevapların kapsamını kendi başıma daralttım - OP'nin özellikle stil nesneleri kastettiğini varsaydım. Soru bundan biraz daha açık uçlu olduğu için olumsuz oyumu kaldırdım.
Brian

Bence haklısın Muhtemelen Damon'ın istediği buydu. Kelimenin tam anlamıyla okudum.
Stoney

Sen gerekir deve kasalı adı kullanın. değil can .
Oriol

9

Parantez kullanın:

var notTheFlippingStyleObject = {
    'a-b': 1
};

console.log(notTheFlippingStyleObject["a-b"] === 1); // true

Nesneler hakkında daha fazla bilgi: MDN

NOT: Stile erişiyorsanız CSSStyleDeclaration nesnesine javascript'ten erişmek için must camelCase'i kullanın. Daha fazla bilgi burada


1
Beni yatıştırmıyorsun - bu soruya yanıt veren diğer birçok kişiye göre w3c standardını tatmin ediyorsun : w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , ancak aynı şekilde oy veriliyor. ..
Brian

Bu kodu kullanmayın. Deve kasalı CSS özelliklerinin daha çok tarayıcılar arasında olması değil, deve kasası yerine tirelerin kullanılması standart değildir ve çalışmaması gerekir.
Oriol

4
alert(style.textAlign)

veya

alert(style["textAlign"]);

4

Soruyu doğrudan yanıtlamak için: style['text-align']içinde tire bulunan bir özelliğe nasıl başvuracağınızdır. Ancak style.textAlign(veya style['textAlign']) bu durumda kullanılması gereken şeydir.


Bunu kullanmayın. CSS özellikleri deve kasalıdır. Kodunuz bazı tarayıcılarda çalışabilir ancak standart değildir.
Oriol

Deve kılıfı kullanmak için ayarlandı.
Dawson Toth




2

Ben bu yüzden JavaScript CamelCase için değişti CSS stilleri durumunda düşünüyorum test-alignolur textAlign. Standart olmayan karakterler içeren bir özelliğe erişmek istediğiniz genel durumda dizi stilini kullanırsınız. ['text-align']


0

İlk başta, çözümün neden benim açımdan işe yaramadığını merak ediyorum

api['data-sitekey'] //returns undefined

... daha sonra veri özniteliklerine erişimin farklı olduğunu anlayın: Şöyle olmalı:

var api = document.getElementById("some-api");
api.dataset.sitekey

Bu yardımcı olur umarım!

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.