เทคนิค HTML5 ที่ทันสมัยสำหรับการเปลี่ยนคลาส
เบราว์เซอร์สมัยใหม่ได้เพิ่มclassListซึ่งให้วิธีการเพื่อให้จัดการกับคลาสได้ง่ายขึ้นโดยไม่ต้องใช้ไลบรารี:
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');
น่าเสียดายที่สิ่งเหล่านี้ไม่สามารถใช้งานได้ใน Internet Explorer ก่อนหน้า v10 แม้ว่าจะมีshim ที่จะเพิ่มการรองรับให้กับ IE8 และ IE9 ที่มีอยู่ในหน้านี้ มันเป็น แต่ได้รับมากขึ้นและได้รับการสนับสนุน
โซลูชันข้ามเบราว์เซอร์ที่เรียบง่าย
วิธีจาวาสคริปต์มาตรฐานในการเลือกองค์ประกอบที่ใช้document.getElementById("Id")
ซึ่งเป็นตัวอย่างต่อไปนี้ที่ใช้ - แน่นอนว่าคุณสามารถรับองค์ประกอบในรูปแบบอื่นและในสถานการณ์ที่ถูกต้องอาจใช้this
แทนได้ - อย่างไรก็ตามจะมีรายละเอียดที่เกินขอบเขต ของคำตอบ
ในการเปลี่ยนคลาสทั้งหมดสำหรับองค์ประกอบให้ทำดังนี้
หากต้องการแทนที่คลาสที่มีอยู่ทั้งหมดด้วยคลาสใหม่หนึ่งคลาสขึ้นไปให้ตั้งค่าแอตทริบิวต์ className:
document.getElementById("MyElement").className = "MyClass";
(คุณสามารถใช้รายการที่คั่นด้วยช่องว่างเพื่อใช้หลายคลาสได้)
ในการเพิ่มคลาสเพิ่มเติมให้กับองค์ประกอบให้ทำดังนี้
ในการเพิ่มคลาสให้กับองค์ประกอบโดยไม่ต้องลบ / ส่งผลกระทบต่อค่าที่มีอยู่ให้ผนวกช่องว่างและชื่อคลาสใหม่ดังนี้:
document.getElementById("MyElement").className += " MyClass";
ในการลบคลาสออกจากองค์ประกอบให้ทำดังนี้
ในการลบคลาสเดียวออกจากองค์ประกอบโดยไม่กระทบต่อคลาสที่มีศักยภาพอื่น ๆ จำเป็นต้องมีการแทนที่ regex อย่างง่าย:
document.getElementById("MyElement").className =
document.getElementById("MyElement").className.replace
( /(?:^|\s)MyClass(?!\S)/g , '' )
/* Code wrapped for readability - above is all one statement */
คำอธิบายของ regex นี้มีดังนี้:
(?:^|\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)
g
ธงบอกแทนที่ที่จะทำซ้ำตามความจำเป็นในกรณีที่ชื่อชั้นได้รับการเพิ่มหลายครั้ง
วิธีตรวจสอบว่ามีการใช้คลาสกับองค์ประกอบหรือไม่:
regex เดียวกับที่ใช้ด้านบนสำหรับการลบคลาสยังสามารถใช้เป็นการตรวจสอบว่ามีคลาสเฉพาะอยู่หรือไม่:
if ( document.getElementById("MyElement").className.match(/(?:^|\s)MyClass(?!\S)/) )
การกำหนดการกระทำเหล่านี้ให้กับเหตุการณ์ onclick:
ในขณะที่เป็นไปได้ที่จะเขียน JavaScript โดยตรงภายในแอตทริบิวต์เหตุการณ์ HTML (เช่นonclick="this.className+=' MyClass'"
) สิ่งนี้ไม่แนะนำให้ใช้ โดยเฉพาะอย่างยิ่งในแอปพลิเคชันขนาดใหญ่รหัสที่สามารถบำรุงรักษาได้มากขึ้นก็คือการแยกมาร์กอัพ HTML ออกจากตรรกะการโต้ตอบ JavaScript
ขั้นตอนแรกในการบรรลุเป้าหมายนี้คือการสร้างฟังก์ชันและเรียกใช้ฟังก์ชันในแอตทริบิวต์ onclick เช่น:
<script type="text/javascript">
function changeClass(){
// Code examples from above
}
</script>
...
<button onclick="changeClass()">My Button</button>
(ไม่จำเป็นต้องมีรหัสนี้ในแท็กสคริปต์นี่เป็นเพียงตัวอย่างสั้น ๆ และรวมถึง JavaScript ในไฟล์ที่แตกต่างกันอาจเหมาะสมกว่า)
ขั้นตอนที่สองคือการย้ายเหตุการณ์ onclick จาก HTML และเป็น JavaScript เช่นใช้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>
(โปรดทราบว่าจำเป็นต้องใช้ส่วน window.onload เพื่อให้เนื้อหาของฟังก์ชั่นนั้นทำงานหลังจาก HTML เสร็จสิ้นการโหลด - หากไม่มีสิ่งนี้ MyElement อาจไม่มีอยู่เมื่อเรียกใช้รหัส JavaScript ดังนั้นบรรทัดนั้นจะล้มเหลว)
เฟรมเวิร์กและไลบรารี JavaScript
โค้ดข้างต้นนั้นอยู่ในจาวาสคริปต์มาตรฐานอย่างไรก็ตามเป็นเรื่องธรรมดาที่จะใช้เฟรมเวิร์กหรือไลบรารีเพื่อทำให้งานทั่วไปง่ายขึ้นรวมถึงได้รับประโยชน์จากบั๊กคงที่และตัวพิมพ์ขอบที่คุณอาจไม่ได้คิดเมื่อเขียนรหัสของคุณ
ในขณะที่บางคนคิดว่ามันเกินความจริงที่จะเพิ่มกรอบงาน ~ 50 KB สำหรับการเปลี่ยนชั้นเรียนถ้าคุณทำงาน JavaScript จำนวนมากหรืออะไรก็ตามที่อาจมีพฤติกรรมข้ามเบราว์เซอร์ที่ผิดปกติ
(คร่าวๆแล้วไลบรารีคือชุดของเครื่องมือที่ออกแบบมาสำหรับงานเฉพาะในขณะที่เฟรมเวิร์กมักมีหลายไลบรารีและทำหน้าที่ครบชุด)
ตัวอย่างข้างต้นได้รับการทำซ้ำด้านล่างโดยใช้jQueryซึ่งอาจเป็นไลบรารี JavaScript ที่ใช้บ่อยที่สุด (แม้ว่าจะมีคนอื่นที่น่าสนใจเช่นกัน)
(โปรดทราบว่า$
นี่คือวัตถุ jQuery)
การเปลี่ยนคลาสด้วย jQuery:
$('#MyElement').addClass('MyClass');
$('#MyElement').removeClass('MyClass');
if ( $('#MyElement').hasClass('MyClass') )
นอกจากนี้ jQuery ยังมีทางลัดสำหรับการเพิ่มคลาสหากไม่ได้ใช้หรือลบคลาสที่ทำ:
$('#MyElement').toggleClass('MyClass');
การกำหนดฟังก์ชันให้กับเหตุการณ์คลิกด้วย jQuery:
$('#MyElement').click(changeClass);
หรือโดยไม่จำเป็นต้องมี ID:
$(':button:contains(My Button)').click(changeClass);