Kỹ thuật HTML5 hiện đại để thay đổi lớp
Các trình duyệt hiện đại đã thêm classList cung cấp các phương thức để giúp thao tác các lớp dễ dàng hơn mà không cần thư viện:
document.getElementById("MyElement").classList.add('MyClass');
document.getElementById("MyElement").classList.remove('MyClass');
if ( document.getElementById("MyElement").classList.contains('MyClass') )
document.getElementById("MyElement").classList.toggle('MyClass');
Thật không may, những không làm việc trong Internet Explorer trước khi v10, mặc dù có một shim để hỗ trợ thêm cho nó để IE8 và IE9, có sẵn từ trang này . Đó là, mặc dù, ngày càng được hỗ trợ nhiều hơn .
Giải pháp trình duyệt chéo đơn giản
Cách JavaScript tiêu chuẩn để chọn một phần tử đang sử dụng document.getElementById("Id")
, đó là cách mà các ví dụ sau sử dụng - tất nhiên bạn có thể có được các phần tử theo các cách khác và trong trường hợp phù hợp có thể chỉ cần sử dụng this
thay vào đó - tuy nhiên, đi sâu vào chi tiết về điều này nằm ngoài phạm vi của câu trả lời.
Để thay đổi tất cả các lớp cho một phần tử:
Để thay thế tất cả các lớp hiện có bằng một hoặc nhiều lớp mới, hãy đặt thuộc tính className:
document.getElementById("MyElement").className = "MyClass";
(Bạn có thể sử dụng danh sách được phân tách bằng dấu cách để áp dụng nhiều lớp.)
Để thêm một lớp bổ sung cho một phần tử:
Để thêm một lớp vào một phần tử, mà không xóa / ảnh hưởng đến các giá trị hiện có, hãy thêm một khoảng trắng và tên lớp mới, như vậy:
document.getElementById("MyElement").className += " MyClass";
Để xóa một lớp khỏi một phần tử:
Để loại bỏ một lớp duy nhất thành một phần tử, mà không ảnh hưởng đến các lớp tiềm năng khác, yêu cầu thay thế regex đơn giản:
document.getElementById("MyElement").className =
document.getElementById("MyElement").className.replace
( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */
Một lời giải thích về regex này như sau:
(?:^|\s) # Match the start of the string, or any single whitespace character
MyClass # The literal text for the classname to remove
(?!\S) # Negative lookahead to verify the above is the whole classname
# Ensures there is no non-space character following
# (i.e. must be end of string or a space)
Các g
lá cờ kể về thay thế để lặp lại theo quy định, trong trường hợp tên lớp đã được thêm vào nhiều lần.
Để kiểm tra xem một lớp đã được áp dụng cho một phần tử chưa:
Regex tương tự được sử dụng ở trên để loại bỏ một lớp cũng có thể được sử dụng như một kiểm tra xem liệu một lớp cụ thể có tồn tại hay không:
if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )
Chỉ định các hành động này cho các sự kiện onclick:
Mặc dù có thể viết JavaScript trực tiếp bên trong các thuộc tính sự kiện HTML (chẳng hạn như onclick="this.className+=' MyClass'"
) đây không phải là hành vi được khuyến nghị. Đặc biệt trên các ứng dụng lớn hơn, mã có thể duy trì nhiều hơn đạt được bằng cách tách đánh dấu HTML khỏi logic tương tác JavaScript.
Bước đầu tiên để đạt được điều này là bằng cách tạo một hàm và gọi hàm trong thuộc tính onclick, ví dụ:
<script type="text/javascript">
function changeClass(){
// Code examples from above
}
</script>
...
<button onclick="changeClass()">My Button</button>
(Không bắt buộc phải có mã này trong các thẻ script, điều này chỉ đơn giản là để lấy ví dụ và bao gồm JavaScript trong một tệp riêng biệt có thể phù hợp hơn.)
Bước thứ hai là chuyển sự kiện onclick ra khỏi HTML và vào JavaScript, ví dụ như sử dụng addEventListener
<script type="text/javascript">
function changeClass(){
// Code examples from above
}
window.onload = function(){
document.getElementById("MyElement").addEventListener( 'click', changeClass);
}
</script>
...
<button id="MyElement">My Button</button>
(Lưu ý rằng phần window.onload là bắt buộc để nội dung của hàm đó được thực thi sau khi HTML tải xong - nếu không có điều này, MyEuity có thể không tồn tại khi mã JavaScript được gọi, do đó dòng đó sẽ thất bại.)
Các khung và thư viện JavaScript
Đoạn mã trên hoàn toàn bằng JavaScript tiêu chuẩn, tuy nhiên, thông thường sử dụng khung hoặc thư viện để đơn giản hóa các tác vụ thông thường, cũng như hưởng lợi từ các lỗi cố định và các trường hợp cạnh mà bạn có thể không nghĩ đến khi viết mã.
Mặc dù một số người cho rằng việc bổ sung khung ~ 50 KB chỉ đơn giản là thay đổi một lớp, nếu bạn đang thực hiện bất kỳ công việc JavaScript đáng kể nào hoặc bất kỳ điều gì có thể có hành vi trình duyệt chéo bất thường, thì cũng đáng để xem xét.
(Rất đại khái, thư viện là một bộ công cụ được thiết kế cho một nhiệm vụ cụ thể, trong khi một khung thường chứa nhiều thư viện và thực hiện một bộ nhiệm vụ hoàn chỉnh.)
Các ví dụ ở trên đã được sao chép bên dưới bằng jQuery , có lẽ là thư viện JavaScript được sử dụng phổ biến nhất (mặc dù cũng có những thứ khác đáng để nghiên cứu).
(Lưu ý rằng $
đây là đối tượng jQuery.)
Thay đổi các lớp với jQuery:
$('#MyElement').addClass('MyClass');
$('#MyElement').removeClass('MyClass');
if ( $('#MyElement').hasClass('MyClass') )
Ngoài ra, jQuery cung cấp một lối tắt để thêm một lớp nếu nó không áp dụng hoặc xóa một lớp có:
$('#MyElement').toggleClass('MyClass');
Gán một hàm cho một sự kiện nhấp chuột với jQuery:
$('#MyElement').click(changeClass);
hoặc, không cần id:
$(':button:contains(My Button)').click(changeClass);