JavaScript

JavaScript มีบทบาทสำคัญในเกือบทุกอย่างที่เราสร้าง ตั้งแต่คอมโพเนนต์แบบไดนามิกขนาดเล็กไปจนถึงผลิตภัณฑ์เต็มรูปแบบที่ทำงานบนเฟรมเวิร์ก JavaScript เช่น React หรือ Angular

การใช้ (หรือการใช้มากเกินไป) JavaScript นี้ทำให้เกิดแนวโน้มที่น่าตกใจหลายอย่าง เช่น เวลาในการโหลดนานเนื่องจากมีโค้ดจำนวนมาก การใช้องค์ประกอบ HTML ที่ไม่มีความหมาย และการแทรก HTML และ CSS ผ่าน JavaScript และคุณอาจไม่แน่ใจว่าการช่วยเหลือพิเศษจะเข้ากับแต่ละส่วนเหล่านี้ได้อย่างไร

JavaScript อาจส่งผลกระทบอย่างมากต่อการช่วยเหลือพิเศษของเว็บไซต์ ในโมดูลนี้ เราจะแชร์รูปแบบทั่วไปบางอย่างสำหรับการช่วยเหลือพิเศษที่ได้รับการปรับปรุงด้วย JavaScript รวมถึงโซลูชันสำหรับปัญหาการช่วยเหลือพิเศษที่เกิดจากการใช้เฟรมเวิร์ก JavaScript

เหตุการณ์ทริกเกอร์

เหตุการณ์ JavaScript ช่วยให้ผู้ใช้โต้ตอบกับเนื้อหาเว็บและดำเนินการ ที่เฉพาะเจาะจงได้ ผู้ใช้จำนวนมาก เช่น ผู้ใช้โปรแกรมอ่านหน้าจอ ผู้ที่มีความบกพร่องด้านทักษะการเคลื่อนไหวเล็กๆ ผู้ที่ไม่มีเมาส์หรือแทร็กแพด และอื่นๆ ต้องอาศัยการรองรับแป้นพิมพ์เพื่อโต้ตอบกับเว็บ คุณต้องเพิ่มการรองรับแป้นพิมพ์ลงในการดำเนินการ JavaScript เนื่องจากจะส่งผลต่อผู้ใช้ทั้งหมดนี้

มาดูกิจกรรมการคลิกกัน หากใช้เหตุการณ์ onClick() ในองค์ประกอบ HTML ที่สื่อความหมาย เช่น <button> หรือ <a> ระบบจะรวมฟังก์ชันการทำงานของทั้งเมาส์และแป้นพิมพ์โดยอัตโนมัติ อย่างไรก็ตาม ระบบจะไม่ใช้ฟังก์ชันการทำงานของแป้นพิมพ์โดยอัตโนมัติเมื่อมีการเพิ่มonClick()เหตุการณ์ ลงในองค์ประกอบที่ไม่มีความหมาย เช่น <div>ทั่วไป

ไม่ควรทำ
<div role="button" tabindex="0" onclick="doAction()">Click me!</div>
ควรทำ
<button onclick="doAction()">Click me!</button>

ดูตัวอย่างการเปรียบเทียบนี้ใน CodePen

หากใช้องค์ประกอบที่ไม่ใช่เชิงความหมายสำหรับเหตุการณ์ทริกเกอร์ จะต้องเพิ่มเหตุการณ์ keydown/keyup เพื่อตรวจหาการกดปุ่ม Enter หรือ Space มักจะลืมเพิ่มเหตุการณ์ทริกเกอร์ไปยังองค์ประกอบที่ไม่ใช่เชิงความหมาย แต่หากลืมใส่ไป ผลลัพธ์ที่ได้คือคอมโพเนนต์ที่เข้าถึงได้ด้วยเมาส์เท่านั้น ผู้ใช้ที่ใช้แป้นพิมพ์เท่านั้น จะไม่มีสิทธิ์เข้าถึงการดำเนินการที่เกี่ยวข้อง

ชื่อหน้าเว็บ

ดังที่เราได้เรียนรู้ในโมดูลเอกสาร ชื่อหน้าเว็บเป็นสิ่งจำเป็นสำหรับผู้ใช้โปรแกรมอ่านหน้าจอ ซึ่งจะบอกผู้ใช้ว่าขณะนี้ผู้ใช้อยู่ที่หน้าใด และผู้ใช้ได้ไปยังหน้าใหม่หรือไม่

หากใช้เฟรมเวิร์ก JavaScript คุณต้องพิจารณาวิธีจัดการชื่อหน้าเว็บ ซึ่งมีความสำคัญอย่างยิ่งสำหรับแอปหน้าเว็บเดียว (SPA) ที่โหลดจากไฟล์ index.html ไฟล์เดียว เนื่องจากทรานซิชันหรือเส้นทาง (การเปลี่ยนหน้า) ไม่ได้เกี่ยวข้องกับการโหลดหน้าเว็บซ้ำ ทุกครั้งที่ผู้ใช้โหลดหน้าใหม่ใน SPA ชื่อจะไม่เปลี่ยนแปลงโดยค่าเริ่มต้น

สำหรับ SPA คุณสามารถเพิ่มค่า document.title ได้ด้วยตนเองหรือใช้แพ็กเกจตัวช่วย (ขึ้นอยู่กับ เฟรมเวิร์ก JavaScript) การประกาศชื่อหน้าเว็บที่อัปเดตแล้ว ต่อผู้ใช้โปรแกรมอ่านหน้าจออาจต้องใช้ความพยายามเพิ่มเติม แต่ข่าวดีคือคุณมีตัวเลือก เช่น เนื้อหาแบบไดนามิก

เนื้อหาแบบไดนามิก

ความสามารถของ JavaScript ที่ทรงพลังที่สุดอย่างหนึ่งคือความสามารถในการเพิ่ม HTML และ CSS ลงในองค์ประกอบใดก็ได้ในหน้าเว็บ นักพัฒนาแอปสามารถสร้างแอปพลิเคชันแบบไดนามิก ตามการกระทําหรือพฤติกรรมของผู้ใช้

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

คุณใช้องค์ประกอบ innerHTML เพื่อตั้งค่าเนื้อหาได้โดยทำดังนี้

document.querySelector("#banner").innerHTML = '<p>You are now signed in</p>';

คุณสามารถใช้ CSS ในลักษณะเดียวกันได้โดยใช้ setAttribute ดังนี้

document.querySelector("#banner").setAttribute("style", "border-color:#0000ff;");

อำนาจที่ยิ่งใหญ่มาพร้อมกับความรับผิดชอบอันใหญ่ยิ่ง น่าเสียดายที่การแทรก HTML และ CSS ด้วย JavaScript ถูกนำไปใช้ในทางที่ผิดเพื่อสร้างเนื้อหาที่เข้าถึงไม่ได้ ตัวอย่างการใช้งานที่ไม่เหมาะสมที่พบบ่อยมีดังนี้

การใช้ในทางที่ผิดที่อาจเกิดขึ้น การใช้งานที่ถูกต้อง
แสดงผล HTML ที่ไม่มีความหมายเป็นจำนวนมาก แสดงผล HTML เชิงความหมายชิ้นเล็กๆ
ไม่อนุญาตให้เทคโนโลยีความช่วยเหลือพิเศษรับรู้เนื้อหาแบบไดนามิก ใช้การหน่วงเวลา setTimeout() เพื่อให้ผู้ใช้ได้ยินข้อความทั้งหมด
ใช้แอตทริบิวต์รูปแบบสำหรับ onFocus() แบบไดนามิก ใช้ :focus กับองค์ประกอบที่เกี่ยวข้องในสไตล์ชีต CSS
การใช้สไตล์อินไลน์อาจทำให้ระบบอ่านสไตล์ชีตของผู้ใช้ไม่ถูกต้อง เก็บสไตล์ไว้ในไฟล์ CSS เพื่อให้ธีมมีความสอดคล้องกัน
การสร้างไฟล์ JavaScript ขนาดใหญ่มากซึ่งทำให้ประสิทธิภาพโดยรวมของเว็บไซต์ช้าลง ใช้ JavaScript ให้น้อยลง คุณอาจใช้ฟังก์ชันที่คล้ายกันใน CSS ได้ (เช่น ภาพเคลื่อนไหวหรือการนำทางแบบติดหนึบ) ซึ่งจะแยกวิเคราะห์ได้เร็วกว่าและมีประสิทธิภาพมากกว่า

สำหรับ CSS ให้สลับคลาส CSS แทนการเพิ่มรูปแบบอินไลน์ เนื่องจากวิธีนี้ ช่วยให้สามารถนำกลับมาใช้ใหม่และใช้งานได้ง่าย ใช้เนื้อหาที่ซ่อนไว้ในหน้าและ สลับคลาสเพื่อซ่อนและแสดงเนื้อหาสำหรับ HTML แบบไดนามิก หากต้องการใช้ JavaScript เพื่อเพิ่มเนื้อหาแบบไดนามิกลงในหน้าเว็บ โปรดตรวจสอบว่าเนื้อหานั้นเรียบง่าย กระชับ และเข้าถึงได้

การจัดการโฟกัส

ในโมดูลโฟกัสแป้นพิมพ์ เราได้กล่าวถึงลำดับโฟกัสและรูปแบบตัวบ่งชี้ การจัดการโฟกัสคือการรู้ว่าควรล็อกโฟกัสเมื่อใดและที่ใด และเมื่อใดที่ไม่ควรล็อก

การจัดการโฟกัสเป็นสิ่งสำคัญสำหรับผู้ใช้ที่ใช้แป้นพิมพ์เท่านั้น

ระดับคอมโพเนนต์

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

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

ไม่ควรทำ
ควรทำ

ระดับหน้าเว็บ

นอกจากนี้ ต้องคงโฟกัสไว้เมื่อผู้ใช้ไปยังหน้าหนึ่งๆ โดยเฉพาะอย่างยิ่งใน SPA ซึ่งไม่มีการรีเฟรชเบราว์เซอร์และเนื้อหาทั้งหมดจะเปลี่ยนแปลงแบบไดนามิก ทุกครั้งที่ผู้ใช้คลิกลิงก์เพื่อไปยังหน้าอื่นภายในแอปพลิเคชัน โฟกัสจะยังคงอยู่ที่เดิมหรืออาจย้ายไปอยู่ที่อื่นโดยสิ้นเชิง

เมื่อเปลี่ยนจากหน้าหนึ่งไปยังอีกหน้าหนึ่ง (หรือการกำหนดเส้นทาง) ทีมพัฒนาต้องตัดสินใจ ว่าจะให้โฟกัสไปที่ใดเมื่อหน้าเว็บโหลด

ซึ่งทำได้หลายวิธีดังนี้

  • โฟกัสที่คอนเทนเนอร์หลักด้วยaria-liveประกาศ
  • เลื่อนโฟกัสกลับไปที่ลิงก์เพื่อข้ามไปยังเนื้อหาหลัก
  • ย้ายโฟกัสไปยังส่วนหัวระดับบนสุดของหน้าใหม่

ตำแหน่งที่คุณตัดสินใจจะเน้นจะขึ้นอยู่กับเฟรมเวิร์กที่คุณใช้ และเนื้อหาที่คุณต้องการแสดงต่อผู้ใช้ อาจขึ้นอยู่กับบริบทหรือการดำเนินการ

การจัดการสถานะ

อีกส่วนหนึ่งที่ JavaScript มีความสําคัญต่อการช่วยเหลือพิเศษคือการจัดการสถานะ หรือเมื่อมีการส่งต่อสถานะภาพปัจจุบันของคอมโพเนนต์หรือหน้าเว็บไปยังผู้ใช้เทคโนโลยีความช่วยเหลือพิเศษสำหรับผู้ที่มีสายตาเลือนราง ตาบอด หรือหูหนวกตาบอด

โดยทั่วไปแล้ว ระบบจะจัดการสถานะของคอมโพเนนต์หรือหน้าเว็บผ่านแอตทริบิวต์ ARIA ดังที่ได้แนะนำไว้ในโมดูล ARIA และ HTML มาดูแอตทริบิวต์ ARIA ประเภทที่ใช้กันมากที่สุด 2-3 ประเภทเพื่อช่วย จัดการสถานะขององค์ประกอบกัน

ระดับคอมโพเนนต์

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

เช่น คุณอาจใช้แอตทริบิวต์ aria-expanded เพื่อบอกผู้ใช้ว่าเมนูแบบเลื่อนลงหรือรายการขยายหรือ ยุบอยู่

หรืออาจใช้ aria-pressed เพื่อระบุว่ามีการกดปุ่ม

คุณควรเลือกใช้แอตทริบิวต์ ARIA อย่างระมัดระวัง พิจารณา โฟลว์ของผู้ใช้เพื่อทำความเข้าใจว่าควรสื่อสารข้อมูลสำคัญใดแก่ผู้ใช้

ระดับหน้าเว็บ

นักพัฒนาซอฟต์แวร์มักใช้พื้นที่ที่ซ่อนไว้ด้วยภาพที่เรียกว่าขอบเขตแบบสดของ ARIA เพื่อประกาศการเปลี่ยนแปลงบนหน้าจอและข้อความแจ้งเตือนแก่ผู้ใช้เทคโนโลยีความช่วยเหลือพิเศษ (AT) คุณสามารถใช้พื้นที่นี้ร่วมกับ JavaScript เพื่อแจ้งให้ผู้ใช้ทราบถึงการเปลี่ยนแปลงแบบไดนามิกในหน้าเว็บโดยไม่ต้องโหลดหน้าเว็บทั้งหมดซ้ำ

ในอดีต JavaScript มีปัญหาในการประกาศเนื้อหาใน aria-live และภูมิภาคการแจ้งเตือนเนื่องจากลักษณะที่เป็นไดนามิก การเพิ่มเนื้อหาลงใน DOM แบบไม่พร้อมกันทำให้ AT เลือกภูมิภาคและประกาศได้ยาก หากต้องการให้ระบบอ่านเนื้อหาได้อย่างถูกต้อง ภูมิภาคที่แสดงสดหรือการแจ้งเตือนต้องอยู่ใน DOM เมื่อโหลด จากนั้นจึงจะสลับข้อความแบบไดนามิกได้

หากคุณใช้เฟรมเวิร์ก JavaScript ข่าวดีคือเฟรมเวิร์กเกือบทั้งหมดมีแพ็กเกจ "โปรแกรมประกาศแบบสด" ที่จะทำงานทั้งหมดให้คุณและเข้าถึงได้อย่างเต็มที่ คุณไม่ต้องกังวลเรื่องการสร้างขอบเขตแบบสดและจัดการกับปัญหาที่อธิบายไว้ในส่วนก่อนหน้า

ต่อไปนี้คือแพ็กเกจไลฟ์สดสำหรับเฟรมเวิร์ก JavaScript ที่ใช้กันโดยทั่วไป

JavaScript สมัยใหม่เป็นภาษาที่มีประสิทธิภาพซึ่งช่วยให้นักพัฒนาเว็บสร้างเว็บแอปพลิเคชันที่แข็งแกร่งได้ ซึ่งบางครั้งอาจทำให้เกิดการออกแบบที่ซับซ้อนเกินไปและส่งผลให้รูปแบบต่างๆ เข้าถึงไม่ได้ การทำตามรูปแบบและเคล็ดลับ JavaScript ในโมดูลนี้จะช่วยให้แอปของคุณเข้าถึงได้มากขึ้นสำหรับผู้ใช้ทุกคน