html5學習之音樂播放器的結構整理

花了一點時間 整理下昨天的播放器,將結構優化了點,方便今後維護和擴展。


如昨天的想法一樣,又添加了播放/暫停的切換按鈕和隨機切換。

另外的界面樣式以及歌曲顯示部分 暫時沒空搞了。

思路如下:再添加一個div 用於展現數組裏的歌曲,其中我還不清楚js是否可以動態加載我磁盤裏的文件,感覺應該可以的,這裏不談,用數組代替。

展現的歌曲根據數組索引進行分頁和展示,添加相應的單擊事件 方便用戶選擇喜歡的歌曲 分頁以方便展示  另外可以添加一個搜索框 用於查詢相應關鍵字的歌曲。

也可以設置歌曲的播放模式、是否搜索歌曲的播放...等等。 今後有想法了 再擴展吧。 要睡了...

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <title>我的MusicPlayer</title>
</head>
<script>
    MyUtil = {
        /**
         * 添加單擊事件監聽
         * @param htmlElement
         * @param callback
         * @param scope
         */
        addClickEvent:function(htmlElement,callback,scope){
            htmlElement.onclick = function(event){
                callback.call(scope||this,event);
            }
        },
        /**
         * 生產隨機數
         * @param m
         * @param n
         * @return {Number}
         */
        randomInt:function(m,n){
            if(!n){
                n=m;
                m=0;
            }
            if(m>n){
                var temp = m;
                m=n;
                n = temp;
            }
            return Math.floor(Math.random() *(n-m+1)+m);
        }
    };
    MyMusicPlayer = function(){
        var obj = arguments[0]||{};//以對象形式傳入,格式暫未定
       this.isInitPaly = obj['isInitPlay']==true;//是否初始化播放
        this.musicList =  ["(韓德爾) - 最緩板.mp3", "- 絕對真實的BABY笑聲(搞怪另類鈴聲首選).mp3", "30552812.mp3", "30575109.mp3", "7 Days (Album Version).mp3", "Aint Sayin Nothin.mp3", "Are You The One.mp3", "Ballet.mp3", "Beat It.mp3", "Bela Bartok - 第三號鋼琴協奏曲(彼得杜諾荷).mp3", "Billie Jean.mp3", "Bon Jovi - Save the World.mp3", "Celine Dion - My Heart Will Go On (Titanic).mp3", "Dangerous.mp3", "Daughters.mp3", "Daughtry - Home.mp3", "DEPAPEPE - Flow.mp3", "Fall Again.mp3", "Fiona Joy Hawkins - 第二樂章“永恆之愛”.mp3", "Hey Jude.mp3", "Home (Album Version).mp3", "I Finally Found Someone.mp3", "I Just Can'T Stop Loving You.mp3", "I Like It, I Love It.mp3", "I Told You So.mp3", "I'll Be Fine.mp3", "Ice Box.mp3", "Jar Of Love.mp3", "LALALOVE.mp3", "Lovefool.mp3", "Matthew West - Family Tree.mp3", "Mobile.mp3", "No Woman No Cry.mp3", "Pacific Moon - A So Bi Ma Sho.mp3", "Red Bean 紅豆.mp3", "Reflection.mp3", "Resident Evil Suite.mp3", "Resta In Ascolto.mp3", "Rush Of Fools - Grace Found Me.mp3", "Satisfied.mp3", "Should It Matter.mp3", "Soul Boy.mp3", "Stellar Kart - Everything Is Different Now.mp3", "Take Me To Your Heart(With Hyesung).mp3", "The Final Countdown.mp3", "The Rasmus - Sail Away.mp3", "Theory of a Deadman - Easy To Love You.mp3", "Traveling Light.mp3", "Trouble Is A Friend.mp3", "Under The Mango Tree.mp3", "Valsa Carioca.mp3", "Vindicated.mp3", "We On feat Yo Gotti.mp3", "WestLife - i lay my love on you.mp3", "WestLife - my love.mp3", "WestLife - You Raise Me Up.mp3", "Yalli Nassi.mp3", "Yesterday.mp3", "yiyong.mp3", "Ʈѩ.mp3", "一個人.mp3", "一生何求.mp3", "一生所愛.mp3", "一生有你.mp3", "下雨的時候會想你.mp3", "不要用我的愛來傷害我.mp3", "不要說話.mp3", "世間情歌.mp3", "中國好聲音.mp3", "他一定很愛你.mp3", "你的樣子.mp3", "信樂團 - 海闊天空.mp3", "偏偏喜歡你.mp3", "冬季到臺北來看雨.mp3", "冷雨夜.mp3", "刀郎 - 永遠的兄弟.mp3", "努力活着.mp3", "勃拉姆斯 - 搖籃曲.mp3", "千百度.mp3", "原來你也在這裏.mp3", "可否衝破.mp3", "司文 - 光棍好苦.mp3", "周華健 - 難唸的經.mp3", "回心轉意.mp3", "在水一方.mp3", "外婆的澎湖灣.mp3", "夜生帶走最後一個我.mp3", "大海.mp3", "天堂.mp3", "天天看到你.mp3", "天黑.mp3", "女兒情.mp3", "她來聽我的演唱會.mp3", "如果這都不算愛.mp3", "姑娘我愛你.mp3", "娃娃 - 漂洋過海來看你.mp3", "孫燕姿 - 開始懂了.mp3", "左右爲難.mp3", "差一點.mp3", "巴達捷夫斯卡 - 少女的祈禱.mp3", "廬州月.mp3", "張學友 - 每次都想呼喊你的名字.mp3", "張宇 - 用心良苦.mp3", "張宇 - 男人的好.mp3", "張懸 - 寶貝.mp3", "張惠妹 - 我可以抱你嗎.mp3", "張棟樑 - 當你孤單你會想起誰.mp3", "彎彎的月亮.mp3", "歸來吧.mp3", "德沃夏克 - 寂靜的森林(選自g小調大提琴與樂隊).mp3", "德沃夏克 - 幽默曲.mp3", "心的方向.mp3", "思念是一種病.mp3", "戀曲1990.mp3", "情書.mp3", "想和你去吹吹風.mp3", "想把我唱給你聽.mp3", "我一定要得到你.mp3", "我們愛這個錯.mp3", "我們都是好孩子.mp3", "我是真的真的很愛妳.mp3", "我的好兄弟.mp3", "我的歌聲裏.mp3", "掀起你的蓋頭來.mp3", "斷橋殘雪.mp3", "斷點(國).mp3", "明天會更好.mp3", "曼託瓦尼 - 晨曲.mp3", "有多少愛可以重來.mp3", "有沒有人告訴你.mp3", "李民浩 - 城市獵人.mp3", "李貞賢 - 說吧.mp3", "柴可夫斯基 - 如歌的行板.mp3", "每一步.mp3", "汪峯 - 我們的愛情.mp3", "沙寶亮 - 暗香.mp3", "沒有你的日子我真的好孤單.mp3", "沒有情人的情人節.mp3", "浪子心聲.mp3", "海鳴威 - 老人與海.mp3", "濤聲依舊.mp3", "清明雨上.mp3", "溫哥華悲傷一號.mp3", "漂洋過海來看你.mp3", "灌籃高手 - 只凝視着你(灌籃高手插曲).mp3", "灌籃高手 - 好想大聲叫喜歡你(灌籃高手片頭曲).mp3", "灌籃高手 - 直到世界盡頭.mp3", "灰色頭像.mp3", "愛你在心口難開.mp3", "愛的代價.mp3", "牛朝陽 - 愛情乞丐.mp3", "牧羊曲.mp3", "玻璃杯.mp3", "電臺情歌.mp3", "癢.mp3", "癡心的我.mp3", "白狐.mp3", "相愛的淚水.mp3", "相見不如懷念.mp3", "離別.mp3", "秋天不回來.mp3", "空城.mp3", "突然的自我.mp3", "笑紅塵.mp3", "筷子兄弟 - 祝福你親愛的.mp3", "筷子兄弟 - 老男孩.mp3", "紅色石頭.mp3", "純音樂 - 卡農.mp3", "純音樂 - 聖母頌 (舒伯特).mp3", "美人吟.mp3", "羞答答的玫瑰靜悄悄的開.mp3", "羣星 - C大調第3弦奏鳴曲 中板.mp3", "羣星 - 小抒情調 (巴赫).mp3", "老師你好.mp3", "肖邦 - 雨滴前奏曲.mp3", "胎教音樂 - 小溪和月亮的歌兒(C大調長笛與豎琴協奏曲).mp3", "胎教音樂 - 布蘭登堡協奏曲.mp3", "舒伯特 - 小夜曲(選自《天鵝之歌》).mp3", "舒曼 - 夢幻曲(選自《童年情景》).mp3", "英格蘭民歌 - 你的秋波使我陶醉.mp3", "薩頂頂 - 萬物生 (中文版).mp3", "藍蓮花.mp3", "西城男孩 - my love.mp3", "西海情歌.mp3", "觸電.mp3", "說好的幸福呢.mp3", "謝軍 - 那一夜.mp3", "谷村新司.-.風姿花傳.mp3", "貝多芬 - 月光奏鳴曲.mp3", "貝多芬 - 給愛麗絲.mp3", "輸了你贏了世界有如何.mp3", "邁克爾·傑克遜 - You Are Not Alone (Radio Edit).mp3", "追夢人.mp3", "那些花兒.mp3", "酸酸甜甜就是我.mp3", "鐵齒銅牙紀曉嵐.mp3", "鏡子.面具.mp3", "門德爾鬆 - 乘着歌聲的翅膀(鋼琴版).mp3", "陳奕迅_王菲 - 因爲愛情.mp3", "陳小春 - 我愛的人.mp3", "陳楚生 - 傾國傾城.mp3", "雨蝶.mp3", "青春舞曲.mp3", "韓寶儀 - 粉紅色的回憶.mp3", "風往北吹.mp3", "馬友友 - 德弗札克:B小調大提琴協奏曲,作品104 第三樂章:終樂章.mp3", "魯冰花.mp3", "黃小琥 - 白天不懂夜的黑(清晰版).mp3", "黃昏.mp3"];//音樂列表
        this.playIndex = MyUtil.randomInt(this.musicList.length-1);
        this.audio;//html音頻對象
        this.musicNameShow = this.musicList[this.playIndex];//音樂顯示名稱
        this.topDiv;//頂層DIV 用於包裹這個播放器 和訪問這個播放器裏的一些元素
        this.volume = obj.volume||0.2;//音量 默認0.2
        this.myInterval = null;

        if(this.isInitPaly){
            this.playOrPauseBtnInnerHtml = '暫停';
        }else{
            this.playOrPauseBtnInnerHtml = '播放';
        }
        //這裏今後會添加對初始參數的處理和動態加載音頻數據--只需添加愛相應的文件夾,或則文件也行
        //還有文件列表 會在前端 用於用戶自由選擇和顯示
        //this._init();
        this._init.call(this);
    };
    MyMusicPlayer.prototype = {
        /**
         * 初始化
         */
        _init:function(){
            this._initView();
            this._initController();
        },
        /**
         * 初始化界面
         */
        _initView:function(){
            var topDiv =  this.topDiv = document.createElement('div');//創建頂層DIV
            /*音頻對象的初始化 start*/
            var audio = this.audio = document.createElement('audio');//創建音頻對象
            audio.controls = "controls";//控制權交給用戶
            audio.volume = this.volume;//初始化音量

            audio.src = 'file:///E:/Music/'+ this.musicNameShow;
            /*音頻對象的初始化 end*/

            /*按鈕組的初始化 start*/
            var playOrPauseBtn = this.playOrPauseBtn = document.createElement('button');
            playOrPauseBtn.innerHTML = this.playOrPauseBtnInnerHtml;
            var forwardBtn = this.forwardBtn = document.createElement('button');
            forwardBtn.innerHTML = '上一曲';
            var againBtn = this.againBtn = document.createElement('button');
            againBtn.innerHTML = '重新聽';
            var nextBtn = this.nextBtn = document.createElement('button');
            nextBtn.innerHTML ='下一曲';
            var randomBtn = this.randomBtn = document.createElement('button');
            randomBtn.innerHTML = '隨機聽';
            /*按鈕組的初始化 end*/

            /*音樂名稱顯示div的初始化 start*/
            this.showMusicName = document.createElement('div');
            this.showMusicName.innerHTML = this.musicNameShow;
            /*音樂名稱顯示div的初始化 end*/

            //將以上元素添加到頂層IDV中
            topDiv.appendChild(audio);
            topDiv.appendChild(document.createElement('BR'));//換行
            topDiv.appendChild(this.showMusicName);
            //topDiv.appendChild(document.createElement('BR'));//換行
            topDiv.appendChild(playOrPauseBtn);
            topDiv.appendChild(forwardBtn);
            topDiv.appendChild(againBtn);
            topDiv.appendChild(nextBtn);
            topDiv.appendChild(randomBtn)


        },
        /**
         * 初始化控制層
         * @private
         */
        _initController:function(){
            if(this.isInitPaly){
                this.play();
            }
            /*按鈕功能控制 start*/
            //暫停或播放按鈕
            MyUtil.addClickEvent(this.playOrPauseBtn,function(){
                if(this.isInitPaly){
                    this.pause();
                }else{
                    this.play();
                }
            },this);
            //上一曲按鈕
            MyUtil.addClickEvent(this.forwardBtn,function(){
                  this._play(-1);
            },this);
            //重新聽
            MyUtil.addClickEvent(this.againBtn,function(){
                this._play(0);
            },this);
            //下一曲
            MyUtil.addClickEvent(this.nextBtn,function(){
               this._play(1);
            },this);

            MyUtil.addClickEvent(this.randomBtn,function(){
                this._play(MyUtil.randomInt(this.musicList.length-1),false);
            },this);

            /*按鈕功能控制 end*/
        },
        /**
         * 播放
         */
        play:function(){
            this.playOrPauseBtn.innerHTML = '暫停';
            this.isInitPaly = true;
            this.showMusicName.innerHTML = this.musicNameShow;
            this.audio.play();
            var me = this;
            var isEnd = function(){
                if(me._isEnded()){
                    me._play(1);
                }
            }
            if(this.myInterval){clearInterval(this.myInterval);}
            this.myInterval = setInterval(isEnd,100);//每毫秒都監聽該歌曲是否結束 如果結束則自動切換至下一首
        },
        /**
         * 暫停
         */
        pause:function(){
            this.playOrPauseBtn.innerHTML = '播放';
            this.isInitPaly = false;
            this.audio.pause();
        },
        /**
         * 內部調用的播放控制方法
         * @param {Number} index 索引值
         * @param {Boolean} flag 是否遞增 如果遞增 則累加  不是遞增則爲index 默認true
         * @private
         */
        _play:function(index,flag){
             var _flag  = flag ? false:true;
             if(_flag){//如果是遞增
                 this.playIndex = this.playIndex + index;
             }else{//如果不是  這裏暫時用於隨機
                 this.playIndex = index;
             }

            if(this.playIndex<=0){//自動循環
                this.playIndex = this.musicList.length - 1;
            }else if(this.playIndex>=this.musicList.length-1){
                this.playIndex = 0;
            }

            this.musicNameShow = this.musicList[this.playIndex];
            this.audio.src = "file:///E:/Music/"+ this.musicNameShow;
            this.play();
        },
        /**
         * 是否播放結束
         * @return {Boolean}
         * @private
         */
        _isEnded:function(){
            return this.audio.ended;
        },
        /**
         * 渲染到頁面元素爲id的地方
         * @param id
         */
        render:function(id){
            document.getElementById(id).appendChild(this.topDiv);
        }
    };

    window.onload = function(){
        var myPlayer = new MyMusicPlayer();
        myPlayer.render("myMusicPlayer");

        var myPlayer2 = new MyMusicPlayer({isInitPlay:true});//這裏測試添加初始化參數
        myPlayer2.render("myMusicPlayer2");
    }

</script>
<body>
<div id="myMusicPlayer"></div>
<div id="myMusicPlayer2"></div>
</body>
</html>
如代碼所述:我將整體結構已函數的形式整理了下 使用時只需new個對象 將該對象渲染到某個id的html元素上 即可。

有關歌曲以及路徑 可以根據您的磁盤放置情況 自己更改。sleep...

----------------------------------------------------------------------------------------

失眠了,順便查了下JS讀取磁盤的方式,發現只有IE可以...其他不支持這種不安全方式啊...

//http://hi.baidu.com/elick/item/5a7fec0c40b680ce91571821
        //http://heisetoufa.iteye.com/blog/342767

本來計劃搞個格式爲[文件路徑1:['文件1','文件N'],文件路徑N:['文件1','文件N']]這樣的讀取格式,其中文件路徑我只需輸入 然後程序自動將文件讀取加載到數組裏呢

不過發現瀏覽器不支持的緣故,看來曲線救國的方式就是使用後端語言先生成個這種格式的文件,然後讀取這個文件...

當然藉助JS框架也是可行的。



發佈了95 篇原創文章 · 獲贊 14 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章