Namespace.register("U.MD.UI.music"); /** * [Control description] 音乐控件总函数 * @param {[type]} musicList [数组json 格式请看文档] * @param {[type]} index [需要播放第几首歌(索引)] * @param {[type]} autoplay [是否自动播放] 可填可不填 默认 false * @param {[type]} parentEl 所需要添加到的父元素 可填可不填 默认document.body */ U.MD.UI.music = function (musicList, index, autoplay, parentEl) { var _music = U.MD.UI.music; //简写命名空间 var _musicBox; if (_musicBox = U.selectEl("#U_MD_UI_music_musicBox")[0]) { // U.selectEl(_musicBox).removeClass('U_MD_UI_music_hidden'); // var _attr = _music.Attr; //简写全局属性json名 // var _audio = U.selectEl("#U_MD_UI_music_audio"); //audio标签 // _attr.musicList = musicList; //全局赋值 // _attr.musicIndex = index; //全局赋值 // _audio[0].src = musicList[index].src; //添加音乐路径 // var _Name = U.selectEl("#U_MD_UI_music_Name"); //音乐名字节点 // _Name[0].innerText = musicList[index].title; //音乐名字赋值 _musicBox.remove(); } _music.create(parentEl); //创建音乐控件 _music.Attr = { //存放全局属性 'musicList': musicList, //所有数据 'musicIndex': index, //当前数据索引 'autoplay': autoplay, //第一首是否自动播放 'currentTime': null, //音乐当前时间未赋值 'endTime': null //音乐结束时间未赋值 }; _music.init(); //初始化函数 }; U.MD.UI.music.Attr = null; //存放元素与变量的json全局变量 未赋值 U.MD.UI.music.htmlTemplate = '
\n' + '
\n' + ' \n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + '
\n' + ' '; /** * 添加音乐控件html代码 并且判断是否存在html 防止多次添加 */ U.MD.UI.music.create = function (parentEl) { var _parentEl = parentEl || document.body; var _formclass = { "style": { "border": "none" }, "id": "U_MD_UI_music_musicBox", "className": "U_MD_UI_music_musicBox" }; var _formattr = { isclose: false, isstretching: false, isenlarge: false, isnarrow: false }; var _headclass = { "style": { "height": "13px", "background-color": "#cc5b5b"} }; U.MD.UI.music.player = new U.UF.UI.form(false, U.MD.UI.music.htmlTemplate, _formclass, _formattr, _headclass); U.selectEl("#U_MD_UI_music_musicBox")[0].style.overflow = ""; // U.UF.F.windowMinimize(_formel); }; /** * 音乐控件初始化 */ U.MD.UI.music.init = function () { var _music = U.MD.UI.music; //简写命名空间 var _attr = _music.Attr; //简写全局属性json名 var _audio = U.selectEl("#U_MD_UI_music_audio"); //audio标签 var _musicList = _attr.musicList; //音乐列表数组 var _musicIndex = _attr.musicIndex; //需要播放的音乐(数组中的第index个) _audio[0].src = _musicList[_musicIndex].src; //添加音乐路径 var _playBtn = U.selectEl("#U_MD_UI_music_playBtn"); //暂停播放按钮节点 var _Name = U.selectEl("#U_MD_UI_music_Name"); //音乐名字节点 var _corver = U.selectEl("#U_MD_UI_music_Cover"); //封面图片节点 if (!_attr.autoplay) { //若autoplay属性 = false 则第一首音乐暂停 _audio[0].pause(); } _music.openBtnEvent(); //按钮点击开关 音乐控件隐藏 _music.shrinkBtnEvent(); //缩小事件绑定 _music.soundControl(); //声音控制器 _music.playEvent(); //音乐播放与暂停控制器 _music.switchMusic(); //切换音乐按钮 _music.progressControl(); //音乐进度条控制器*/ _audio.bind('durationchange', function () { //当音乐时长已改变时 给节点赋值 _attr.endTime = this.duration; //总时长赋值 _musicIndex = _attr.musicIndex; //音乐索引位置重赋值 _Name[0].innerText = _musicList[_musicIndex].title; //音乐名字赋值 }); _audio.bind("ended", function () { //音乐结束后切换下一首 _musicIndex = _attr.musicIndex; //由于_attr.musicIndex是一个变量 因此 需要重新赋值 var _listLength = _musicList.length - 1; //获取数组中音乐的长度 if (_musicIndex === _listLength) { //当音乐在数组中为最后一首时 下一首则为第一首 也就是索引 0 _attr.musicIndex = 0; _musicIndex = _attr.musicIndex; _audio[0].src = _musicList[_musicIndex].src; } else { //否则则索引+1 _attr.musicIndex++; _musicIndex = _attr.musicIndex; _audio[0].src = _musicList[_musicIndex].src; } }); }; /** * 关闭按钮点击事件 */ U.MD.UI.music.openBtnEvent = function () { var _music = U.MD.UI.music; //简写命名空间 // var _attr = _music.Attr; //简写全局属性json名 // var _musicBox = U.selectEl("#U_MD_UI_music_musicBox"); //获取音乐控件盒子 // var _closeBtn = U.selectEl("#U_MD_UI_music_closeBtn"); //获取关闭按钮 在控件里 右上角的 叉叉 U.selectEl("#U_MD_UI_music_closeBtn").bind('click', function () { var _audio = U.selectEl("#U_MD_UI_music_audio"); //audio标签 if (!_audio[0].paused) { U.selectEl("#U_MD_UI_music_playBtn").addClass('U_MD_UI_music_playBtn'); //暂停音乐并修改图标 _audio[0].pause(); } U.UF.F.closeWindow(_music.player.form); //调用窗体关闭函数 U.selectEl('#U_MD_D_T_taskbar_music').remove(); // _musicBox.addClass("U_MD_UI_music_hidden"); //点击关闭按钮后 隐藏音乐控件 // _musicBox.addClass("U_MD_UI_music_hidden"); //点击关闭按钮后 隐藏音乐控件 }); }; /** * 缩小按钮事件绑定 */ U.MD.UI.music.shrinkBtnEvent = function () { U.selectEl('#U_MD_UI_music_shrinkBtn').bind('click', function () { U.UF.F.windowMinimize(U.MD.UI.music.player.form); //窗体最小化处理 }); }; /** * 播放/暂停 的点击事件 */ U.MD.UI.music.playEvent = function () { var _music = U.MD.UI.music; //简写命名空间 var _attr = _music.Attr; //简写全局属性json名 var _playbtn = U.selectEl("#U_MD_UI_music_playBtn"); //暂停/播放 按钮 var _audio = U.selectEl("#U_MD_UI_music_audio"); //audio标签 _playbtn.bind('click', function () { if (!_audio[0].paused) { //如在 无暂停状态(播放状态) _playbtn.addClass('U_MD_UI_music_playBtn'); //暂停音乐并修改图标 _audio[0].pause(); } else { //否则则时 暂停状态时 _playbtn.removeClass('U_MD_UI_music_playBtn'); _audio[0].play(); //播放音乐并修改图标 } }); }; /** * 音乐按钮切换(上一首 下一首) */ U.MD.UI.music.switchMusic = function () { var _music = U.MD.UI.music; //简写命名空间 var _attr = _music.Attr; //简写全局属性json名 var _audio = U.selectEl("#U_MD_UI_music_audio"); //audio标签 var _rightBtn = U.selectEl("#U_MD_UI_music_rightBtn"); //获取下一首的按钮 var _leftBtn = U.selectEl("#U_MD_UI_music_leftBtn"); //获取上一首的按钮 var _musicList = _attr.musicList; //获取音乐数组数据 var _musicIndex = _attr.musicIndex; //获取当前需要播放音乐 的数组索引 var _listLength = _musicList.length - 1; //获取音乐的数量 _rightBtn.bind('click', function () { //当点击右边(下一首)的按钮时 _musicIndex = _attr.musicIndex; //由于_attr.musicIndex是一个变量 因此 需要重新赋值 if (_musicIndex === _listLength) { //如果当前的歌曲是最后一首时 _attr.musicIndex = 0; //则条转到第一首歌 _musicIndex = _attr.musicIndex; //给全局属性赋值 _audio[0].src = _musicList[_musicIndex].src; //并修改音乐路径 } else { //否则跳转到下一首歌 _attr.musicIndex++; //数组索引加1 _musicIndex = _attr.musicIndex; //给全局属性赋值 _audio[0].src = _musicList[_musicIndex].src; //并修改音乐路径 } }); _leftBtn.bind('click', function () { //同上 此处是左按钮(上一首) _musicIndex = _attr.musicIndex; //由于_attr.musicIndex是一个变量 因此 需要重新赋值 if (_musicIndex === 0) { _attr.musicIndex = _listLength; _musicIndex = _attr.musicIndex; _audio[0].src = _musicList[_musicIndex].src; } else { _attr.musicIndex--; _musicIndex = _attr.musicIndex; _audio[0].src = _musicList[_musicIndex].src; } }); }; /** * 声音事件控制 总函数 */ U.MD.UI.music.soundControl = function () { var _music = U.MD.UI.music; //简写命名空间 var _audio = U.selectEl("#U_MD_UI_music_audio"); //audio标签 var _soundBox = U.selectEl("#U_MD_UI_music_soundBox"); //声音盒子节点 var _soundBall = U.selectEl("#U_MD_UI_music_soundBall"); //音量球 var _soundBar = U.selectEl("#U_MD_UI_music_soundBar"); //声音条 var _boxWidth = _soundBox[0].clientWidth; //获取盒子宽度 = 声音球位置的最大值 var _volume = 0.5; //声音初始大小 var _soundSwitch = U.selectEl("#U_MD_UI_music_soundSwitch"); //声音开关图标 _audio[0].volume = _volume; //给audio标签添加声音 _soundBall[0].style.left = (_boxWidth * _volume) + "px"; //调整音量球位置 = 总宽度*百分比 _soundBar[0].style.width = (_boxWidth * _volume) + "px"; //调整声音条宽度 = 总宽度*百分比 _soundSwitch.bind('click', function () { //声音开关控制函数 _music.toggleClass(this, 'U_MD_UI_music_soundClose'); //每点击一次 切换样式 if ($(this).hasClass('U_MD_UI_music_soundClose')) { //判断如果样式为关闭时(静音状态) this._volume = _audio[0].volume; //记录原有的声音值 this._soundBallX = parseFloat(_soundBall.css("left")); //获取音量球的 left值 this._soundBarW = parseFloat(_soundBar.css("width")); //获取音量条的 宽 _soundBall[0].style.left = 0; //音量球的left为0 _soundBar[0].style.width = 0; //音量条的宽为 0 _audio[0].volume = 0; //audio声音也为0 } else { //播放状态 if (!this._volume) { //如果this._volume不存在 则声音赋值时会报错 return; } _audio[0].volume = this._volume; //在点一遍开关后 复原到之前记录的值 _soundBall[0].style.left = this._soundBallX + "px"; //给音量球的left赋值 _soundBar[0].style.width = this._soundBarW + "px"; //给音量条的宽赋值 } }); _soundBox.bind('mousedown', function (e) { //点击进度条后 音量球跳转到鼠标点击位置 并且声音跟随增大或减小 var _boxLeft = _music.getOffsetLeft(this); //body距离盒子左端的left值 = 声音球left的最小值 var _boxRight = _boxLeft + _boxWidth; //body距离盒子右端的left值 = 声音球left的最大值 var _mouseX = e.pageX; //获取鼠标按下时的X坐标 _mouseX = Math.max(_mouseX, _boxLeft); //mouseX 与 boxLeft距离不能小于0 因此 获取两数最大值 原因:声音不能小于0 _mouseX = Math.min(_mouseX, _boxRight); //mouseX 与 boxRight因此 获取两数最大值 原因:声音不能大于1 var _dis = _mouseX - _boxLeft; //鼠标划过的距离 _volume = Math.round(parseFloat(_dis / _boxWidth) * 100) / 100; //距离相对于盒子宽度的值 = 声音百分比大小(此处为保留两位小数点) _soundBall[0].style.left = (_boxWidth * _volume) + "px"; //音量球left值 改变成 = 总宽*百分比 _soundBar[0].style.width = (_boxWidth * _volume) + "px"; //音量条width 改变成 = 总宽*百分比 _audio[0].volume = _volume; //改变audio标签值 if (_audio[0].volume <= 0) { //如果声音小于=0 时 则改变成 静音状态时的样式 否则则是非静音状态样式 _soundSwitch.addClass('U_MD_UI_music_soundClose'); } else { _soundSwitch.removeClass('U_MD_UI_music_soundClose'); } }); _soundBall.bind('mousedown', function (e) { //音量球拖拽效果 U.UF.EV.stopBubble(e); //阻止冒泡 var _oMouseX = e.pageX; //获取鼠标按下时的X坐标 var _soundDrapMove = function (e) { //拖拽时移动用的函数 U.UF.EV.stopDefault(e); //取消默认拖拽 var _mouseX = e.pageX; //鼠标移动时的x坐标 var _dis = _mouseX - _oMouseX + _oX; //移动的距离 _dis = Math.max(0, _dis); //限制音量球left不得小于0 _dis = Math.min(_boxWidth, _dis); //限制音量球left不得大于盒子宽度 _soundBall[0].style.left = _dis + "px"; //音量球位置 _soundBar[0].style.width = _dis + "px"; //音量条宽度 _volume = Math.round(parseFloat(_dis / _boxWidth) * 100) / 100; //声音球距离盒子宽度的left值 = 声音百分比大小(此处为保留两位小数点) _audio[0].volume = _volume; //音乐的声音赋值 if (_audio[0].volume <= 0) { //判断声音小于0则改成静音图标 _soundSwitch.addClass('U_MD_UI_music_soundClose'); } else { //否则该成非静音图标 _soundSwitch.removeClass('U_MD_UI_music_soundClose'); } }; var _soundDragUp = function () { //拖拽时松开用的函数 U.selectEl(document).unbind('mousemove', _soundDrapMove); U.selectEl(document).unbind('mouseup', _soundDragUp); }; var _oX = parseFloat(_soundBall.css("left")); //获取鼠标按下时音量球的坐标 U.selectEl(document).bind('mousemove', _soundDrapMove); U.selectEl(document).bind('mouseup', _soundDragUp) }); }; /** * 进度条控制 事件总函数 */ U.MD.UI.music.progressControl = function () { var _music = U.MD.UI.music; //简写命名空间 var _attr = _music.Attr; //简写全局属性json名 var _audio = U.selectEl("#U_MD_UI_music_audio"); //audio标签 var _progressBox = U.selectEl("#U_MD_UI_music_progressBox"); //时间盒子节点 var _progressBall = U.selectEl("#U_MD_UI_music_progressBall"); //时间球 var _progressBar = U.selectEl("#U_MD_UI_music_progressBar"); //时间条 var _playbtn = U.selectEl("#U_MD_UI_music_playBtn"); //播放/暂停 按钮 var _boxWidth = _progressBox[0].clientWidth; //时间盒子宽度 = 时间球位置的最大值 var _barFlag = true, _currentTime; //声明两个全局变量 为更新时间条所用 _audio.bind('timeupdate', function () { if (!this.paused) { //如在 无暂停状态(播放状态) _playbtn.removeClass('U_MD_UI_music_playBtn'); //修改成 播放时用的图标 } else { //否则 为暂停状态 _playbtn.addClass('U_MD_UI_music_playBtn'); //修改成暂停用的图标 } if (_barFlag) { //barFlag = true 为 时间球不在拖拽状态时 _currentTime = this.currentTime; //获取音乐当前播放时间 var _speed = Math.round(parseFloat(_currentTime / _attr.endTime) * 10000) / 10000; //_speed = 当前时间相对于总时长的 百分比 _progressBall[0].style.left = (_boxWidth * _speed) + "px"; //时间球的left = _speed(百分比)*总宽度 _progressBar[0].style.width = (_boxWidth * _speed) + "px"; //时间条的width = _speed(百分比)*总宽度 } }); _progressBox.bind('mousedown', function (e) { //点击进度条后 时间球跳转到鼠标点击位置 时间跟随改变 var _boxLeft = _music.getOffsetLeft(this); //body距离盒子左端的left值 = 时间球left的最小值 var _boxRight = _boxLeft + _boxWidth; //body距离盒子右端的left值 = 时间球left的最大值 var _mouseX = e.pageX; //获取鼠标按下时的X坐标 _mouseX = Math.max(_mouseX, _boxLeft); //mouseX 与 boxLeft距离不能小于0 因此 获取两数最大值 原因:声音不能小于0 _mouseX = Math.min(_mouseX, _boxRight); //mouseX 与 boxRight因此 获取两数最大值 原因:声音不能大于1 var _dis = _mouseX - _boxLeft; //鼠标划过的距离 _speed = Math.round(parseFloat(_dis / _boxWidth) * 10000) / 10000; //时间球距离盒子宽度的left值 = 时间当前值/总时长(此处为保留4位小数点) _progressBall[0].style.left = (_boxWidth * _speed) + "px"; _progressBar[0].style.width = (_boxWidth * _speed) + "px"; _audio[0].currentTime = _attr.endTime * _speed; }); _progressBall.bind('mousedown', function (e) { //时间球拖拽效果 _barFlag = false; //拖拽时 时间球跟随声音播放向前移动状态暂时屏蔽 详细见 timeupdate监听 U.UF.EV.stopBubble(e); //阻止冒泡 var _oMouseX = e.pageX; //获取鼠标按下时的X坐标 var _progressDrapMove = function (e) { //拖拽移动时的函数 U.UF.EV.stopDefault(e); //取消默认拖拽 var _mouseX = e.pageX; //鼠标移动时的x坐标 var _dis = _mouseX - _oMouseX + _oX; //移动的距离 _dis = Math.max(0, _dis); //限制音量球left不得小于0 _dis = Math.min(_boxWidth, _dis); //限制音量球left不得大于盒子宽度 _progressBall[0].style.left = _dis + "px"; //音量球位置 _progressBar[0].style.width = _dis + "px"; //音量条宽度 _speed = Math.round(parseFloat(_dis / _boxWidth) * 10000) / 10000; //时间球距离盒子宽度的left值 = 时间当前值/总时长(此处为保留4位小数点) _progressBall[0].style.left = (_boxWidth * _speed) + "px"; //时间球的left = 总宽*百分比 _progressBar[0].style.width = (_boxWidth * _speed) + "px"; //时间条的width = 总宽*百分比 _currentTime = _attr.endTime * _speed; //当前时间 = 音乐总时长*百分比 }; var _progressDragUp = function () { //拖拽松开后的函数 _barFlag = true; //拖拽后松开时 时间球跟随声音播放向前移动 _audio[0].currentTime = _currentTime; //当前重新赋值 U.selectEl(document).unbind('mousemove', _progressDrapMove); //删除 mousemove的监听事件 U.selectEl(document).unbind('mouseup', _progressDragUp); //删除mouseup的监听事件 }; var _oX = parseFloat(_progressBall.css("left")); //获取鼠标按下时音量球的坐标 U.selectEl(document).bind('mousemove', _progressDrapMove); U.selectEl(document).bind('mouseup', _progressDragUp) }); }; U.MD.UI.music.getOffsetLeft = function (obj) { var tmp = obj.offsetLeft; var val = obj.offsetParent; while (val != null) { tmp += val.offsetLeft; val = val.offsetParent; } return tmp; }; U.MD.UI.music.secondToDate = function (result) { var m = Math.floor((result / 60 % 60)); var s = Math.floor((result % 60)); if (m < 10) { m = "0" + m; } if (s < 10) { s = "0" + s; } return result = m + ":" + s; }; U.MD.UI.music.toggleClass = function (ele, cls) { //如果存在(不存在),就删除(添加)一个样式 if ($(ele).hasClass(cls)) { U.selectEl(ele).removeClass(cls); } else { U.selectEl(ele).addClass(cls); } };