├── css
├── html5-doctor-reset-stylesheet.min.css
└── index.css
├── img
├── bg.png
├── pic.jpg
├── 列表.png
├── 单曲循环.png
├── 唱片.png
├── 快进.png
├── 播放.png
├── 暂停.png
├── 随机.png
└── 音乐.png
├── index.html
└── js
├── flexible.js
├── index.js
└── original_ajax.js
/css/html5-doctor-reset-stylesheet.min.css:
--------------------------------------------------------------------------------
1 | html,body,div,span,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,abbr,address,cite,code,del,dfn,em,img,ins,kbd,q,samp,small,strong,sub,sup,var,b,i,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,figcaption,figure,footer,header,hgroup,menu,nav,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}
2 | body{line-height:1}
3 | article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}
4 | nav ul{list-style:none}
5 | blockquote,q{quotes:none}
6 | blockquote:before,blockquote:after,q:before,q:after{content:none}
7 | a{margin:0;padding:0;font-size:100%;vertical-align:baseline;background:transparent}
8 | ins{background-color:#ff9;color:#000;text-decoration:none}
9 | mark{background-color:#ff9;color:#000;font-style:italic;font-weight:bold}
10 | del{text-decoration:line-through}
11 | abbr[title],dfn[title]{border-bottom:1px dotted;cursor:help}
12 | table{border-collapse:collapse;border-spacing:0}
13 | hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:1em 0;padding:0}
14 | input,select{vertical-align:middle}
--------------------------------------------------------------------------------
/css/index.css:
--------------------------------------------------------------------------------
1 | html,body{
2 | height: 100%;
3 | font-family: Arial, sans-serif;
4 | background: rgba(10, 40, 20, 0.5);
5 | color: rgba(255, 255, 255, .5);
6 | }
7 |
8 | /*header Start*/
9 | header{
10 | box-sizing: border-box;
11 | height: 14%;
12 | padding: 0.625rem 0 0;
13 | /*min-height: 78px;*/
14 | min-height: 2.4375rem;
15 | text-align: center;
16 | }
17 | header .song-title{
18 | width: 100%;
19 | font-size: 0.625rem;
20 | color: #fff;
21 | text-overflow: ellipsis;
22 | white-space: nowrap;
23 | overflow: hidden;
24 | }
25 | header .singer{
26 | width: 100%;
27 | font-size: 0.5rem;
28 | margin-top: 0.25rem;
29 | text-overflow: ellipsis;
30 | white-space: nowrap;
31 | overflow: hidden;
32 | }
33 | /*header End*/
34 |
35 | /*content Start*/
36 | .content{
37 | box-sizing: border-box;
38 | width: 100%;
39 | height: 60%;
40 | /*min-height: 260px*/
41 | min-height: 8.125rem;
42 | overflow: hidden;
43 | }
44 | .content .record-wrapper{
45 | position: relative;
46 | width: 100%;
47 | height: 100%;
48 | }
49 | .content .mid{
50 | position: absolute;
51 | left: 0;
52 | right: 0;
53 | top: 0;
54 | bottom: 0;
55 | margin: auto;
56 | }
57 | .content .record-bg{
58 | /*width: 250px;*/
59 | width: 7.8125rem;
60 | height: 7.8125rem;
61 | border: 0.1875rem solid rgba(245, 245, 245, 0.2);
62 | border-radius: 50%;
63 | background-image: url(../img/bg.png);
64 | background-repeat: no-repeat;
65 | background-size: 100% 100%;
66 | overflow: hidden;
67 | }
68 | .content .record-pic{
69 | /*width: 180px;*/
70 | width: 5.625rem;
71 | height: 5.625rem;
72 | border-radius: 50%;
73 | overflow: hidden;
74 | }
75 | .content .record-pic img{
76 | width: 100%;
77 | height: 100%;
78 | display: block;
79 | }
80 |
81 | .content .lyrics-wrapper{
82 | position: relative;
83 | width: 100%;
84 | height: 100%;
85 | overflow: hidden;
86 | }
87 | .lyrics-wrapper .lyrics{
88 | position: absolute;
89 | width: 100%;
90 | transition: top 0.5s;
91 | text-align: center;
92 | }
93 | .lyrics-wrapper .lyrics li{
94 | /*padding: 8px 8px;*/
95 | padding: 0.25rem 0.25rem;
96 | /*font-size: 14px;*/
97 | font-size: 0.4375rem;
98 | }
99 | .lyrics-wrapper .lyrics li.active{
100 | color: #fff;
101 | }
102 |
103 |
104 | /*content End*/
105 |
106 | /*footer Start*/
107 | footer{
108 | box-sizing: border-box;
109 | height: 26%;
110 | width: 100%;
111 | /*min-height: 126px;*/
112 | min-height: 3.9375rem;
113 | }
114 | footer .channel{
115 | text-align: center;
116 | font-size: 0.5rem;
117 | /*line-height: 20px;*/
118 | line-height: 0.625rem;
119 | }
120 | .progress-bar{
121 | position: relative;
122 | /*height: 4px;*/
123 | height: 0.125rem;
124 | /*width: 250px;*/
125 | width: 7.8125rem;
126 | /*width: 8.75rem;*/
127 | border-radius: 0.0625rem;
128 | background: rgba(255,255,255, 0.4);
129 | /*margin: 14px auto 20px;*/
130 | margin: 0.4375rem auto 0.625rem;
131 | }
132 | .progress{
133 | height: 100%;
134 | width: 0;
135 | background: red;
136 | border-radius: 0.0625rem;
137 | }
138 | .progress-btn{
139 | position: absolute;
140 | left: 0;
141 | top: -0.09375rem;
142 | /*width: 16px;*/
143 | width: 0.5rem;
144 | height: 0.375rem;
145 | margin-left: -0.25rem;
146 | background: #fff;
147 | border-radius: 0.125rem;
148 | }
149 |
150 | .btns{
151 | display: flex;
152 | justify-content: space-around;
153 | align-items: center;
154 | padding: 0 0.625rem;
155 | }
156 | .icon-sides{
157 | /*width: 20px*/
158 | width: 0.625rem;
159 | height: 0.625rem;
160 | background-size: 100% 100%;
161 | }
162 | .icon-middle{
163 | width: 0.9375rem;
164 | height: 0.9375rem;
165 | border-radius: 50%;
166 | background-size: 100% 100%;
167 | }
168 | .play{
169 | width: 1.5625rem;
170 | height: 1.5625rem;
171 | border-radius: 50%;
172 | background-size: 100% 100%;
173 | background-image: url(../img/暂停.png);
174 | }
175 | .change-channel{
176 | background-image: url(../img/唱片.png);
177 | }
178 | .next{
179 | background-image: url(../img/快进.png);
180 | }
181 | .show-lyrics{
182 | background-image: url(../img/列表.png);
183 | }
184 | .mode{
185 | background-image: url(../img/随机.png);
186 | }
187 | /*footer End*/
188 |
189 | .rotate{
190 | animation: recordRotate 30s linear 1s infinite;
191 | }
192 |
193 | @keyframes recordRotate {
194 | to {
195 | transform: rotate(360deg);
196 | }
197 | }
198 |
199 | /* 全局背景 */
200 | .glass{
201 | position: absolute;
202 | left: 0;
203 | top: 0;
204 | /*background: blue;*/
205 | z-index: -1;
206 | width: 100%;
207 | height: 100%;
208 | }
209 | .glass img{
210 | width: 100%;
211 | height: 100%;
212 | filter: blur(20px);
213 | }
214 |
--------------------------------------------------------------------------------
/img/bg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/bg.png
--------------------------------------------------------------------------------
/img/pic.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/pic.jpg
--------------------------------------------------------------------------------
/img/列表.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/列表.png
--------------------------------------------------------------------------------
/img/单曲循环.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/单曲循环.png
--------------------------------------------------------------------------------
/img/唱片.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/唱片.png
--------------------------------------------------------------------------------
/img/快进.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/快进.png
--------------------------------------------------------------------------------
/img/播放.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/播放.png
--------------------------------------------------------------------------------
/img/暂停.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/暂停.png
--------------------------------------------------------------------------------
/img/随机.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/随机.png
--------------------------------------------------------------------------------
/img/音乐.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/YangQiGitHub/JsMusicPlayer/6a3b68c8c882e13c26120f3f575533efbda9767e/img/音乐.png
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 与喜欢的音乐不期而遇
8 |
9 |
10 |
11 |
12 |
13 |
14 |
18 |
19 |
20 |
21 |
22 |

23 |
24 |
25 |
26 |
29 |
30 |
44 |
45 |
![]()
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
--------------------------------------------------------------------------------
/js/flexible.js:
--------------------------------------------------------------------------------
1 | (function(win,tcf){
2 | var doc = win.document;
3 | var docEl = doc.documentElement;
4 | var metaEl = doc.querySelector('meta[name="viewport"]');
5 | var dpr = 0;
6 | var scale = 0;
7 | var handler = null;
8 |
9 | var flexible = tcf.flexible || (tcf.flexible = {});
10 |
11 | //将根据已有的meta标签来设置缩放比例
12 | if (metaEl) {
13 | var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
14 | if (match) {
15 | scale = parseFloat(match[1]);
16 | dpr = parseInt(1 / scale);
17 | }
18 | }
19 | //如果没有设置,那么会自动添加meta viewport的设置
20 | if (!dpr && !scale) {
21 | var isAndroid = win.navigator.appVersion.match(/android/gi);
22 | var isIPhone = win.navigator.appVersion.match(/iphone/gi);
23 | var isLiebao = win.navigator.appVersion.match(/LieBao/gi);
24 | var isSogou = win.navigator.appVersion.match(/Sogou/gi);
25 | var clsName = String(isIPhone||isLiebao||isSogou||isAndroid||'').toLowerCase();
26 | var devicePixelRatio = Math.floor(win.devicePixelRatio)||1;
27 | if (isIPhone) {
28 | if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
29 | dpr = 3;
30 | } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
31 | dpr = 2;
32 | } else {
33 | dpr = 1;
34 | }
35 |
36 | }else if(isLiebao || isSogou){
37 | dpr = 1;
38 | }else {
39 | dpr = devicePixelRatio;
40 | }
41 |
42 | doc.body.classList.add(clsName);
43 | scale = 1 / dpr;
44 | }
45 |
46 |
47 |
48 | if (!metaEl) {
49 | metaEl = doc.createElement('meta');
50 | metaEl.setAttribute('name', 'viewport');
51 | metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale +',user-scalable=no');
52 | if (docEl.firstElementChild) {
53 | docEl.firstElementChild.appendChild(metaEl);
54 | } else {
55 | var wrap = doc.createElement('div');
56 | wrap.appendChild(metaEl);
57 | doc.write(wrap.innerHTML);
58 | }
59 | }
60 |
61 | docEl.setAttribute('data-dpr', dpr);
62 |
63 | var setFontSize = function(){
64 | var width = docEl.getBoundingClientRect().width;
65 | if (width / dpr > 540) {
66 | width = 540 * dpr;
67 | }
68 | var rem = width / 10;
69 | rem = Math.max(rem,32);
70 | docEl.style.fontSize = rem+'px';
71 | flexible.width = width;
72 | flexible.rem = win.rem = rem;
73 | };
74 |
75 | ['resize','orientationchange'].forEach(function(item){
76 | win.addEventListener(item, function(e) {
77 | clearTimeout(handler);
78 | handler = setTimeout(setFontSize, 300);
79 | }, false);
80 | })
81 |
82 | win.addEventListener('pageshow', function(e) {
83 | if (e.persisted) {
84 | clearTimeout(handler);
85 | handler = setTimeout(setFontSize, 300);
86 | }
87 | }, false);
88 |
89 | if (doc.readyState === 'complete') {
90 |
91 | doc.body.style.fontSize = 12 * dpr + 'px';
92 | } else {
93 | doc.addEventListener('DOMContentLoaded', function(e) {
94 | doc.body.style.fontSize = 12 * dpr + 'px';
95 |
96 | }, false);
97 | }
98 |
99 | setFontSize();
100 |
101 | flexible.dpr = win.dpr = dpr;
102 | flexible.setFontSize = setFontSize;
103 | flexible.rem2px = function(d) {
104 | var val = parseFloat(d) * this.rem;
105 | if (typeof d === 'string' && d.match(/rem$/)) {
106 | val += 'px';
107 | }
108 | return val;
109 | }
110 | flexible.px2rem = function(d) {
111 | var val = parseFloat(d) / this.rem;
112 | if (typeof d === 'string' && d.match(/px$/)) {
113 | val += 'rem';
114 | }
115 | return val;
116 | }
117 |
118 | }(window,window['tcf'] || (window['tcf'] = {})))
--------------------------------------------------------------------------------
/js/index.js:
--------------------------------------------------------------------------------
1 | window.onload = function () {
2 |
3 | //取消body的touchmove默认行为,阻止页面滚动
4 | document.body.addEventListener('touchmove', function (event) {
5 | event.preventDefault();
6 | }, false);
7 |
8 | var musicAudio = document.querySelector('#mic_audio'); // audio标签
9 | var channel = document.querySelector('.channel'); // 频道标签节点
10 | var songTitle = document.querySelector('.song-title'); // 歌名标签节点
11 | var singer = document.querySelector('.singer'); // 歌手标签节点
12 | var recordImg = document.querySelector('.record-pic img'); // 专辑图片
13 | var recordPic = document.querySelector('.record-pic'); // 专辑图片外层div节点
14 | var recordWrap = document.querySelector('.record-wrapper'); // 专辑区域
15 | var playBtn = document.querySelector('.play'); // 播放按钮
16 | var nextBtn = document.querySelector('.next'); // 下一区按钮
17 | var changeChannelBtn = document.querySelector('.change-channel'); // 更换频道
18 | var modeBtn = document.querySelector('.mode'); // 切换播放模式
19 | var progressBar = document.querySelector('.progress-bar'); // 进度条外层div
20 | var progress = document.querySelector('.progress'); // 进度条长度
21 | var progressBtn = document.querySelector('.progress-btn'); // 进度条拖动按钮
22 | var lyricBtn = document.querySelector('.show-lyrics'); // 显示歌词按钮
23 | var lyrics = document.querySelector('.lyrics'); // 歌词的包裹节点
24 | var bigBg = document.querySelector('.glass img');
25 | var lyricsLiArr = null;
26 |
27 | var num = 1;
28 | // 首次进入页面,chrome,safair在页面没有手动点击的时候,是不能自动播放音乐的,设定num变量标记第一次进入页面
29 |
30 | var channelArr = []; // 用来记录“歌曲频道”的数组
31 |
32 | getChannel();
33 |
34 | // 为播放按钮添加事件
35 | playBtn.onclick = function () {
36 | musicAudio.onplaying = null; // 清除audio标签绑定的事件
37 | if (musicAudio.paused) {
38 | playBtn.style.backgroundImage = 'url(img/播放.png)';
39 | musicAudio.play();
40 | } else {
41 | playBtn.style.backgroundImage = 'url(img/暂停.png)';
42 | musicAudio.pause();
43 | }
44 | };
45 |
46 | // 下一曲按钮
47 | nextBtn.onclick = function () {
48 | getMusic();
49 | };
50 |
51 | // 更换频道按钮
52 | changeChannelBtn.onclick = function () {
53 | getRandomChannel(channelArr);
54 | getMusic();
55 | };
56 |
57 | // mode按钮
58 | modeBtn.onclick = function () {
59 | if (musicAudio.loop) {
60 | musicAudio.loop = false;
61 | this.style.backgroundImage = 'url(img/随机.png)';
62 | } else {
63 | musicAudio.loop = true;
64 | this.style.backgroundImage = 'url(img/单曲循环.png)';
65 | }
66 | };
67 |
68 | // 显示歌词按钮
69 | lyricBtn.onclick = function () {
70 | if (recordWrap.style.display == 'block') {
71 | recordWrap.style.display = 'none';
72 | channel.style.fontSize = 0;
73 | if (!lyricsLiArr) {
74 | getlyric();
75 | }
76 | } else {
77 | recordWrap.style.display = 'block';
78 | channel.style.fontSize = '0.5rem';
79 | }
80 | };
81 |
82 |
83 |
84 | var isLoading = false;
85 | var progressTimer = setInterval(activeProgressBar, 300);
86 |
87 | // 激活进度条
88 | function activeProgressBar () {
89 | var percentNum = Math.floor((musicAudio.currentTime / musicAudio.duration) * 10000) / 100 + '%';
90 | progress.style.width = percentNum;
91 | progressBtn.style.left = percentNum;
92 |
93 | if (percentNum == '100%' && !isLoading && !musicAudio.loop) {
94 | isLoading = true;
95 | getMusic();
96 | }
97 | if (musicAudio.paused && recordPic.className != 'record-pic mid') {
98 | recordPic.className = 'record-pic mid';
99 | playBtn.style.backgroundImage = 'url(img/暂停.png)';
100 | return;
101 | } else if (recordPic.className != 'record-pic mid rotate' && !musicAudio.paused) {
102 | recordPic.className = 'record-pic mid rotate';
103 | playBtn.style.backgroundImage = 'url(img/播放.png)';
104 | }
105 |
106 | // 控制歌词动态滚动
107 | if (lyricsLiArr) {
108 | for (var i = 0, len = lyricsLiArr.length-1; i < len; i++) {
109 | var curT = lyricsLiArr[i].getAttribute('data-time');
110 | var nexT = lyricsLiArr[i+1].getAttribute('data-time');
111 | var curtTime = musicAudio.currentTime;
112 | if ((curtTime > curT) && (curtTime < nexT)) {
113 | lyricsLiArr[i].className = 'active';
114 | lyrics.style.top = (100 - lyricsLiArr[i].offsetTop) + 'px';
115 | } else {
116 | lyricsLiArr[i].className = '';
117 | }
118 | }
119 | }
120 | }
121 |
122 | // 进度条操作音乐播放进度,绑定事件
123 | progressBtn.addEventListener('touchstart', function () {
124 | clearInterval(progressTimer);
125 | });
126 | progressBtn.addEventListener('touchmove', function (e) {
127 | var percentNum = (e.targetTouches[0].pageX - progressBar.offsetLeft) / progressBar.offsetWidth;
128 | if (percentNum > 1) {
129 | percentNum = 1;
130 | } else if (percentNum < 0){
131 | percentNum = 0;
132 | }
133 | this.style.left = percentNum * 100 + '%';
134 | progress.style.width = percentNum * 100 + '%';
135 | });
136 | progressBtn.addEventListener('touchend', function (e) {
137 | var percentNum = (e.changedTouches[0].pageX - progressBar.offsetLeft) / progressBar.offsetWidth;
138 | musicAudio.currentTime = musicAudio.duration * percentNum;
139 | progressTimer = setInterval(activeProgressBar, 300);
140 | });
141 |
142 | // 获取频道
143 | function getChannel () {
144 | ajax({
145 | method: 'GET',
146 | async: false,
147 | url: 'http://api.jirengu.com/fm/getChannels.php',
148 | success: function (response) {
149 | var jsonObj = JSON.parse(response);
150 | channelArr = jsonObj['channels'];
151 | getRandomChannel(channelArr);
152 | getMusic();
153 | }
154 | });
155 | }
156 |
157 | // 获取随机频道
158 | function getRandomChannel (channelArr) {
159 | var randomNum = Math.floor(channelArr.length * Math.random());
160 | var randomChannel = channelArr[randomNum];
161 |
162 | channel.innerHTML = randomChannel.name;
163 | channel.setAttribute('data-channel-id', randomChannel.channel_id);
164 | }
165 |
166 | // 获取音乐
167 | function getMusic () {
168 | ajax({
169 | method: 'GET',
170 | url: 'http://api.jirengu.com/fm/getSong.php',
171 | data: {
172 | "channel": channel.getAttribute("data-channel-id")
173 | },
174 | success: function (response) {
175 | var jsonObj = JSON.parse(response);
176 | var songObj = jsonObj['song'][0];
177 |
178 | songTitle.innerHTML = songObj.title;
179 | singer.innerHTML = songObj.artist;
180 | recordImg.src = songObj.picture;
181 | bigBg.src = songObj.picture;
182 | musicAudio.src = songObj.url;
183 | musicAudio.setAttribute('data-sid', songObj.sid);
184 | musicAudio.setAttribute('data-ssid', songObj.ssid);
185 | musicAudio.play();
186 | isLoading = false;
187 | getlyric();
188 |
189 | // 解决首次进入页面时,自动播放的兼容问题,不自动播放
190 | if (num === 1) {
191 | musicAudio.onplaying = function () {
192 | this.pause();
193 | musicAudio.onplaying = null;
194 | };
195 | num++;
196 | }
197 | }
198 | });
199 | }
200 |
201 |
202 | function getlyric () {
203 | var sid = musicAudio.getAttribute('data-sid');
204 | var ssid = musicAudio.getAttribute('data-ssid');
205 | ajax({
206 | url: 'http://api.jirengu.com/fm/getLyric.php',
207 | method: 'POST',
208 | data: {
209 | sid: sid,
210 | ssid: ssid
211 | },
212 | success: function (response) {
213 | var lyricsObj = JSON.parse(response);
214 |
215 | if (lyricsObj.lyric) {
216 | lyrics.innerHTML = ''; // 清空歌词
217 | var lineArr = lyricsObj.lyric.split('\n'); // 歌词以排为界数组
218 | var timeReg = /\[\d{2}:\d{2}.\d{2}\]/g;
219 | var result = [];
220 |
221 | for (var i in lineArr) {
222 | var time = lineArr[i].match(timeReg);
223 | if (!time) continue;
224 | var curStr = lineArr[i].replace(timeReg, '');
225 | for (var j in time) {
226 | var t = time[j].slice(1, -1).split(':'); // 时间的格式是[00:00.00] 分钟和毫秒是t[0],t[1]
227 | var curSecond = parseInt(t[0], 10) * 60 + parseFloat(t[1]);
228 | result.push([curSecond, curStr]);
229 | }
230 | }
231 |
232 | result.sort(function (a, b) {
233 | return a[0] - b[0];
234 | });
235 |
236 | // 渲染歌词到界面
237 | renderLyrics(result);
238 | }
239 | }
240 | })
241 | }
242 |
243 | // 添加歌词到页面中
244 | function renderLyrics (lyricArr) {
245 | var str = '';
246 | for (var i = 0, len = lyricArr.length; i < len; i++) {
247 | str += '' + lyricArr[i][1] + '';
248 | }
249 | lyrics.innerHTML = str;
250 | lyricsLiArr = lyrics.getElementsByTagName('li');
251 | }
252 | };
--------------------------------------------------------------------------------
/js/original_ajax.js:
--------------------------------------------------------------------------------
1 | /* 封装ajax函数
2 | * @param {string}opt.type http连接的方式,包括POST和GET两种方式
3 | * @param {string}opt.url 发送请求的url
4 | * @param {boolean}opt.async 是否为异步请求,true为异步的,false为同步的
5 | * @param {object}opt.data 发送的参数,格式为对象类型
6 | * @param {function}opt.success ajax发送并接收成功调用的回调函数
7 | */
8 | function ajax(opt) {
9 | opt = opt || {};
10 | opt.method = opt.method.toUpperCase() || 'POST';
11 | opt.url = opt.url || '';
12 | opt.async = opt.async || true;
13 | opt.data = opt.data || null;
14 | opt.success = opt.success || function () {};
15 | var xmlHttp = null;
16 | if (XMLHttpRequest) {
17 | xmlHttp = new XMLHttpRequest();
18 | }
19 | else {
20 | xmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
21 | }
22 | var params = [];
23 | for (var key in opt.data){
24 | params.push(key + '=' + opt.data[key]);
25 | }
26 | var postData = params.join('&');
27 | if (opt.method.toUpperCase() === 'POST') {
28 | xmlHttp.open(opt.method, opt.url, opt.async);
29 | xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=utf-8');
30 | xmlHttp.send(postData);
31 | }
32 | else if (opt.method.toUpperCase() === 'GET') {
33 | xmlHttp.open(opt.method, opt.url + '?' + postData, opt.async);
34 | xmlHttp.send(null);
35 | }
36 | xmlHttp.onreadystatechange = function () {
37 | if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
38 | opt.success(xmlHttp.responseText);
39 | }
40 | };
41 | }
--------------------------------------------------------------------------------