javascript - لديك - مميزات الجافا سكريبت




HTML5 لا يمكن تشغيل الصوت من خلال جافا سكريبت إلا إذا تم تشغيله يدويا مرة واحدة (7)

التقيت نفس المشكلة في بلدي التطبيق. كان سيناريو استخدام التطبيق مثل هذا:

  1. انقر على الزر لعرض جدول يحتوي على معلومات (إجراء المستخدم)
  2. عرض الجدول وتحديث البيانات في ذلك من قبل أجاكس
  3. تشغيل الصوت عند تغيير البيانات

لحسن الحظ كان لي عمل المستخدم (الخطوة 1) لذلك كنت قادرا على "بدء" الصوت من قبل ومن ثم تشغيله من قبل جافاسكريبت دون إجراء المستخدم المطلوبة. انظر الرمز.

HTML

<audio id="kohoutAudio">
    <source src="views/images/kohout.mp3">
</audio>

<button id="btnShow">Show table</button>

جافا سكريبت

$("#btnShow").click(function () {
    //some code to show the table
    //initialize the sound
    document.getElementById('kohoutAudio').play();
    document.getElementById('kohoutAudio').pause();
});

function announceChange(){
    document.getElementById('kohoutAudio').play();
};

أحاول الحصول على ملف صوتي صغير لتشغيله تلقائيا باستخدام علامة وجافاسكريبت لبدء تشغيله.

<audio id="denied" preload="auto" controls="false">
    <source src="sound/denied.wav" />
 </audio>

ومن ثم من خلال جافاسكريبت، في الوقت المناسب:

$('#denied')[0].play()

يعمل بشكل جيد على كروم على سطح المكتب. في الروبوت 4.1.1، لن يتم تشغيل الصوت، إلا إذا ضرب "اللعب" على عناصر التحكم في الصوت HTML5 قبل جافا سكريبت يحاول تشغيله.

لذلك أساسا متصفح أندرويد (الأسهم أو دولفين) لن تلعب الصوت إلا إذا كان المستخدم يبدأ ذلك في مرحلة ما قبل جافا سكريبت. هل هذا المقصود؟ هل هناك أي طريقة للتغلب على هذه؟


المشكلة الرئيسية هي أن الصوت (على دائرة الرقابة الداخلية والروبوت) يجب أن يتم تشغيلها من قبل نقرة المستخدم. كان الحل البديل بسيط جدا. التعادل و audio.play () إلى مستمع الحدث النقر ثم وقفة على الفور ذلك. من تلك النقطة وعلى الصوت يعمل الكمال.

var myAudio = new Audio('assets/myAudio.mp3');
...
button.addEventListener("click", function() {
    myAudio.play();
    myAudio.pause();
    ...
});

حسنا، لأغراضي، وهنا ما فعلته:

لحسن الحظ، قبل المستخدم يمكن أن تؤدي إلى سلوك لبدء الصوت، لديهم للنقر على زر. أنا تعيين حجم العنصر إلى 0.0، ويكون ذلك "اللعب" عند النقر على هذا الزر.

بعد تشغيل الصوت بصمت، أنا ببساطة تعيين خاصية وحدة التخزين إلى 1.0، وأنه يلعب دون تدخل المستخدم على ما يرام.


في حالتي كان هذا حلا سهلا:
https://.com/a/28011906/4622767
انسخ هذا والصقه في كروم:

chrome://flags/#disable-gesture-requirement-for-media-playback

بلدي التطبيق على شبكة الإنترنت لديها العديد من تحميل الصفحة حتى لا أستطيع فرض المستخدم للضغط على زر في كل مرة. ولكن للاستخدام الداخلي، لذلك أنا يمكن أن تجبر المستخدمين على استخدام الكروم وتكوين هذا الخيار.


لحسن الحظ بالنسبة لي التطبيق html5 أنا أعمل على يحتاج فقط للعمل في الروبوت 4.1، ولكن إذا كنت تحاول أن تجعل شيئا عبر منصة ستحتاج إلى التكيف مع هذا قليلا. لم الإعداد أي حجم إلى 0.0 ثم مرة أخرى أو التشغيل التلقائي على السيطرة عملت بالنسبة لي. أنا أيضا حاول صامتة والتي لم تنجح أيضا. ثم فكرت، ماذا لو قمت بتعيين مدة واللعب فقط كمية ضئيلة من الملف؟ في ما يلي نص برمجي آخر تم الاستيلاء عليه -

function myAjaxFunction() {
  clearTimeout(rstTimer); //timer that resets the page to defaults
  var snd=document.getElementById('snd');
  snd.currentTime=snd.duration-.01; //set seek position of audio near end
  snd.play(); //play the last bit of the audio file
  snd.load(); //reload file
  document.getElementById('myDisplay').innerHTML=defaultDisplay;
  var AJAX=new XMLHttpRequest(); //won't work in old versions of IE
  sendValue=document.getElementById('myInput').value;
  AJAX.open('GET', encodeURI('action.php?val='+sendValue+'&fn=find'), true);
  AJAX.send();
  AJAX.onreadystatechange=function() {
    if (AJAX.readyState==4 && AJAX.status==200) {
      document.getElementById('myDisplay').innerHTML=AJAX.responseText;
      if (document.getElementById('err')) { //php returns <div id="err"> if fail
        rstTimer = setTimeout('reset()', 5000); //due to error reset page in 5 seconds
        snd.play(); //play error sound
        document.getElementById('myInput').value=''; //clear the input
      }
    }
  }
}

هذا ما حدث معي أيضا. وإليك كيفية اختراق هذا:

أنا تعيين الصوت إلى autoplay وتعيين المجلد إلى 0 . عندما كنت في حاجة إليها للعب، وأنا استخدم طريقة load() وأنه سيتم التشغيل التلقائي. انها ملف mp3 الخفيفة وأنه يلعب كل ساعة واحدة / ساعتين، لذلك هذا يعمل بشكل جيد بالنسبة لي.


وأنا أعلم أنه في سفاري المحمول أي مكالمة جافاسكريبت للعب () يجب أن تكون في نفس المكدس كحدث المستخدم انقر فوق الحدث. سوف خداع النقر مع الزناد جافا سكريبت لا تعمل إما.

على بلدي العلاقة 7 أستطيع أن أؤكد أنه ما لم يتم تشغيل جافا سكريبت من قبل نقرة المستخدم، فإنه لا يلعب.





html5-audio