Названня атрибутів HTML "class" та "id" - тире та підкреслення [закрито]


114

<div id="example-value">або <div id="example_value">?

Цей сайт і Twitter використовують перший стиль. Facebook і Vimeo - другий.

Яким ти користуєшся і чому?


11
Обидва ці ланки зараз розірвані
Стів

Відповіді:


136

Використовуйте дефіси, щоб забезпечити ізоляцію між вашим HTML та JavaScript.

Чому? Дивись нижче.

Дефіси дійсно використовувати в CSS та HTML, але не для об’єктів JavaScript.

Багато веб-переглядачів реєструють HTML-коди як глобальні об’єкти на об'єкті вікна / документа, у великих проектах це може стати справжнім болем.

З цієї причини я використовую імена з дефісами таким чином, ідентифікатори HTML ніколи не будуть суперечити моєму JavaScript.

Розглянемо наступне:

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>

Якщо браузер зареєструє ідентифікатори HTML як глобальні об'єкти, вищезазначене буде невдалим, оскільки повідомлення не є "невизначеним", і він спробує створити екземпляр об'єкта HTML. Переконайтесь, що в ідентифікаторі HTML є дефіс у назві, він запобігає конфліктам, як у наведеному нижче:

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>

Звичайно, ви можете використовувати messageText або message_text, але це не вирішує проблему, і ви можете зіткнутися з тією ж проблемою пізніше, коли ви випадково отримаєте доступ до HTML-об’єкта замість JavaScript

Одне зауваження, ви все ще можете отримати доступ до об’єктів HTML через (наприклад) об’єкт вікна, використовуючи window ['message-text'];


Я щось не розумію щодо вашої публікації тут, можливо, ви можете уточнити. Отже, ви кажете, що деякі веб-переглядачі реєструють ідентифікатор html як глобальні об’єкти, і якщо ви введете дефіс в id, ви гарантуєте, що не буде конфлікту між цими автоматично створеними об'єктами та тими, які ви створюєте, оскільки дефіси заборонені . Але як тоді браузер створює ці дефісні об’єкти, якщо дефіси не дозволені? здається, що доведеться позбавити їх, тим самим залишаючи у вас потенціал конфлікту імен.
Даллас Кейлі

@DallasCaley якщо ви не бачили, цю відповідь було оновлено, кличучиwindow['message-text'];
Chris Marisic

Ах, я думаю, я це зрозумію. Дивно, що javascript не дозволяє створювати об’єкт з тире в імені як окремий об'єкт, але він дозволить створити об’єкт з тире в імені, якщо він створений як властивість іншого об'єкта що не має тиру в назві.
Даллас Кейлі

Цей пост насправді змусив мене переосмислити свою позицію майже 100% згоди з вами з позиції "ні", що не є дурним, моє єдине застереження - це ваша позиція щодо питання, мабуть, очевидно, що кожен ідентифікатор повинен мати - в ньому, щоб запобігти те саме питання, якщо ви конкретно не хочете, щоб воно працювало для певних ідентифікаторів.
користувач254694

87

Я рекомендую посібник зі стилів HTML HTML / CSS

У ньому конкретно зазначено :

Відокремте слова в ідентифікаторах та назвах класів дефісом . Не поєднуйте слова та абревіатури у селекторах будь-якими символами (включаючи їх зовсім), крім дефісів, щоб покращити розуміння та сканування.

/* 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
Що з BEMнотацією?
Юліан Онофрей

1
@IulianOnofrei, звичайно, ви можете безкоштовно використовувати BEM, але він чітко не дотримується Посібника зі стилів Google.
Клас Меллбурн

хм, дуже дивно. Рамка GWT від Google використовує верблюд. Перевірте цей рядок коду <h1 id = "appTitle"> </h1> у наступному документі. gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos

4
Google! = Автоматично правильно. Вони часто є, але лише бути Google недостатньо виправдання.
Крейг Бретт

2
Це дійсно погана ідея. Рано чи пізно ви захочете використовувати своє ім'я в мові програмування, яка не підтримує дефісів у назвах змінних (в основному всі), а потім БУМ! Ідіотичні правила перейменування.
Timmmm

5

Це дійсно зводиться до переваг, але те, що буде коливати вас у певному напрямку, може бути редактором, з яким ви кодуєте. Наприклад, функція автоматичного завершення TextMate зупиняється на дефісі, але бачить слова, розділені підкресленням, як одне слово. Тож імена та ідентифікатори класів the_postпрацюють краще, ніж the-postпри використанні його функції автоматичного завершення ( Esc).


ви маєте рацію, але це здасться набагато грізнішим у тому оточуючому "html джунглях"
Kamil Tomšík

4

Я вважаю, що це повністю залежить від програміста. Ви можете також використовувати camelCase, якщо хочете (але я думаю, це виглядатиме незручно.)

Я особисто віддаю перевагу дефісу, тому що це швидше набрати на моїй клавіатурі. Тож я б сказав, що вам слід піти з тим, що вам найбільше комфортно, оскільки обидва ваші приклади широко використовуються.


3
це питання схоже і підтверджує цю відповідь stackoverflow.com/questions/70579/…
Метт Сміт

2

Будь-який приклад цілком справедливий, можна навіть кинути в суміш ":" або "." як роздільники відповідно до специфікації w3c . Я особисто використовую "_", якщо це два слова назви саме через його схожість з простором.


14
Так, ви можете використовувати двокрапки та періоди для ідентифікаторів, але це хороший спосіб змусити людину, яка пише файл CSS, ненавидіти вас.
Дейв Маркл

5
HTML-ідентифікатор ZZ:ZZповинен бути уникнути як ZZ\00003AZZ(CSS2 і вище).
МакДауелл

1
Я не сказав, що це була добра практика, я сказав, що це справедливо.
Майлз

5
Звучить цікавим способом змусити jQuery вибухнути
Майк Робінсон

0

Я використовую перший (один-два), тому що його більше читають. Для зображень, хоча я віддаю перевагу підкресленню (btn_more.png). Справа з верблюдами (oneTwo) - це ще один варіант.


0

Насправді деякі зовнішні рамки (javascript, php) мають труднощі (помилки?) З використанням гіпена в іменах id. Я використовую підкреслення (так це 960grid), і все працює чудово.


3
Котрий? У всякому разі, читабельність коду - це набагато важливіша річ.
Каміль Томшик

-1

Я б запропонував підкреслити, головним чином, із побічного ефекту javascript, з яким я стикаюся.

Якщо ви введете код нижче у свій рядок, ви отримаєте помилку: "example-value" не визначено. Якби дів був названий підкресленнями, він би спрацював.

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

5
Це повинно бути document.getElementById("example-value"), що буде добре працювати.
Чак

У мене виникає аналогічна проблема з ASP.NET MVC, коли вказується значення для атрибута в параметрі HtmlAttributes для допоміжних функцій Html.
Matthijs Wessels
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.