audio按需播放的控制问题

280 阅读2分钟
      先交代一下使用场景,页面展示每篇文章的答案的音频解析。 类似于这样,


从而要求点击当前音频其他音频关闭,只播放当前音频。

刚开始,只展示第一篇文章时候可以通过点击当前播放按钮的index值,控制然后播放对应音频的index值。

闲话少说上代码:

 $(document).on("touchstart",".play",function(){ 

//获取当前的 index值从而找到audio播放哪一个

     var index=$(this).parents('li').index(); 

     var audio=document.getElementsByClassName('audio'); 

     for(var i=0;i<audio.length;i++){ 

        audio[i].pause(); 

    } 

    audio[index].play(); 

})

这样的话通过对应的index值能改变img的样式也能控制按需播放。

但是产品哥哥的想法,永远是我等前端切图仔无法理解的。

需要每篇文章都展示出来,那就没法获取对应index值了

改成了这样



就成了这样子的,这是两篇文章,也可能会出现多篇文章,从而就会导致对应的index值是没法获取的,因为这样每篇文章都是遍历出来的所以获取当前的index值去播放对应的音频就会出现问题。音频对象是通过全getElementsByClassName拿到所有的,没发过去当前点击的index,所以这种方法over了。

绞尽脑汁的情况下想到了jquery节点操作转化为DOM对象。

$(document).on("touchstart",".play",function(){
      var audiolist=document.getElementsByClassName('audio');
      for(var i=0;i<audiolist.length;i++){
          audiolist[i].pause();
          console.log("其他的关闭")
      }
    var audio=$(this).siblings('audio')[0];   //重点就只jquery转化为js对象
    audio.play();
    console.log("播放");
})

这样就完美解决了音频按需播放的问题

这里顺便提一下

jquery的$("audio").play(),是不能播放成功的。因为$("audio")这书数据类型是一种类数组形式,而audio.play()必须是DOM对象。所以这边就有一个很基础的问题,jquery对象和DOM对象的转化。

<div></div>  转化成jquery对象直接就是$("div")就成功过。

而$("div")[0]也可以转化为DOM对象;

同时打印上边的两个数据,

console.log($("div"));


从而就知道jquery获取的标签元素是类数组的数据格式

console.log($("div")[0])


正好是这个类数组模式的第一个元素,就是我们熟悉的DOM节点了。

综上所说,又回顾了一下基础的js知识,以及jquery

温故知新从而久远。