<div id="example-value">
or <div id="example_value">
?
Этот сайт и Twitter используют первый стиль. Facebook и Vimeo — второе.
Какой из них вы используете и почему?
<div id="example-value">
or <div id="example_value">
?
Этот сайт и Twitter используют первый стиль. Facebook и Vimeo — второе.
Какой из них вы используете и почему?
Используйте дефисы, чтобы обеспечить изоляцию между вашим 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'];
window['message-text'];
- person Chris Marisic; 02.06.2016
Я бы рекомендовал Руководство по стилю Google 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 {}
BEM
?
- person Iulian Onofrei; 30.07.2014
Это действительно сводится к предпочтениям, но то, что повлияет на вас в определенном направлении, может быть редактором, в котором вы кодируете. Например, функция автозаполнения в TextMate останавливается на дефисе, но видит слова, разделенные знаком подчеркивания, как одно слово. Таким образом, имена классов и идентификаторы с the_post
работают лучше, чем the-post
, при использовании его функции автозаполнения (Esc
).
Я считаю, что это полностью зависит от программиста. Вы также можете использовать camelCase, если хотите (но я думаю, что это будет выглядеть неуклюже).
Я лично предпочитаю дефис, потому что на моей клавиатуре быстрее печатать. Поэтому я бы сказал, что вы должны использовать то, что вам наиболее удобно, поскольку оба ваших примера широко используются.
Любой пример вполне допустим, вы даже можете добавить в смесь ":" или "." в качестве разделителей в соответствии с спецификацией w3c. Я лично использую «_», если это имя состоит из двух слов, только из-за его сходства с пространством.
ZZ:ZZ
должен быть экранирован как ZZ\00003AZZ
(CSS2 и выше).
- person McDowell; 08.11.2009
Я использую первый (раз-два), потому что он более удобочитаем. Для изображений я предпочитаю подчеркивание (btn_more.png). Camel Case (oneTwo) — еще один вариант.
На самом деле некоторые внешние фреймворки (javascript, php) имеют трудности (ошибки?) с использованием hypen в именах идентификаторов. Я использую подчеркивание (как и 960grid), и все отлично работает.
Я бы предложил подчеркивание в основном из-за побочного эффекта javascript, с которым я сталкиваюсь.
Если бы вы ввели приведенный ниже код в адресную строку, вы бы получили сообщение об ошибке: «example-value» не определено. Если бы div был назван символом подчеркивания, это сработало бы.
javascript:alert(example-value.currentStyle.hasLayout);
document.getElementById("example-value")
, который будет работать нормально.
- person Chuck; 07.01.2010