Denominazione degli attributi HTML "class" e "id": trattini e sottolineature [chiuso]


113

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

Questo sito e Twitter utilizzano il primo stile. Facebook e Vimeo: il secondo.

Quale usi e perché?


11
Entrambi questi collegamenti sono ora interrotti
Steve

Risposte:


135

Utilizza i trattini per garantire l'isolamento tra HTML e JavaScript.

Perché? vedi sotto.

I trattini sono validi per l'uso in CSS e HTML ma non per gli oggetti JavaScript.

Molti browser registrano gli ID HTML come oggetti globali sull'oggetto finestra / documento, in grandi progetti, questo può diventare un vero problema.

Per questo motivo, utilizzo nomi con trattini in questo modo gli ID HTML non entreranno mai in conflitto con il mio JavaScript.

Considera quanto segue:

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>

Se il browser registra gli ID HTML come oggetti globali, quanto sopra fallirà perché il messaggio non è "indefinito" e proverà a creare un'istanza dell'oggetto HTML. Assicurandosi che un ID HTML abbia un trattino nel nome, si evitano conflitti come quello di seguito:

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>

Ovviamente, potresti usare messageText o message_text ma questo non risolve il problema e potresti incappare nello stesso problema in seguito in cui potresti accedere accidentalmente a un oggetto HTML invece di uno JavaScript

Un'osservazione, puoi ancora accedere agli oggetti HTML tramite l'oggetto finestra (ad esempio) usando window ['message-text'];


Non capisco qualcosa del tuo post qui, forse puoi chiarire. Quindi dici che alcuni browser registrano gli id ​​html come oggetti globali e che se metti un trattino nell'id allora garantirai che non ci sarà conflitto tra questi oggetti generati automaticamente e quelli che crei perché i trattini non sono consentiti . Ma come fa il browser a creare questi oggetti con trattini se i trattini non sono consentiti? sembra che dovrebbe spogliarli, lasciandoti così con il potenziale di un conflitto di denominazione.
Dallas Caley

@DallasCaley se non hai visto, questa risposta era un aggiornamento che chiamavawindow['message-text'];
Chris Marisic

Ah penso di aver capito. Strano che javascript non ti permetta di creare un oggetto con un trattino nel nome come oggetto autonomo, ma ti permetterà di creare un oggetto con un trattino nel nome se viene creato come proprietà di un altro oggetto che non ha un trattino nel nome.
Dallas Caley

Questo post in realtà mi ha fatto ripensare alla mia posizione in un accordo quasi al 100% con te da una posizione di no che è sciocca, la mia unica riserva è data dalla tua posizione sulla questione, sembra evidente che ogni ID dovrebbe avere un - in esso per impedire il stesso problema a meno che tu non voglia specificamente che funzioni per alcuni ID particolari.
user254694

87

Consiglierei la guida di stile HTML / CSS di Google

Si afferma in particolare :

Separare le parole nell'ID e nei nomi delle classi con un trattino . Non concatenare parole e abbreviazioni nei selettori con caratteri (incluso nessuno) diversi dai trattini, al fine di migliorare la comprensione e la possibilità di leggerezza.

/* 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
E la BEMnotazione?
Iulian Onofrei

1
@IulianOnofrei sei ovviamente libero di usare BEM, ma chiaramente non aderisce strettamente alla Google Style Guide.
Klas Mellbourn

hmm, molto strano. Il framework GWT di Google utilizza camelcase. Controlla questa riga di codice <h1 id = "appTitle"> </h1> nel seguente documento. gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos,

4
Google! = Automaticamente a destra. Spesso lo sono, ma essere solo Google non è una giustificazione sufficiente.
Craig Brett

2
Questa è davvero una pessima idea. Prima o poi vorrai usare il tuo nome in un linguaggio di programmazione che non supporta i trattini nei nomi delle variabili (praticamente tutti), e poi BOOM! Regole di ridenominazione idiotiche.
Timmmm

5

Dipende davvero dalle preferenze, ma ciò che ti influenzerà in una particolare direzione potrebbe essere l'editor con cui codifichi. Ad esempio, la funzione di completamento automatico di TextMate si ferma su un trattino, ma vede le parole separate da un trattino basso come una singola parola. Quindi i nomi delle classi e gli ID con the_postfunzionano meglio rispetto a the-postquando si utilizza la sua funzione di completamento automatico ( Esc).


hai ragione ma sembrerà molto più complicato in quella circostante "giungla html"
Kamil Tomšík

4

Credo che questo dipenda interamente dal programmatore. Potresti usare anche camelCase se lo desideri (ma penso che sembrerebbe imbarazzante).

Personalmente preferisco il trattino, perché è più veloce da digitare sulla tastiera. Quindi direi che dovresti scegliere ciò con cui ti senti più a tuo agio, poiché entrambi i tuoi esempi sono ampiamente utilizzati.


3
questa domanda è simile e verifica questa risposta stackoverflow.com/questions/70579/…
Matt Smith,

2

Entrambi gli esempi sono perfettamente validi, puoi persino inserire nel mix ":" o "." come separatori secondo la specifica w3c . Personalmente uso "_" se è un nome di due parole solo per la sua somiglianza con lo spazio.


14
Sì, puoi usare due punti e punti per gli ID, ma è un buon modo per convincere la persona che scrive il file CSS a odiarti.
Dave Markle,

5
Un identificatore HTML ZZ:ZZdovrebbe essere sottoposto a escape come ZZ\00003AZZ(CSS2 e versioni successive).
McDowell

1
Non ho detto che fosse una buona pratica, ho detto che era valida.
Myles

5
Sembra un modo divertente per far esplodere jQuery
Mike Robinson

0

Uso il primo (uno-due) perché è più leggibile. Per le immagini però preferisco il trattino basso (btn_more.png). Camel Case (oneTwo) è un'altra opzione.


0

In realtà alcuni framework esterni (javascript, php) hanno difficoltà (bug?) Nell'uso dell'ipen nei nomi degli id. Uso il carattere di sottolineatura (così fa 960grid) e tutto funziona alla grande.


3
Quale? Comunque, la leggibilità del codice è una cosa molto più importante.
Kamil Tomšík

-1

Suggerirei di sottolineare principalmente per il motivo di un effetto collaterale di javascript che sto riscontrando.

Se dovessi digitare il codice di seguito nella barra degli indirizzi, riceverai un errore: "valore-esempio" non è definito. Se il div fosse denominato con trattini bassi, funzionerebbe.

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

5
Dovrebbe essere document.getElementById("example-value"), che funzionerà bene.
Chuck

Sto riscontrando un problema simile con ASP.NET MVC quando si specifica un valore per un attributo nel parametro HtmlAttributes delle funzioni di supporto Html.
Matthijs Wessels
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.