Pjax加持APlayer,音乐无间断

原文来自个人小站:Pjax加持APlayer,音乐无间断,转载请备注

起因

下午在 @樱花庄的白猫 博客中看到左下角有个小小的音乐播放器,新奇的东西 F12 上,瞅一下名字:aplayer,啥?!谷哥度娘走起

首条记录上就出现了 APlayer 的官方网站,这么简单嘛?!只要有文档,一切都好说嘛。跟着导航找找找,是你了!吸附底边的播放样式:

aplayer1

APlayer 可以通过吸底模式固定在页面底部

APlayer播放器

官方对它的介绍:

🍭 Wow, such a beautiful HTML5 music player

确实挺好看的,支持各种样式,本破小站只要有个简单的左下角 “吸底模式” 就好,代码引用也简单,保姆式文档上就贴了:

首先,div容器,样式和核心jio本(文档有给出 jsdelivr 的 CDN 链接)

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aplayer@1.10.0/dist/APlayer.min.css">  
<script src="https://cdn.jsdelivr.net/npm/aplayer@1.10.0/dist/APlayer.min.js"></script>  
<div id="aplayer"></div>

然后进行初始化

const ap = new APlayer({
    container: document.getElementById('player'),
    fixed: true,
    audio: [{
        name: 'name',
        artist: 'artist',
        url: 'url.mp3',
        cover: 'cover.jpg',
    }]
});

好了,加上MP3的外链,愉快的听歌吧~~🎵🎶(别说你获取不到MP3外链,那就赶紧去拜托谷哥度娘吧)

aplayer2





你以为文章就到此结束了吗?额...在下也希望是这样,码字可是很痛苦的

⬇️
⬇️
⬇️



神器 Pjax

Pjax 又是啥?别急,听在下说说新的麻烦:

沉浸中欢乐的歌声中,随便点了一个页内跳转,网页开始刷新,但是!但是!但是!音乐播放器也跟着刷新了,从头开始播放?!Excuse Me?这也太傻了吧...

转念细想,其实按上面的教程,是在每个 html 页面上都加上了 APlayer 的加载代码,页面刷新的时候,上个页面自然的就被替换成了新的页面,APlayer 就相当于重新加载了一次。所以,讲道理,这段代码应该只用加载一次,并且不能随着网页跳转而改变,就像被我埋没多年的 QQ 空间那样(每次翻看太多黑历史了,但音乐播放器是优秀的)。

网上有人说可以用框架做,就是一个框架中嵌入 APlayer,另一个用于页面跳转;也有人说用 Pjax,它可以做到无刷新 ajax 加载。考虑再三(也就几秒钟),肯定抛弃前者这种过时的方法,积极拥抱 jQuery-Pjax

pjax = pushState + ajax 的缩写,它通过 ajax 和 pushState 技术提供了极速的(无刷新 ajax 加载)浏览体验,并且保持了真实的地址、网页标题,浏览器的后退(前进)按钮也可以正常使用。pjax 的工作原理是通过 ajax 从服务器端获取 HTML,在页面中用获取到的 HTML 替换指定容器元素中的内容。然后使用 pushState 技术更新浏览器地址栏中的当前地址。

以下两点原因决定了 pjax 会有更快的浏览体验:

  • 不存在页面资源(js/css)的重复加载和应用;
  • 如果服务器端配置了 pjax,它可以只渲染页面局部内容,从而避免服务器渲染完整布局的额外开销。

下面介绍下常用操作:

  1. 引入 jQuery-Pjax 脚本

    <script src="https://cdn.bootcss.com/jquery.pjax/2.0.1/jquery.pjax.min.js"></script>
    
  2. 在 HTML 中准备替换的内容用 div 包裹起来,id自定义,类似如下

    <body>
        ...
        <div id="pageContent">
            <!--include content.html-->
        </div>
        <div id="aplayerContent">
            <!--include aplayer.html-->
        </div>
        ...
    </body>
    

    #pageContent 里面是本破小站的主要容器,而 #aplayerContent 里面就是 Aplayer 的核心内容了

  3. 接管网站所有 a 标签跳转,注意我们这里不需要后台的话,记得一定要添加 fragment 指定为 pjax 容器。

    $(document).pjax('a[target!=_blank]', '#pageContent', {fragment: '#pageContent'});
    

通过这种方式可以让页面中所有的链接都实现了 Pjax 加载,并指定 #pageContent 作为容器元素。如此,页内不管怎么跳转都只是刷新了 #pageContent 容器,而不会影响到 Aplayer 的音乐播放啦。

好了,再次愉快的听歌和尽情的刷网页浏览吧~~~🎵🎶





然而......还没完

⬇️
⬇️
⬇️



深思

其实这种改变整个网站跳转模式的做法,站在程序的角度上,无疑是底层的大改,会触动很多东西,牵一发而动全身,是很抵触的。

但若非如此,Aplayer 的播放问题得不到解决,不管用哪种方式去实现,都动到了底层的逻辑。无耐,本着折腾的心一路走到黑吧。

Valine路径问题

首先发现最大的问题:前几天刚接入的 ValinePjax 跳转后,评论得不到加载,甚至评论框都时好时坏😭😭。

经过几天的查阅各种官方文档和看他们底下的评论(Valine,jQuery, Pjax都快被在下翻烂了),各种冥想,总结,一个个方法尝试,总算是比较好的解决了。问题主要以下:

  1. Valinewindow.location.pathname 必须显式的指定

    let valine = new Valine({
     el: '#vcomments',
     appId: 'your appId',
     appKey: 'your appKey',
     path: window.location.pathname, // 这里!!!必要显式的指定为window.location.pathname
    });
    

    按官方文档的说法,path 的默认值就是 window.location.pathname,可以不指定,但若用 Pjax 跳转不指定就是不行,你说气不气。

  2. 跳转页面的url问题(自己的原因)

    原本的代码:

    <li>
     <a href="/docs/Awesome">Awesome</a>
    </li>
    <li>
     <a href="/docs/Reading">Reading</a>
    </li>
    

    若不用 Pjax 原本的浏览器刷新会在路径最后自动会补上一个 "/",所以 Valine 按window.location.pathname 去加载评论时都会带上 "/" 作为 URL 的,而 Pjax 使用时虽然你的路径也能正确解析出 HTML 内容,但去做评论查找时,这 URL 就对不上了,就会得到空白的结果。

    修正:

    <li>
     <a href="/docs/Awesome/">Awesome</a>
    </li>
    <li>
     <a href="/docs/Reading/">Reading</a>
    </li>
    
  3. 对 1 的增强,有时候显式指定了 path: window.location.pathname 还是不行

    因此,对 Pjax 做了一个事件监听 pjax:beforeReplace(从服务器端加载的 HTML 内容完成之后,替换当前内容之前),在这个生命周期中,再次指定 path:

    $(document).on('ready pjax:beforeReplace', function (event) {
     valine.setPath(pathname);
    });
    

经过上面的几点修复,到现在为止,Valine 总算又可以正常的使用了,暂时没发现新的问题。

除 Valine 外,其他方面上的坑:

  • 文章侧栏导航因 Pjax 的前进后退导致重复添加

    fix:每次预清理就好

  • 404/offline 页面回退后,样式残留

    fix:监听 pjax:clicked 事件,然后做样式清除

暂时就没发现还有其他的大问题,有就来一个修一个吧😵😵


最后总结

一开始 我真的只是 单纯的 想加个 音乐播放器 而已......


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • CSS CSS3 布局属性 标签的权值为1,类选择符的权值为10,ID选择符的权值最高为100 !importan...
    53cfdb355418阅读 411评论 0 0
  • 什么是BOM BOM:Browser Object Model 浏览器对象模型BOM是JavaScript组成之一...
    ZombieBrandg阅读 660评论 0 1
  • 十二、JavaScript的DOM特效 在web浏览器上,window对象是一个全局对象,代表web浏览器中一个打...
    刘远舟阅读 365评论 0 1
  • 项目介绍一、pc端静态页面制作1.小米官网静态页面制作2.博雅互动静态页面制作二、基础实例项目1.花瓣网实例1)思...
    果木山阅读 568评论 0 0
  • ====DOM==================================================...
    悦动燃爆阅读 205评论 0 0