Đặt tên cho các thuộc tính HTML “class” và “id” - dấu gạch ngang so với dấu gạch dưới [đã đóng]


113

<div id="example-value">hoặc <div id="example_value">?

Trang web này và Twitter sử dụng kiểu đầu tiên. Facebook và Vimeo - thứ hai.

Bạn sử dụng cái nào và tại sao?


11
Cả hai liên kết đó hiện đã bị hỏng
Steve

Câu trả lời:


135

Sử dụng Dấu gạch nối để đảm bảo sự tách biệt giữa HTML và JavaScript của bạn.

Tại sao? xem bên dưới.

Dấu gạch nối hợp lệ để sử dụng trong CSS và HTML nhưng không hợp lệ cho các Đối tượng JavaScript.

Rất nhiều trình duyệt đăng ký HTML Id là đối tượng toàn cục trên đối tượng window / document, trong các dự án lớn, điều này có thể trở thành một vấn đề thực sự.

Vì lý do này, tôi sử dụng tên có Dấu gạch nối theo cách này, các id HTML sẽ không bao giờ xung đột với JavaScript của tôi.

Hãy xem xét những điều sau:

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>

Nếu trình duyệt đăng ký id HTML dưới dạng đối tượng toàn cục, điều trên sẽ không thành công vì thông báo không phải là 'không xác định' và nó sẽ cố gắng tạo một phiên bản của đối tượng HTML. Bằng cách đảm bảo một id HTML có dấu gạch ngang trong tên sẽ ngăn chặn các xung đột như bên dưới:

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>

Tất nhiên, bạn có thể sử dụng messageText hoặc message_text nhưng điều này không giải quyết được vấn đề và bạn có thể gặp phải vấn đề tương tự sau đó khi bạn vô tình truy cập vào một Đối tượng HTML thay vì một JavaScript

Một lưu ý, bạn vẫn có thể truy cập các đối tượng HTML thông qua đối tượng window (ví dụ) bằng cách sử dụng window ['message-text'];


Tôi không hiểu điều gì đó về bài đăng của bạn ở đây, có lẽ bạn có thể làm rõ. Vì vậy, bạn nói rằng một số trình duyệt đăng ký id html là đối tượng toàn cục và nếu bạn đặt dấu gạch ngang trong id thì bạn sẽ đảm bảo rằng sẽ không có xung đột giữa các đối tượng được tạo tự động này và các đối tượng mà bạn tạo bởi vì dấu gạch nối không được phép . Nhưng làm thế nào sau đó trình duyệt tạo ra các đối tượng có dấu gạch nối này nếu dấu gạch nối không được phép? có vẻ như nó sẽ phải loại bỏ chúng, do đó để lại cho bạn khả năng xung đột đặt tên.
Dallas Caley

@DallasCaley nếu bạn không nhìn thấy, câu trả lời này là cập nhật gọi rawindow['message-text'];
Chris Marisic

Ah tôi nghĩ rằng tôi hiểu nó. Kỳ lạ là javascript không cho phép bạn tạo một đối tượng có dấu gạch ngang trong tên như một đối tượng độc lập, nhưng nó sẽ cho phép bạn tạo một đối tượng có dấu gạch ngang trong tên nếu nó được tạo dưới dạng thuộc tính của một đối tượng khác không có dấu gạch ngang trong tên.
Dallas Caley

Bài đăng này thực sự đã khiến tôi phải suy nghĩ lại về lập trường của mình về sự đồng ý gần như 100% với bạn từ một lập trường không có gì là ngớ ngẩn, bảo lưu duy nhất của tôi là đưa ra quan điểm của bạn về vấn đề này, có vẻ như mọi id đều phải có - trong đó để ngăn chặn cùng một vấn đề trừ khi bạn đặc biệt muốn nó hoạt động cho một số id cụ thể.
user254694

87

Tôi muốn giới thiệu Hướng dẫn tạo kiểu HTML / CSS của Google

nói rõ :

Phân tách các từ trong ID và tên lớp bằng dấu gạch ngang . Không được nối các từ và chữ viết tắt trong bộ chọn bằng bất kỳ ký tự nào (không bao gồm ký tự nào) ngoài dấu gạch nối, để cải thiện sự hiểu biết và khả năng quét.

/* 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
Còn về BEMký hiệu?
Iulian Onofrei,

1
@IulianOnofrei tất nhiên bạn có thể thoải mái sử dụng BEM, nhưng rõ ràng là nó không tuân thủ nghiêm ngặt Hướng dẫn phong cách của Google.
Klas Mellbourn

hmm, rất kỳ lạ. Khung GWT từ google sử dụng camelcase. Kiểm tra dòng mã này <h1 id = "appTitle"> </h1> trong tài liệu sau. gwtproject.org/doc/latest/tutorial/i18n.html
karlihnos

4
Google! = Tự động đúng. Họ thường là vậy, nhưng chỉ là Google thì không đủ để biện minh.
Craig Brett

2
Đây là một ý tưởng thực sự tồi. Không sớm thì muộn, bạn sẽ muốn sử dụng tên của mình trong một ngôn ngữ lập trình không hỗ trợ dấu gạch nối trong tên biến (về cơ bản là tất cả chúng), và sau đó là BOOM! Quy tắc đổi tên sinh học.
Timmmm

5

Nó thực sự tùy thuộc vào sở thích, nhưng thứ sẽ khiến bạn bị ảnh hưởng theo một hướng cụ thể có thể là trình soạn thảo mà bạn viết mã. Ví dụ: tính năng tự động hoàn thành của TextMate dừng lại ở dấu gạch ngang, nhưng xem các từ được phân tách bằng dấu gạch dưới là một từ duy nhất. Vì vậy, tên và id của lớp the_posthoạt động tốt hơn so với the-postkhi sử dụng tính năng tự động hoàn thành ( Esc).


bạn đúng là nhưng nó sẽ có vẻ nhiều Messier ở chỗ xung quanh "html rừng"
Kamil Tomšík

4

Tôi tin rằng điều này hoàn toàn phụ thuộc vào lập trình viên. Bạn cũng có thể sử dụng camelCase nếu muốn (nhưng tôi nghĩ điều đó trông rất khó xử.)

Cá nhân tôi thích dấu gạch nối hơn, vì nó gõ nhanh hơn trên bàn phím của tôi. Vì vậy, tôi muốn nói rằng bạn nên chọn những gì bạn cảm thấy thoải mái nhất, vì cả hai ví dụ của bạn đều được sử dụng rộng rãi.


3
câu hỏi này tương tự và xác minh câu trả lời này stackoverflow.com/questions/70579/…
Matt Smith

2

Một trong hai ví dụ là hoàn toàn hợp lệ, bạn thậm chí có thể đưa vào hỗn hợp ":" hoặc "." làm dải phân cách theo thông số kỹ thuật w3c . Cá nhân tôi sử dụng "_" nếu nó là một tên hai từ chỉ vì sự giống nhau về không gian của nó.


14
Có, bạn có thể sử dụng dấu hai chấm và dấu chấm cho Id, nhưng đó là một cách hay để khiến người viết tệp CSS ghét bạn.
Dave Markle

5
Mã định danh HTML ZZ:ZZsẽ phải có mã là ZZ\00003AZZ(CSS2 trở lên).
McDowell

1
Tôi không nói đó là thực hành tốt, tôi nói nó hợp lệ.
Myles

5
Âm thanh như một cách thú vị để làm cho jQuery nổ
Mike Robinson

0

Tôi sử dụng cái đầu tiên (một-hai) vì nó dễ đọc hơn. Đối với hình ảnh, tôi thích gạch dưới hơn (btn_more.png). Camel Case (một trong hai) là một lựa chọn khác.


0

Trên thực tế, một số framework bên ngoài (javascript, php) gặp khó khăn (lỗi?) Với việc sử dụng dấu gạch ngang trong tên id. Tôi sử dụng gạch dưới (960grid cũng vậy) và tất cả đều hoạt động tốt.


3
Những cái nào? Dù sao, khả năng đọc mã là điều quan trọng hơn nhiều.
Kamil Tomšík

-1

Tôi sẽ đề xuất gạch dưới chủ yếu vì lý do tác dụng phụ của javascript mà tôi đang gặp phải.

Nếu bạn nhập mã bên dưới vào thanh vị trí của mình, bạn sẽ gặp lỗi: 'example-value' không được xác định. Nếu div được đặt tên với dấu gạch dưới, nó sẽ hoạt động.

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

5
Điều đó nên được document.getElementById("example-value"), mà sẽ hoạt động tốt.
Chuck

Tôi đang gặp sự cố tương tự với ASP.NET MVC khi chỉ định giá trị cho một thuộc tính trong tham số HtmlAttributes của các hàm trình trợ giúp Html.
Matthijs Wessels
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.