You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS音乐播放器使用Google Drive MP3资源队列失效问题求解

问题原因

你将完整的Google Drive资源URL直接作为元素的id和class属性值,URL中包含的:、/、?、&、=等都是CSS选择器的保留特殊字符,直接拼接进querySelector的参数时会触发选择器语法错误,这就是报错的根本原因。

解决方案

最优方案是调整id和class的命名规则,避免使用带特殊字符的URL作为属性值,改用循环索引生成唯一合法标识,修改后的代码如下:

const ulTag = wrapper.querySelector("ul");

for (let i = 0; i < allMusic.length; i++) {
  console.log("traversing array of music at index: " + i);
  // 改用索引生成唯一id和class,避免特殊字符问题
  let liTag = `<li li-index="${i + 1}">
                <div class="row">
                  <span>${allMusic[i].name}</span>
                  <p>${allMusic[i].artist}</p>
                </div>
                <span id="duration-${i}" class="audio-duration">3:40</span>
                <audio class="audio-${i}" src="${allMusic[i].src}"></audio>
              </li>`;
  ulTag.insertAdjacentHTML("beforeend", liTag);

  // 直接匹配索引生成的选择器,无语法问题
  let liAudioDuartionTag = ulTag.querySelector(`#duration-${i}`);
  let liAudioTag = ulTag.querySelector(`.audio-${i}`);
  liAudioTag.addEventListener("loadeddata", ()=>{
    let duration = liAudioTag.duration;
    let totalMin = Math.floor(duration / 60);
    let totalSec = Math.floor(duration % 60);
    if(totalSec < 10){
      totalSec = `0${totalSec}`;
    };
    liAudioDuartionTag.innerText = `${totalMin}:${totalSec}`;
    liAudioDuartionTag.setAttribute("t-duration", `${totalMin}:${totalSec}`);
  });
}

如果你不想修改原有属性命名逻辑,也可以使用属性选择器+引号包裹值的方式兼容处理,仅修改报错行即可:

// 用属性选择器明确匹配id的完整值,特殊字符会被当做普通字符串处理
let liAudioDuartionTag = ulTag.querySelector(`[id="${allMusic[i].src}"]`);
let liAudioTag = ulTag.querySelector(`[class="${allMusic[i].src}"]`);

内容的提问来源于stack exchange,提问作者sad_pug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:06:08