转自:http://www.cnblogs.com/arby/archive/2012/04/07/2436352.html
初学HTML5,感觉audio标签有点兴趣。尝试着做一个播放器,练习过程中发现,audio的ended事件触发有点小问题第一首播放结束确实只触发了一次ended事件,第二次播放接受触发两次,第三次播放结束触发了4次。导致一直在列表的1、2两首轮播,完全不顾及第三首的感受。。 在几大论坛上发帖求助未果,于是自己一阵乱搞,加了个判断 if(self.media.currentTime == self.media.duration)如果不满足这个条件触发了ended事件也不去播放下一首。
function Audio(song, playType, dom){
/*
* 播放器构造函数。
* dom:为audio元素,可以不传。
* song : 为歌曲列表,只支持数组形式,格式为[{}{}]
* playType 为播放方式: 1 顺序播放 2 随机播放 3 单曲循环 4 全部循环
*/
if(!dom) {
this.media = document.createElement('audio');
document.body.appendChild(this.media);
}else {
this.media = typeof dom == 'string' ? document.getElementById(dom) : dom;
}
this.currentIndex = 0;
this.songList = song;
this.countTotal = this.songList.length;
this.playType = playType || 1;
this.MusicInfo = [];
this.playing = false;
}
/*
* 播放器启动主函数
*/
Audio.prototype.startPlay = function(){
this.media.src = this.songList[this.currentIndex].src;
this._play();
}
/*
* 播放器播放核心函数.
*/
Audio.prototype._play = function(){
var self = this;
this.media.play();
this.playing = true;
this.mediaEvent('ended' ,callback);
function callback(){
//单曲循环无需单独处理,只需直接调用startPlay()函数。
if(self.media.currentTime == self.media.duration){
switch(self.playType){
case 1:
if(self.currentIndex == self.countTotal-1){
return false;
}else{
self.currentIndex++;
}
break;
case 2:
self.currentIndex = Math.floor(Math.random()*self.countTotal);
break;
case 4:
self.currentIndex++;
console.log("self.currentIndex==",self.currentIndex);
self.currentIndex = (self.currentIndex > self.countTotal-1) ? 0 : self.currentIndex;
break;
}
self.startPlay();
}
}
}
/*
*播放下一首如果当前已经是最后一首则播放第一首
*/
Audio.prototype.playNext = function(){
this.currentIndex++;
this.currentIndex = this.currentIndex > this.countTotal-1 ? 0 : this.currentIndex;
this.startPlay();
}
/*
*播放上一首如果当前已经是第一首则播放最后一首
*/
Audio.prototype.playPrevious = function(){
this.currentIndex++;
this.currentIndex = this.currentIndex < 0 ? this.countTotal-1 : this.currentIndex;
this.startPlay();
}
/*
* 暂停当前播放,如果传回调函数,则暂停后执行回调。
*/
Audio.prototype.playPause = function(callback){
if(this.playing){
this.media.pause();
this.playing = false;
}else{
this.media.play();
this.playing = true;
}
if(!callbakc){callback();}
}
/*
* 获取当前播放位置
*/
Audio.prototype.getCurrentTime = function(){
return this.media.currentTime;
}
/*
* 播放器各种事件监听.
* tip 类型必须是正确的类型
*/
Audio.prototype.mediaEvent = function(eventType, callback){
Event.add(this.media,eventType,callback);
}
/*
* 播放用户自定义时间,即拖动进度条。
*/
Audio.prototype.playUserTime = function(time){
this.media.currentTime = time;
}
/*
* 获取当前媒体信息
* src 当前媒体路径
* size 当前媒体总时长.
*/
Audio.prototype.getMusicInfo = function(){
this.MusicInfo.src = this.media.currentSrc;
this.MusicInfo.size = this.media.duration;
this.MusicInfo.name = this.songList[this.currentIndex].name;
return this.MusicInfo;
}
/*
* 设置或者获取当前音量
* voluems的值需大于0 小于等于 1
*/
Audio.prototype.setVolume = function(volumes){
if(volumes) {
this.media.volume = volumes;
}else{
return this.media.volume;
}
}
/*
* 设置或者取消静音.
* flag的值为true是静音,false时正常
*/
Audio.prototype.muted = function(flag){
if(flag){
this.media.muted = 1;
}else{
this.media.muted = 0;
}
}
/*
* 向播放列表添加新歌曲
* song为所需要添加的歌曲,可以多首,格式如构造函数中song.
*/
Audio.prototype.addSongToList = function(song){
this.songList.push(song);
this.countTotal = this.songList.length;
}
Audio.prototype.getBuffered = function(){
return this.media.buffered;
}
/*全局事件监听封装函数*/
var Event = {
add : function(node, eventType, callback){
var node = typeof node == 'string' ? document.getElementById(node) : node;
if(document.addEventListener){
node.addEventListener(eventType, callback, false);
}else{
node.attachEvent('on' + eventType, callback);
}
},
remove : function(node, eventType, callback){
var node = typeof node == 'string' ? document.getElementById(node) : node;
if(document.removeEventListener){
node.removeEventListener(eventType, callback, false);
}else{
node.detachEvent('on' + eventType, callback);
}
}
}
var core = {
formatPlayTime : function(tempTime){
var temp = tempTime.toString().split(".")[0];
if(tempTime<=60){
temp = temp>=10? temp : "0"+temp;
return "00 : " + temp;
}else{
var minute =Math.floor(temp/60);
minute = (minute >= 10)? minute : "0"+ minute;
var second = temp%60;
second = (second >= 10)? second : "0"+second;
return minute + " : " + second;
}
}
}
相关推荐
HTML5音乐播放器是利用现代浏览器支持的HTML5 Audio API构建的在线音乐播放软件。这个例子源码提供了实现此类播放器的基本结构和功能。以下是基于提供的文件名和标签的详细知识点解析: 1. **HTML5 Audio API**: ...
HTML5音乐播放器是一种利用HTML5技术实现的网页内嵌式音乐播放解决方案,它不再依赖于Flash等外部插件,而是直接通过浏览器自身的API来播放音频文件,如MP3格式。这种播放器不仅提升了用户体验,还具有更好的跨平台...
HTML5音乐播放器带歌词.rar HTML5音乐播放器带歌词.rar HTML5音乐播放器带歌词.rar HTML5音乐播放器带歌词.rar HTML5音乐播放器带歌词.rar HTML5音乐播放器带歌词.rar HTML5音乐播放器带歌词.rar HTML5音乐播放器带...
HTML5 smusic-1.0.0是一款基于HTML5技术构建的音乐播放器,它充分利用了HTML5的新特性,提供了一种现代化的、无需插件的在线音乐播放体验。这款播放器适用于网页,使得网站可以无缝集成音乐播放功能,为用户提供便捷...
这是一款样式非常古典,但又是非常时尚的HTML5播放器,说它是古典播放器,是因为这种卡带式的HTML5播放器比较古老,说它时尚,是因为现在的HTML5播放器很少有这种样式的,非常有创意。如果你想给你的个人主要添加一...
APlayer, 哇这么漂亮的HTML5音乐播放器 APlayer哇这么可爱的HTML5音乐播放器 简介 APlayer是一个可爱的HTML5音乐播放器。APlayer支持:媒体格式MP4 H.264 ( AAC或者 MP3 )波形
HTML5音乐播放器是现代网页设计中不可或缺的一部分,它利用HTML5的新特性,尤其是`<audio>`标签,为用户提供在网页上播放音频的功能。CSS3则用于美化和增强播放器的用户界面,而JavaScript(JS)则用于实现交互性和...
HTML5音乐播放器是一种利用HTML5的新特性,如Audio API,来实现的在线音乐播放解决方案。相较于传统的Flash或JavaScript插件,HTML5音乐播放器具有更好的跨平台性和兼容性,支持移动设备,并且无需额外安装插件。在...
【移动端精美的HTML5音乐播放器】是一款专为手机和平板等移动设备设计的音乐播放器,它利用了HTML5的音频API和jQuery库来实现流畅、互动性强的音乐播放功能。HTML5作为现代网页开发的标准,其音频元素(`<audio>`)...
《.NET版HTML5音乐播放器详解》 在数字化时代,音乐播放器已经从桌面软件逐渐转向了网页应用。.NET版HTML5音乐播放器就是这样一款适应趋势的产品,它将.NET框架的强大功能与HTML5的新特性相结合,为用户提供了一种...
基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器源码 基于jQuery的HTML5移动端音乐播放器...
HTML5音乐播放器则是利用HTML5的新特性,如`<audio>`标签,实现网页内的音频播放功能。本项目结合两者,通过JSON数据来管理音乐播放器的曲目列表,实现了动态加载和控制音乐播放的功能。 1. **HTML5 `<audio>`标签*...
HTML5音乐播放器是现代网页设计中的一个重要组成部分,它利用HTML5的新特性为用户提供便捷、美观的音频播放体验。在本项目中,"HTML5音乐播放器效果非常漂亮"这一标题暗示了我们将会讨论一个设计精良且功能丰富的...