HTMLMediaElement.play() ส่งคืนคำมั่นสัญญา

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

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

ตอนนี้การเรียก play() ในองค์ประกอบ <video> หรือ <audio> จะแสดงผลเป็น Promise หากเล่นสําเร็จ ระบบจะยอมรับ Promise และหากเล่นไม่สําเร็จ ระบบจะปฏิเสธ Promise พร้อมกับแสดงข้อความแสดงข้อผิดพลาดที่อธิบายสาเหตุของความล้มเหลว ซึ่งจะช่วยให้คุณเขียนโค้ดที่ใช้งานง่ายได้ เช่น

var playPromise = document.querySelector('video').play();

// In browsers that don’t yet support this functionality,
// playPromise won’t be defined.
if (playPromise !== undefined) {
    playPromise.then(function() {
    // Automatic playback started!
    }).catch(function(error) {
    // Automatic playback failed.
    // Show a UI element to let the user manually start playback.
    });
}

นอกจากการตรวจหาว่าเมธอด play() ประสบความสําเร็จหรือไม่แล้ว อินเทอร์เฟซแบบ Promise ใหม่ยังช่วยให้คุณระบุได้ว่าเมธอด play() ประสบความสําเร็จเมื่อใด มีบริบทที่เว็บเบราว์เซอร์อาจตัดสินใจที่จะเลื่อนเวลาเริ่มต้นการเล่น เช่น ในเดสก์ท็อป Chrome จะไม่เริ่มเล่น <video> จนกว่าแท็บจะปรากฏขึ้น Promise จะไม่ดำเนินการจนกว่าการเล่นจะเริ่มขึ้นจริง ซึ่งหมายความว่าโค้ดภายใน then() จะไม่ทำงานจนกว่าสื่อจะเล่น วิธีการก่อนหน้านี้ในการระบุว่า play() สำเร็จหรือไม่ เช่น รอเวลาที่กำหนดสำหรับเหตุการณ์ playing และถือว่าไม่สำเร็จหากไม่เกิดเหตุการณ์ดังกล่าว มีโอกาสที่จะได้ผลลัพธ์เป็นลบเท็จในสถานการณ์การเล่นที่ล่าช้า

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

โซนอันตราย

<source> ภายใน <video> ทำให้ play() สัญญาว่าจะไม่ปฏิเสธ

สำหรับ <video src="not-existing-video.mp4"\> สัญญา play() ปฏิเสธตามที่คาดไว้เนื่องจากไม่มีวิดีโอ สำหรับ <video><source src="not-existing-video.mp4" type='video/mp4'></video> สัญญา play() จะปฏิเสธไม่รับ กรณีนี้จะเกิดขึ้นก็ต่อเมื่อไม่มีแหล่งที่มาที่ถูกต้องเท่านั้น

ข้อบกพร่องของ Chromium