"Sınıf" ve "kimlik" HTML özelliklerini adlandırma - kısa çizgiler ve altı çizgiler [kapalı]


114

<div id="example-value">veya <div id="example_value">?

Bu site ve Twitter birinci stili kullanıyor. Facebook ve Vimeo - ikincisi.

Hangisini kullanıyorsunuz ve neden?


11
Bu iki bağlantı da artık koptu
Steve

Yanıtlar:


136

HTML ve JavaScript'iniz arasında izolasyon sağlamak için Kısa Çizgi kullanın.

Neden? aşağıya bakınız.

Tireler CSS ve HTML'de kullanmak için geçerlidir ancak JavaScript Nesneleri için geçerli değildir.

Pek çok tarayıcı HTML kimliklerini pencere / belge nesnesine global nesneler olarak kaydeder, büyük projelerde bu gerçek bir acıya dönüşebilir.

Bu nedenle, kısa çizgilerle adları kullanıyorum, bu şekilde HTML kimlikleri JavaScript'imle asla çakışmaz.

Aşağıdakileri göz önünde bulundur:

message.js

message = function(containerObject){
    this.htmlObject = containerObject;
};
message.prototype.write = function(text){
    this.htmlObject.innerHTML+=text;
};

html

<body>
    <span id='message'></span>
</body>
<script>
    var objectContainer = {};
    if(typeof message == 'undefined'){
        var asyncScript = document.createElement('script');
        asyncScript.onload = function(){
            objectContainer.messageClass = new message(document.getElementById('message'));
            objectContainer.messageClass.write('loaded');
        }
        asyncScript.src = 'message.js';
        document.appendChild(asyncScript);
    }else{
        objectContainer.messageClass = new message(document.getElementById('message'));
        objectContainer.messageClass.write('loaded');
    }
</script>

Tarayıcı HTML kimliklerini global nesneler olarak kaydederse, mesaj 'tanımsız' olmadığından yukarıdaki işlem başarısız olur ve HTML nesnesinin bir örneğini oluşturmaya çalışır. Bir HTML kimliğinin adında bir tire işareti bulunduğundan emin olarak, aşağıdaki gibi çakışmaları önler:

message.js

message = function(containerObject){
    this.htmlObject = containerObject;
};
message.prototype.write = function(text){
    this.htmlObject.innerHTML+=text;
};

html

<body>
    <span id='message-text'></span>
</body>
<script>
    var objectContainer = {};
    if(typeof message == 'undefined'){
        var asyncScript = document.createElement('script');
        asyncScript.onload = function(){
            objectContainer.messageClass = new message(document.getElementById('message-text'));
            objectContainer.messageClass.write('loaded');
        }
        asyncScript.src = 'message.js';
        document.appendChild(asyncScript);
    }else{
        objectContainer.messageClass = new message(document.getElementById('message-text'));
        objectContainer.messageClass.write('loaded');
    }
</script>

Elbette, messageText veya message_text'i kullanabilirsiniz, ancak bu sorunu çözmez ve daha sonra JavaScript yerine yanlışlıkla bir HTML Nesnesine erişeceğiniz aynı sorunla karşılaşabilirsiniz.

Bir not, ['mesaj-metni'] penceresini kullanarak (örneğin) pencere nesnesi aracılığıyla HTML nesnelerine hala erişebilirsiniz;


Buradaki gönderinizle ilgili bir şey anlamıyorum, belki netleştirebilirsiniz. Bu nedenle, bazı tarayıcıların html kimliklerini global nesneler olarak kaydettiğini ve kimliğe bir tire koyarsanız, bu otomatik olarak oluşturulan nesneler ile sizin oluşturduğunuz nesneler arasında hiçbir çakışma olmayacağını garanti edeceğinizi söylüyorsunuz çünkü tirelere izin verilmiyor. . Peki, tirelere izin verilmiyorsa tarayıcı bu tireli nesneleri nasıl oluşturur? Görünüşe göre onları soymak zorunda kalacak, böylece sizi bir adlandırma çatışması potansiyeli ile karşı karşıya bırakacak.
Dallas Caley

@DallasCaley görmediyseniz, bu cevap güncellemeden sesleniyorduwindow['message-text'];
Chris Marisic 02

Ah sanırım anladım. Javascript'in tek başına bir nesne olarak adında tire bulunan bir nesneyi oluşturmanıza izin vermemesi garip, ancak başka bir nesnenin özelliği olarak oluşturulmuşsa adında bir tire olan bir nesne oluşturmanıza izin veriyor adında tire işareti yok.
Dallas Caley

Bu gönderi aslında benim konumumu sizinle neredeyse% 100 anlaşmaya varacak şekilde yeniden düşünmeme neden oldu, bu aptalca bir konumdan, tek çekincem konuyla ilgili pozisyonunuza verildiği anlaşılıyor ki her kimliğin bir - içinde olması gerektiği açık görünüyor. özellikle bazı kimlikler için çalışmasını istemediğiniz sürece aynı sorun.
user254694

87

Google HTML / CSS Stil Kılavuzunu tavsiye ederim

Bu özellikle belirtir :

Kimlik ve sınıf adlarındaki sözcükleri kısa çizgiyle ayırın . Anlaşılırlığı ve taranabilirliği geliştirmek için seçicilerdeki sözcükleri ve kısaltmaları kısa çizgiler dışında herhangi bir karakterle (hiç yok dahil) birleştirmeyin.

/* Not recommended: does not separate the words “demo” and “image” */
.demoimage {}

/* Not recommended: uses underscore instead of hyphen */
.error_status {}

/* Recommended */
#video-id {}
.ads-sample {}

1
Ya BEMnotasyon?
Iulian Onofrei

1
@IulianOnofrei Elbette BEM'i kullanmakta özgürsünüz, ancak açıkça Google Stil Kılavuzu'na tam olarak uymuyor.
Klas Mellbourn

hmm, çok tuhaf. Google'ın GWT çerçevesi camelcase kullanır. Aşağıdaki belgede bu <h1 id = "appTitle"> </h1> kod satırını kontrol edin. gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos

4
Google! = Otomatik olarak doğru. Genellikle öyledirler, ancak sadece Google olmak yeterli bir gerekçe değildir.
Craig Brett

2
Bu gerçekten kötü bir fikir. Er ya da geç adınızı, değişken adlarında (temelde hepsi) kısa çizgileri desteklemeyen bir programlama dilinde kullanmak isteyeceksiniz ve sonra BOOM! Aptalca yeniden adlandırma kuralları.
Timmmm

5

Bu gerçekten tercihe bağlıdır, ancak sizi belirli bir yönde etkileyecek olan şey, kod yazdığınız düzenleyici olabilir. Örneğin, TextMate'in otomatik tamamlama özelliği kısa çizgide durur, ancak alt çizgiyle ayrılmış kelimeleri tek bir kelime olarak görür. Bu nedenle sınıf adları ve kimlikleri , otomatik tamamlama özelliğini ( ) kullanmaya the_postgöre daha iyi çalışır .the-postEsc


haklısın ama bu "html ormanı" çevresinde daha
karışık görünecek

4

Bunun tamamen programcıya bağlı olduğuna inanıyorum. İsterseniz camelCase'i de kullanabilirsiniz (ama bunun tuhaf görüneceğini düşünüyorum.)

Ben şahsen kısa çizgiyi tercih ediyorum, çünkü klavyemde yazmak daha hızlı. Bu nedenle, her iki örneğiniz de yaygın olarak kullanıldığı için en rahat olduğunuz şeyle gitmeniz gerektiğini söyleyebilirim.


3
bu soru benzer ve bu yanıtı doğrular stackoverflow.com/questions/70579/…
Matt Smith

2

Her iki örnek de tamamen geçerlidir, hatta ":" veya "" karışımına bile atabilirsiniz. w3c özelliklerine göre ayırıcılar olarak . Ben şahsen "_" iki kelimelik bir isim ise, sırf boşlukla benzerliğinden dolayı kullanıyorum.


14
Evet, kimlikler için iki nokta üst üste ve nokta kullanabilirsiniz, ancak bu, CSS dosyasını yazan kişinin sizden nefret etmesini sağlamanın iyi bir yoludur.
Dave Markle

5
Bir HTML tanımlayıcısından (CSS2 ve üstü) ZZ:ZZolarak kaçınılmalıdır ZZ\00003AZZ.
McDowell

1
İyi bir uygulama olduğunu söylemedim, geçerli olduğunu söyledim.
Myles

5
JQuery'yi patlatmanın eğlenceli bir yolu gibi görünüyor
Mike Robinson

0

İlkini (bir-iki) kullanıyorum çünkü daha okunaklı. Resimler için alt çizgiyi tercih ediyorum (btn_more.png). Camel Case (oneTwo) başka bir seçenektir.


0

Aslında bazı dış çerçeveler (javascript, php) kimlik adlarında hipeni kullanmada zorluklar (hatalar?) Alt çizgi kullanıyorum (960grid de öyle) ve hepsi harika çalışıyor.


3
Hangileri? Her neyse, kod okunabilirliği çok daha önemli bir şey.
Kamil Tomšík

-1

Esas olarak karşılaştığım bir javascript yan etkisi nedeniyle altını çizmenizi öneririm.

Aşağıdaki kodu konum çubuğunuza yazacak olsaydınız, bir hata alırsınız: "örnek değer" tanımsızdır. Div, alt çizgilerle adlandırılsaydı işe yarardı.

javascript:alert(example-value.currentStyle.hasLayout);

5
İyi document.getElementById("example-value")çalışacak olması gerekir .
Chuck

Html yardımcı işlevlerinin HtmlAttributes parametresindeki bir öznitelik için bir değer belirlerken ASP.NET MVC ile benzer bir sorun alıyorum.
Matthijs Wessels
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.