การตั้งชื่อแอตทริบิวต์ HTML "class" และ "id" - ขีดกลางเทียบกับขีดเส้นใต้ [ปิด]


114

<div id="example-value">หรือ<div id="example_value">?

ไซต์นี้และ Twitter ใช้รูปแบบแรก Facebook และ Vimeo - วินาที

คุณใช้อันไหนและทำไม?


11
ลิงก์ทั้งสองนั้นใช้งานไม่ได้แล้ว
Steve

คำตอบ:


136

ใช้ยัติภังค์เพื่อให้แน่ใจว่ามีการแยกระหว่าง HTML และ JavaScript ของคุณ

ทำไม? ดูด้านล่าง

ยัติภังค์ใช้ได้ใน CSS และ HTML แต่ใช้กับ JavaScript Objects ไม่ได้

เบราว์เซอร์จำนวนมากลงทะเบียนรหัส 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 คุณจะรับประกันได้ว่าจะไม่มีข้อขัดแย้งระหว่างวัตถุที่สร้างขึ้นโดยอัตโนมัติเหล่านี้กับวัตถุที่คุณสร้างเนื่องจากไม่อนุญาตให้ใช้ยัติภังค์ . แต่แล้วเบราว์เซอร์จะสร้างวัตถุยัติภังค์เหล่านี้ได้อย่างไรหากไม่อนุญาตให้ใช้ยัติภังค์ ดูเหมือนว่ามันจะต้องตัดมันออกไปจึงทำให้คุณมีโอกาสเกิดความขัดแย้งในการตั้งชื่อ
Dallas Caley

@DallasCaley ถ้าคุณไม่เห็นคำตอบนี้คือการอัปเดตที่โทรออกwindow['message-text'];
Chris Marisic

ฉันคิดว่าฉันเข้าใจแล้ว แปลกที่จาวาสคริปต์ไม่อนุญาตให้คุณสร้างอ็อบเจกต์ที่มีเครื่องหมายขีดกลางในชื่อเป็นอ็อบเจ็กต์แบบสแตนด์อะโลน แต่จะอนุญาตให้คุณสร้างอ็อบเจกต์ที่มีเครื่องหมายขีดในชื่อหากสร้างเป็นคุณสมบัติของอ็อบเจ็กต์อื่น ที่ไม่มีเส้นประในชื่อ
Dallas Caley

โพสต์นี้ทำให้ฉันคิดใหม่ว่าตำแหน่งของฉันเป็นข้อตกลงเกือบ 100% กับคุณจากตำแหน่งที่ไม่โง่การจองเพียงอย่างเดียวของฉันได้รับตำแหน่งของคุณในปัญหาดูเหมือนว่าทุกรหัสควรมี - อยู่ในนั้นเพื่อป้องกันไม่ให้ ปัญหาเดียวกันเว้นแต่คุณต้องการให้ใช้งานได้กับรหัสเฉพาะบางอย่าง
user254694

87

ฉันอยากจะแนะนำ 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 {}

1
แล้วBEMสัญกรณ์ล่ะ?
Iulian Onofrei

1
@IulianOnofrei คุณมีอิสระที่จะใช้ BEM แต่เห็นได้ชัดว่าไม่เป็นไปตามคำแนะนำสไตล์ Google อย่างเคร่งครัด
Klas Mellbourn

อืมแปลกมาก เฟรมเวิร์ก GWT จาก google ใช้ camelcase ตรวจสอบโค้ดบรรทัดนี้ <h1 id = "appTitle"> </h1> ใน docu ต่อไปนี้ gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos

4
Google! = ถูกต้องโดยอัตโนมัติ พวกเขามักจะเป็น แต่การเป็น Google นั้นไม่เพียงพอสำหรับเหตุผล
Craig Brett

2
นี่เป็นความคิดที่แย่จริงๆ ไม่ช้าก็เร็วคุณจะต้องใช้ชื่อของคุณในภาษาโปรแกรมที่ไม่รองรับยัติภังค์ในชื่อตัวแปร (โดยทั่วไปแล้วทั้งหมด) จากนั้น BOOM! กฎการเปลี่ยนชื่อสำนวน
Timmmm

5

มันขึ้นอยู่กับความชอบจริงๆ แต่สิ่งที่จะส่งผลต่อคุณในทิศทางใดทิศทางหนึ่งอาจเป็นตัวแก้ไขที่คุณเขียนโค้ดด้วย ตัวอย่างเช่นคุณลักษณะการเติมข้อความอัตโนมัติของTextMateจะหยุดที่ขีดกลาง แต่จะเห็นคำที่คั่นด้วยเครื่องหมายขีดล่างเป็นคำเดียว ดังนั้นชื่อคลาสและรหัสที่the_postทำงานได้ดีกว่าthe-postเมื่อใช้คุณสมบัติการเติมข้อความอัตโนมัติ ( Esc)


คุณพูดถูก แต่มันจะดูยุ่งเหยิงกว่าใน "ป่า html" โดยรอบ
Kamil Tomšík

4

ฉันเชื่อว่าทั้งหมดนี้ขึ้นอยู่กับโปรแกรมเมอร์ คุณสามารถใช้ camelCase ได้เช่นกันถ้าคุณต้องการ (แต่ฉันคิดว่ามันจะดูอึดอัด)

โดยส่วนตัวแล้วฉันชอบยัติภังค์มากกว่าเพราะพิมพ์บนคีย์บอร์ดได้เร็วกว่า ดังนั้นฉันจะบอกว่าคุณควรเลือกสิ่งที่คุณพอใจมากที่สุดเนื่องจากทั้งสองตัวอย่างของคุณใช้กันอย่างแพร่หลาย


3
คำถามนี้คล้ายกันและยืนยันคำตอบนี้stackoverflow.com/questions/70579/…
Matt Smith

2

ทั้งสองตัวอย่างนั้นใช้ได้อย่างสมบูรณ์แบบคุณยังสามารถผสม ":" หรือ "" ก็ได้ เป็นตัวคั่นตามของ W3C ข้อมูลจำเพาะ โดยส่วนตัวฉันใช้ "_" ถ้าเป็นชื่อสองคำเพียงเพราะความคล้ายคลึงกับช่องว่าง


14
ได้คุณสามารถใช้เครื่องหมายจุดคู่และจุดสำหรับรหัสได้ แต่นั่นเป็นวิธีที่ดีที่จะทำให้คนที่เขียนไฟล์ CSS เกลียดคุณ
Dave Markle

5
ตัวระบุ HTML ZZ:ZZจะต้องใช้ Escape เป็นZZ\00003AZZ(CSS2 ขึ้นไป)
McDowell

1
ฉันไม่ได้บอกว่ามันเป็นแนวทางปฏิบัติที่ดีฉันบอกว่ามันใช้ได้
ไมลส์

5
ดูเหมือนเป็นวิธีที่สนุกในการทำให้ jQuery ระเบิด
Mike Robinson

0

ฉันใช้อันแรก (หนึ่ง - สอง) เพราะอ่านได้ง่ายกว่า สำหรับรูปภาพฉันชอบขีดล่าง (btn_more.png) Camel Case (oneTwo) เป็นอีกทางเลือกหนึ่ง


0

จริงๆแล้วเฟรมเวิร์กภายนอกบางอัน (javascript, php) มีปัญหา (บั๊ก?) กับการใช้ยัติภังค์ในชื่อ id ฉันใช้ขีดล่าง (960grid ก็เช่นกัน) และทุกอย่างใช้งานได้ดี


3
อันไหน? อย่างไรก็ตามความสามารถในการอ่านรหัสเป็นสิ่งที่สำคัญกว่ามาก
Kamil Tomšík

-1

ฉันขอแนะนำขีดล่างส่วนใหญ่ด้วยเหตุผลของผลข้างเคียงของจาวาสคริปต์ที่ฉันพบ

หากคุณต้องพิมพ์โค้ดด้านล่างลงในแถบสถานที่ตั้งของคุณคุณจะได้รับข้อผิดพลาด: 'ค่าตัวอย่าง' ไม่ได้กำหนด ถ้า div ถูกตั้งชื่อด้วยเครื่องหมายขีดล่างก็จะใช้ได้

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

5
ที่ควรจะเป็นdocument.getElementById("example-value")ซึ่งจะทำงานได้ดี
Chuck

ฉันได้รับปัญหาที่คล้ายกันกับ ASP.NET MVC เมื่อระบุค่าสำหรับแอตทริบิวต์ในพารามิเตอร์ HtmlAttributes ของฟังก์ชันตัวช่วย Html
Matthijs Wessels
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.