<div id="example-value">
或<div id="example_value">
?
此网站和Twitter使用第一种风格。 Facebook和Vimeo--第二个。
你使用哪一个?为什么?
答案 0 :(得分:127)
使用连字符确保HTML和JavaScript之间的隔离。
为什么呢?见下文。
连字符在CSS和HTML中有效,但在JavaScript对象中无效。
许多浏览器将HTML ID作为全局对象注册到窗口/文档对象上,在大型项目中,这可能会成为一种真正的痛苦。
出于这个原因,我使用带有连字符的名称,HTML ID永远不会与我的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 ID注册为全局对象,则上述操作将失败,因为该消息不是“未定义”,它将尝试创建HTML对象的实例。通过确保HTML ID在名称中有连字符可以防止如下所示的冲突:
<强> 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对象时遇到同样的问题
一句话,你仍然可以通过(例如)窗口对象使用window ['message-text']访问HTML对象;
答案 1 :(得分:80)
我会推荐Google HTML/CSS Style Guide
用连字符 分隔ID和类名中的单词。除了连字符之外,不要用任何字符(包括根本没有)连接选择器中的单词和缩写,以提高理解和可扫描性。
/* 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 {}
答案 2 :(得分:4)
这实际上归结为偏好,但是在特定方向上影响你的东西可能是你编码的编辑器。例如,TextMate的自动完成功能在连字符处停止,但会将由下划线分隔的单词视为单个单词。因此,使用其自动完成功能(the_post
)时,the-post
的类名和ID的效果优于Esc
。
答案 3 :(得分:3)
我相信这完全取决于程序员。你也可以使用camelCase(但我觉得这看起来很尴尬。)
我个人更喜欢连字符,因为在键盘上键入更快。所以我会说你应该选择你最熟悉的东西,因为你的两个例子都被广泛使用。
答案 4 :(得分:2)
这两个例子都是完全有效的,你甚至可以投入混合“:”或“。”根据w3c spec作为分隔符。我个人使用“_”,如果它是一个双字的名字,只是因为它与空间的相似性。
答案 5 :(得分:1)
我使用第一个(一两个),因为它更具可读性。对于图像虽然我更喜欢下划线(btn_more.png)。 Camel Case(oneTwo)是另一种选择。
答案 6 :(得分:1)
实际上一些外部框架(javascript,php)在id名称中使用连字符有困难(错误?)。我使用下划线(960网格也是如此),一切都很棒。
答案 7 :(得分:0)
我建议使用下划线主要是因为我遇到了javascript副作用。
如果您在下面的代码栏中输入以下代码,则会收到错误:'example-value'未定义。如果div用下划线命名,它就可以工作。
javascript:alert(example-value.currentStyle.hasLayout);