兼容微信的移動(dòng)端自動(dòng)播放音樂(lè)方案

大多數(shù)瀏覽器都禁用了自動(dòng)播放音樂(lè)的功能,因?yàn)檫@可能會(huì)帶來(lái)不好的用戶體驗(yàn)以及更多的電池消耗。因此下面的代碼是無(wú)法正常工作的:

<audio autoplay="autoplay">
  <source src="./music.mp3" type="audio/mpeg" />
  Your browser does not support the audio element.
</audio>

此外,企圖使用 audio 元素的 play 方法自動(dòng)播放音樂(lè),也是被禁止的:

const src = "./music.mp3";
const audio = new Audio();
audio.src = src;
audio.preload = "auto"
audio.play();

在 Chrome 中,上面的代碼會(huì)拋出一個(gè)異常:

Uncaught (in promise) DOMException

對(duì)于音樂(lè)自動(dòng)播放的解決方案,主要有兩大類:

  1. 使用 iframe
  2. 借助事件

第一種方案通過(guò)借助 iframe 來(lái)進(jìn)行音樂(lè)的自動(dòng)播放,但我沒(méi)有測(cè)試效果如何,可以參考這里。
借助事件的方案很簡(jiǎn)單,就是監(jiān)聽(tīng)觸摸事件,當(dāng)?shù)谝淮斡|摸發(fā)生后就播放音樂(lè),這樣就可以繞過(guò)瀏覽器的檢測(cè)。但缺點(diǎn)是如果用戶打開(kāi)網(wǎng)站后一直不觸摸屏幕,是不會(huì)自動(dòng)播放音樂(lè)的。不過(guò)這樣的例外很少,絕大多數(shù)用戶打開(kāi)頁(yè)面后都會(huì)發(fā)生觸摸動(dòng)作的,是個(gè)很好的解決方案。如果要追求百分之百自動(dòng)播放,不妨試試上面的 iframe 方案。

function autoPlay(src) {
  const audio = new Audio();
  // 該元素用來(lái)在頁(yè)面上控制音樂(lè)的播放和暫停
  const musicEle = document.querySelector("#music")
  audio.src = src;
  audio.preload = "auto"
  let played = false;

  // 第一次觸摸結(jié)束后開(kāi)始播放音樂(lè)
  document.addEventListener("touchend", () => {
    if (played) return;
    if (audio.paused) {
      played = true;
      audio.play();
    }
  })

  // 控制音樂(lè)的播放和暫停
  musicEle.addEventListener("click", function () {
    if (audio.paused) {
      this.className = "on";
      audio.play();
    } else {
      this.className = "off"
      audio.pause();
    }
  })
}
autoPlay("./music.mp3");

但這個(gè)方案在微信中不太好用,在我的手機(jī)上測(cè)試的時(shí)候,使用微信打開(kāi)頁(yè)面并觸摸不會(huì)自動(dòng)播放音樂(lè)(IOS 12.1.2,微信版本 6.7.4),因此存在一些兼容性問(wèn)題。
對(duì)于微信,可以通過(guò) WeixinJSBridge 對(duì)象來(lái)實(shí)現(xiàn)這個(gè)功能,微信自帶的瀏覽器提供了一個(gè) WeixinJSBridge 內(nèi)建對(duì)象,借助這個(gè)對(duì)象實(shí)現(xiàn)音樂(lè)自動(dòng)播放:

function autoPlay(src) {
  const audio = new Audio();
  // 該元素用來(lái)在頁(yè)面上控制音樂(lè)的播放和暫停
  const musicEle = document.querySelector("#music")
  audio.src = src;
  audio.preload = "auto"
  let played = false;

  // 第一次觸摸結(jié)束后開(kāi)始播放音樂(lè)
  document.addEventListener("touchend", () => {
    if (played) return;
    if (audio.paused) {
      played = true;
      audio.play();
    }
  })

  // 兼容微信
  if (window.WeixinJSBridge) {
    WeixinJSBridge.invoke("getNetworkType", {}, function (e) {
      played = true;
      audio.play();
    }, false);
  } else {
    document.addEventListener("WeixinJSBridgeReady", function () {
      WeixinJSBridge.invoke("getNetworkType", {}, function (e) {
        played = true;
        audio.play();
      });
    }, false);
  }

  // 控制音樂(lè)的播放和暫停
  musicEle.addEventListener("click", function () {
    if (audio.paused) {
      this.className = "on";
      audio.play();
    } else {
      this.className = "off"
      audio.pause();
    }
  })
}
autoPlay("./music.mp3");

以上就是在移動(dòng)端自動(dòng)播放音樂(lè),同時(shí)兼容微信瀏覽器的方案。

完。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 姓名:鄧平云 深圳蔚藍(lán)時(shí)代商業(yè)管理有限公司南京分公司 【日精進(jìn)打卡第169天】 【知~學(xué)習(xí)】 《六項(xiàng)精進(jìn)大綱 》1...
    鄧平云閱讀 138評(píng)論 0 0
  • 9月,是開(kāi)學(xué)季 9月,是豐收節(jié) 9月10日,是一年一度的教師節(jié) 【教師節(jié)文案】 尺長(zhǎng)教鞭,督促學(xué)生,順利成長(zhǎng); 滿...
    Nanana_liu閱讀 880評(píng)論 0 0
  • 一、導(dǎo)語(yǔ): 大家好,我是王金金,簡(jiǎn)書(shū)昵稱斷斷Echo,愛(ài)讀書(shū)愛(ài)電影愛(ài)音樂(lè),很開(kāi)心在這里和大家相遇。大家如果能夠聽(tīng)到...
    愛(ài)讀書(shū)的斷斷閱讀 1,834評(píng)論 3 11
  • 01 人生的軌跡,有時(shí)候同出一轍的相似,但有的人走著走著就與成功擦肩而過(guò),但有的人走著走著就成為人生的贏家。 小時(shí)...
    紅棗饅頭閱讀 778評(píng)論 2 6

友情鏈接更多精彩內(nèi)容