تعرض HTMLMediaElement.play() وعدًا

إنّ تشغيل الصوت والفيديو تلقائيًا على الويب هو ميزة فعّالة، ولكنها تخضع لقيود مختلفة على الأنظمة الأساسية المختلفة. في الوقت الحالي، ستسمح معظم متصفّحات أجهزة الكمبيوتر المكتبي دائمًا لصفحات الويب ببدء <video> أو <audio> التشغيل من خلال JavaScript بدون تفاعل من المستخدم. ومع ذلك، تتطلّب معظم متصفّحات الأجهزة الجوّالة إشارة واضحة من المستخدم قبل أن تتمكّن من بدء التشغيل باستخدام JavaScript. يساعد ذلك في ضمان عدم بدء مستخدمي الأجهزة الجوّالة، الذين يدفعون رسومًا مقابل النطاق الترددي أو قد يكونون في بيئة عامة، في تنزيل الوسائط وتشغيلها بدون تفاعلهم مع الصفحة بشكلٍ صريح.

كان من الصعب في السابق تحديد ما إذا كان تفاعل المستخدم هو المطلوب لبدء التشغيل، ورصد الأعطال التي تحدث عند محاولة التشغيل (التلقائي) وتعذُّر إكماله. تتوفّر عدة حلول بديلة ، ولكنها ليست مثالية. لقد طال انتظارنا لطرح تحسين على الطريقة الأساسية play() لحلّ هذه المشكلة، وقد تم طرحه الآن في منصّة الويب، مع تنفيذ أولي في Chrome 50.

تُرجِع الآن دالة play() على عنصر <video> أو <audio> قيمة 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() ناجحة، تتيح لك الواجهة الجديدة المستندة إلى الوعد معرفة وقت نجاح طريقة play(). هناك سياقات قد يقرر فيها متصفّح الويب تأخير بدء التشغيل، على سبيل المثال، لن يبدأ Chrome تشغيل <video> على أجهزة الكمبيوتر المكتبي إلى أن تصبح علامة التبويب مرئية. لن يتم تنفيذ الوعد إلى أن يبدأ التشغيل فعليًا، ما يعني أنّ الرمز البرمجي داخل then() لن يتم تنفيذه إلى أن يبدأ تشغيل الوسائط. إنّ الطرق السابقة لتحديد ما إذا كان حدث play() ناجحًا، مثل الانتظار لمدّة زمنية محدّدة لحدث playing وافتراض حدوث خطأ في حال عدم تفعيله، تكون عرضة للنتائج السلبية الخاطئة في سيناريوهات التشغيل المتأخر.

لقد نشرنا مثالاً على البث المباشر يوضّح هذه الوظيفة الجديدة. يمكنك عرضها في متصفّح مثل Chrome 50 الذي يتيح استخدام هذه الواجهة المستندة إلى الوعد. يُرجى العِلم أنّ الصفحة ستشغّل الموسيقى تلقائيًا عند زيارتها. (إلا إذا لم يكن الأمر كذلك بالطبع).

منطقة الخطر

<source> في غضون <video> يجعل play() وعدًا لا يرفضه أحد

بالنسبة إلى <video src="not-existing-video.mp4"\>، يتم رفض الوعد play() كما هو متوقّع لعدم توفّر الفيديو. بالنسبة إلى <video><source src="not-existing-video.mp4" type='video/mp4'></video>، لا يتم أبدًا رفض play() promise. ولا يحدث ذلك إلّا في حال عدم توفّر مصادر صالحة.

خطأ في Chromium