数据交互,应该是一个老生常谈的问题了,可是十几年过去了,这个简单却又重要的问题,依然是很多人面试和实际工作中的心病。
数据交互在前端面试过程中,是一定会考的知识点。
当然某些知名招聘网站也是这么说的,大家看到这些字样,你面试前就要多翻翻书,多做做准备,别把送分题变成送命题。


从我对某个招聘网站的不完全统计,超过60%的招聘需求都对ajax有明确的需求。既然ajax简单,还有用,这不明显送分题嘛,怎么就变成送命题了呢?
原因两个:第一,是这个问题单纯会js搞不定。
这个不像轮播图,你自己折腾两天就明白了,而ajax和后台的关系就像情侣,想实践恋爱知识,前提是你得有一个女朋友,没有实际的数据接口和后台以及服务器知识支持,很难练习。
第二,很多人听到ajax就觉得复杂,还没学先打退堂鼓了。
这就好比为啥女神最后跟了普通人,而不是男神,因为人家敢表白啊,你大部分方面都合适,就因为两方面的原因(后台和服务器)就不敢表白,觉得自己成功不了,难道等着女神主动靠近自己么?

好了,现在我们就开始学习。
1.我们首先封装一个ajax库,然后我们用这个库直接请求网易云音乐歌词,最后做DOM实现。
ajax数据交互过程,面试必考,其实就四步,封装更是简单的让人发指,不墨迹直接***。

function ajax(opt) {
opt = opt || {};
opt.method = opt.method.toUpperCase() || 'POST';
opt.url = opt.url || '';
opt.async = opt.async || true;
opt.data = opt.data || null;
opt.success = opt.success || function () {};
var xmlHttp = null;
//1.首先偷一个手机,当然抢一个也行(创建一个ajax对象)
xmlHttp = new XMLHttpRequest()||new ActiveXObject('Microsoft.XMLHTTP');
//2.准备好话术,给你爸打电话(建立连接)
var params = [];
for (var key in opt.data){
params.push(key + '=' + opt.data[key]);
}
var postData = params.join('&');
if (opt.method.toUpperCase() === 'POST') {
xmlHttp.open(opt.method, opt.url, opt.async);
xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
//3.跟你爸说你被绑架了准备500万,不然就一枪崩了你(发送请求POST)
xmlHttp.send(postData);
}
else if (opt.method.toUpperCase() === 'GET') {
xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
//3.换一种方式说,好歹养这么大对吧,就算猪肉的话多少钱一斤对不对(发送请求GET)
xmlHttp.send(null);
}
//4.你爸说超过500块就撕票吧,反正也不是亲生的(接收返回数据)
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
opt.success(xmlHttp.responseText);
}
};
}
面试如果用嘴说的话,会绑架就会说ajax流程,写的话上面35行代码就完事。重点看注释。一切尽在无言中,我实在不知道该解释什么了,注意面试的时候含情脉脉的盯着面试×××姐(也可能是小哥哥)然后勇敢的说出你心中的话就好了,如果是笔试,别写的跟鬼画符似的让中文系博士生都不知道你写的是啥就行。
2.拿起来就用,这里我采用了一个网易云音乐接口,https://binaryify.github.io/NeteaseCloudMusicApi/#/?id=neteasecloudmusicapi 感谢Binaryify,我是站了巨人的肩膀上,所以我才看的那么远。他写这个接口,酸甜可口,老少皆宜。不过大家要尊重网易云的版权,仅供大家学习使用。

//获取播放列表
function getPlayList() {
ajax({
url: "http://localhost:3000/playlist/detail",
data: {
id: 2344558859
},
method: 'GET',
success: function (response) {
var playlist = JSON.parse(response);
console.log(playlist);

           var aPlayList = playlist.playlist.tracks;for (var item in aPlayList) {var oLi = document.createElement('li');oLi.innerHTML = `<li><a href="javascript:;">${aPlayList[item].name}</a></li>`oSongContainer.appendChild(oLi);}}});

获取播放列表,紧接着获取歌词
function getLyrics() {
var sid = 121353608;
ajax({
url: 'http://localhost:3000/lyric',
method: 'GET',
data: {
id: 33894312
},
success: function (response) {
var lyricsObj = JSON.parse(response);
if (lyricsObj.klyric.lyric) {

               lyrics.innerHTML = ''; // 清空歌词var lineArr = lyricsObj.lrc.lyric.split('\n'); // 歌词以排为界数组var timeReg = /\[\d{2}:\d{2}\.\d{3}\]/g;var result = [];for (var i = 0; i < lineArr.length; i++) {var time = lineArr[i].match(timeReg);var curStr = lineArr[i].replace(timeReg, '');for (var j in time) {var t = time[j].slice(1, -1).split(':'); // 时间的格式是[00:00.00] 分钟和毫秒是t[0],t[1]var curSecond = parseInt(t[0], 10) * 60 + parseFloat(t[1]);result.push([curSecond, curStr]);console.log(curStr);}}result.push([curSecond, curStr]);renderLyrics(result);}}});

}
剩下的事儿跟ajax没什么关系了,也就是拿到json数据怼DOM了,这里强调一点歌词,其实就是
[ti:依赖]——ti.=title,标题,即歌曲名
[ar:蔡健雅]——ar.=artist,艺术家,即歌手名
[al:MY SPACE]——al.=album,专辑,即歌曲被收录的专辑
[by:Chapter Chang]——by somebody,即LRC歌词文件的制作者
[offset:0]——补偿时值。500=0.5秒,正负值分别提前和延长相应的时间(其值多为500的倍数)
(以下为歌词内容,前面中括号内的数字为内容显示时的时值精确到毫秒;后面为在播放器上显示的内容,可以介绍歌曲的名称、演唱者和作者等ID3信息等。相同的歌词内容反复时可以在词句前加上其依次出现时的时值)
[00:00.50]蔡健雅 - 依赖
[00:07.94]词、曲:蔡健雅、陶晶莹
[00:11.60]关了灯把房间整理好
[00:15.48]凌晨三点还是睡不著
[00:19.64]你应该是不在 所以把电话挂掉
[00:30.39]在黑暗手表跟着心跳
[00:34.57]怎么慢它停也停不了
[00:39.70]我应该只是心情不好
[00:45.00]那又怎样
[00:48.50]但本来是这样
[01:21.36]朋友们对我的安慰
[01:25.20]都是同样的一个话题
[01:29.73]我一定要变得更坚强
[01:34.68]说很简单
[00:38.50]但是做却很难
[00:53.00][01:43.88][02:11.23]虽然无所谓写在脸上
[00:58.21][01:48.44][02:15.79]我还是舍不得让你离开
[01:02.97][01:53.50][02:20.60]虽然闭着眼假装听不到
[01:07.84][01:58.23][02:25.11][02:33.15]你对爱 已不再 想依赖
这么一个文件,通过正则,
var timeReg = /[\d{2}:\d{2}.\d{2}]/g;
把每一句歌词搞出来 ,有同学说老师我不会写正则,我只说一句你就清楚了
\d{2}: ->00: 这里\d是数字,{2}两个
. ->转义.
\d{2}] 84]
这样合起来就可以把时间挑出来了,时间挑出来了,剩下的不就是歌词了吗,这里注意不要去学正则,没有实际场景的情况下去学正则,只会让你难受,模模糊糊的。用到了去学,看不明白查一下,看人家怎么实现的,你就清楚了。比如写邮箱正则你不会,你可以去查啊,然后分析人家怎么正则的,带着问题去学,你用不到的没必要会。正确的学习方法要比假装的努力更重要。
这里最后说一下歌词滚动怎么搞,
//歌词滚动
oA.addEventListener('timeupdate', lrcScroll, false);
function lrcScroll() {
var percentNum = Math.floor((oA.currentTime / oA.duration) * 10000) / 100 + '%';
progress.style.width = percentNum;
progressBtn.style.left = percentNum;
// 控制歌词动态滚动
if (lyricsLiArr) {
for (var i = 0, len = lyricsLiArr.length - 1; i < len; i++) {
var curT = lyricsLiArr[i].getAttribute('data-time');
var nexT = lyricsLiArr[i + 1].getAttribute('data-time');
var curtTime = oA.currentTime;
if ((curtTime > curT) && (curtTime < nexT)) {

                   lyricsLiArr[i].className = 'active';lyricWrap.style.top = (100 - lyricsLiArr[i].offsetTop) + 'px';} else {lyricsLiArr[i].className = '';}}}}

其实就是判断当前的时间在不在对应歌词的时间段,不在就滚。
最后一点问题,上面这样写ajax是简单易懂的,但是简化了一个流程和需求,大家想,网易云音乐播放器是根据你登录名确定你的歌单的,根据你的歌单列表确定每一首歌的url和歌词的。那么如果直接顺序写。
getUser();
getMusicList();
getLrc();
这样写一定出问题,因为如果网络慢用户名没回来,你是没法根据userid 获取歌单的。有同学说老师好办,回调函数啊。
getUser(){
getMusicList(){
getLrc(){
renderDom();
}
}
}
这就会有很严重的问题,整个文学名词儿叫,回调地狱。说白了就是嵌套层数太多,最后乱七八糟的不好维护。咋整呢?好办,要是这样多好
getUser().getMusicList().getLrc().renderDom()
变成一条船上的蚂蚱(小学语文是体育老师教的,体育老师经常旷课去喂猪,大家见谅哈),前面保证给后面想要的东西多好啊,有这么好的事儿吗?
有,这就是一个半吊子的解决方案,传说中的Promise.所以记住脱离了场景讲技术,都是耍流氓,新技术的产生一定是为了解决问题服务的。具体怎么操作,且听下回分解。
·END·

转载于:https://blog.51cto.com/13592288/2168261

零基础通过Ajax实现网易云音乐数据交互(4)相关推荐

  1. 零基础通过Ajax实现网易云音乐数据交互(4)

    数据交互,应该是一个老生常谈的问题了,可是十几年过去了,这个简单却又重要的问题,依然是很多人面试和实际工作中的心病. 数据交互在前端面试过程中,是一定会考的知识点(鲁迅说,大彬哥说的对). 当然某些知 ...

  2. 网易云音乐数据治理探索与实践

    网易云音乐数据治理探索与实践 导读:大数据时代的到来,让很多企业看到了数据资产的价值,开始探索应用场景和商业模式,并建设相关技术平台.因此,数据治理成为了挖掘数据价值的重要手段和工具.但数据治理不仅需 ...

  3. 网易云音乐数据服务之路

    本文首发网易有数公众号:网易云音乐数据服务之路 数据服务作为统一数据中台建设的最上层,能够将数据仓库数据以服务化.接口化的方式提供给数据使用方,屏蔽底层数据存储.计算的诸多细节,简化和加强数据的使用: ...

  4. 【hexo】基础教程-三-添加网易云音乐

    1.打开网易云音乐首页,复制选择的背景音乐分享外链 网易云音乐 但是有些尴尬的就是,我们目前只能添加一些没设置版权的音乐,有些收费或无版权的音乐是无法添加收听的. 2.搜索任意歌曲后进入详情页面:如下 ...

  5. 从高可用IP代理池到千万级网易云音乐数据爬取的实现

    博客引流 首先 ㊗️大家 1024 快乐 之前写了第一版 网易云爬虫 逻辑比较简单 总结一下,就是: 抓取各分类下歌单id 根据歌单id, 获得这个歌单id下的歌曲详情 把拿到的数据存到落到本地文件, ...

  6. 音乐类产品——“网易云音乐”app交互原型模板(免费使用)

    网易云音乐虽是一款音乐app,但有人说它也是社交界的一股清流以及一匹黑马.音乐带给人的感染,激发着很多人在这里表达着他们的情绪和心声.网易云音乐上的真实用户点评,不仅被印在地铁的广告牌上,还在朋友圈频 ...

  7. python3爬取网易云歌单数据清洗_实例 | 使用网易云音乐数据演示数据整合与数据清洗...

    作者 | 小F 来源 | 法纳斯特(walker398) 数据整合是对数据进行行列选择.创建.删除等操作. 数据清洗则是将整合好的数据去除其中的错误和异常. 本文利用之前获取的网易云音乐用户数据,来简 ...

  8. 使用selenium抓取网易云音乐数据

    今天通过一个简单的网易云音乐排行榜数据抓取与音乐下载实战案例,带着大家一起来学习如何抓取动态生成的页面内容.网易云音乐排行榜网址:https://music.163.com/#/discover/to ...

  9. 零基础python入门编程全栈量化ai 百度云_Python编程量化AI全栈零基础入门帖子详情 - 网易云课堂...

    您好!感谢您对乐学偶得的支持! 列表推导式的语法结构可以分为几部分: 0. "[]",定义列表的中括号. 1. for循环初步定义列表. 2. 可选:在for循环后面可以使用if语 ...

最新文章

  1. 刚出炉!程序员人才补贴:单项目最高补贴1000万元
  2. 那些臭名昭著的sql
  3. mysql数据库关联练习_mysql数据库建立数据表的练习(附代码)
  4. Qt实践| HTTP知识点-接入某图片验证码系统识别验证码
  5. DWR自学笔记(1)HelloWorld
  6. 【动态规划笔记】状压dp:蓝桥 矩阵计数 (二进制枚举)
  7. 怎么把html背景图片,css如何设置背景图片?
  8. MySQL使用二进制日志来恢复数据
  9. eclipse maven 报错Could not get the value for parameter encoding for plugin execution default
  10. 从哪查找当前程序所有可用的环境变量?
  11. 备战数学建模12-模糊综合评价模型
  12. vue-froala-wysiwyg富文本编辑器
  13. 1月23日阴阳师服务器维护,阴阳师1月23日体验服更新 双神降临概率UP
  14. Quartus II :1位全加器设计
  15. flutter版本升级
  16. Leetcode实战:121.买卖股票的最佳时机
  17. 修改Cisco交换机ntp服务器,Cisco交换机NTP的配置
  18. VB.NET读取Excel数据在CAD上展图
  19. java、vue实现微信网页分享
  20. Java中阻塞队列类型介绍

热门文章

  1. odoo登录后显示空白页
  2. SDU 和 PDU区分
  3. MySQL聚簇索引深入理解
  4. SGM3005 简介
  5. 懒人如何在ubuntu下安装jdk
  6. v-bind动态绑定
  7. 骁龙820A与数字座舱平台
  8. 魅族路由器极速版固件_小白乱入?魅族路由器极速版简评
  9. 第004话 武士少年的挑战!
  10. 【硬件】各类显示屏幕