• JS高级——面向对象方式解决歌曲管理问题


    需要注意的问题:

    1、其他模块若是使用构造函数MP3创建对象,唯一不同的就是他们传入的音乐库是不一样的,所以构造函数中存在一个songList属性,其他一样的就被添加到了构造函数的原型对象之中

    2、原型对象是直接替换的,所以会失去constructor属性,我们最好给这个属性重新赋值

    3、我们new的过程中,就可以将传入的音乐库进行提取然后渲染到浏览器上,所以在属性中我们在new过程中就去执行render()方法

    4、还有在CURD的方法调用中,只要修改了原来的songList库就必须再次调用render()方法

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            * {
                padding: 0;
                margin: 0;
            }
    
            .clearfix::after {
                content: '';
                visibility: hidden;
                display: block;
                clear: both;
            }
    
            .container {
                width: 800px;
                margin: 0 auto;
                border: 1px solid #000;
            }
    
            .songslist-top {
                height: 50px;
                line-height: 50px;
            }
    
            .songslist-header span {
                display: inline-block;
                float: left;
                width: 350px;
                height: 50px;
                line-height: 50px;
                text-align: center;
                background-color: lightblue;
                border-right: 1px solid black;
            }
    
            .songslist-header span:nth-child(3) {
                border-right: none;
                width: 98px;
            }
    
            .songslist-single {
                height: 50px;
                line-height: 50px;
            }
    
            .songslist-single .songslist-name {
                display: block;
                float: left;
                width: 350px;
                text-align: center;
    
            }
    
            .songslist-single .songslist-singer {
                width: 350px;
                display: block;
                float: left;
                text-align: center;
            }
        </style>
    </head>
    <body>
    <div class="container">
        <div class="songslist-top">
            歌曲名:<input type="text">&nbsp;&nbsp;&nbsp;&nbsp;
            歌手名:<input type="text">&nbsp;&nbsp;&nbsp;&nbsp;
            <input type="button" value="添加">&nbsp;&nbsp;&nbsp;&nbsp;
            <input type="button" value="修改">&nbsp;&nbsp;&nbsp;&nbsp;
            <input type="button" value="删除">&nbsp;&nbsp;&nbsp;&nbsp;
        </div>
        <div class="songslist-header clearfix">
            <span>歌曲名</span>
            <span>歌手名</span>
            <span>操作</span>
        </div>
        <div class="songslist-main clearfix">
            <div class="songslist-single">
                <span class="songslist-name">dd</span>
                <span class="songslist-singer">dd</span>
            </div>
        </div>
    </div>
    <script>
    
        function MP3(songs) {
            //songList属性用来存储歌曲信息
            //当创建歌曲管理工具实例的时候,如果有参数传进来就将参数赋值给songList,如果没有就给一个空数组
            this.songList = songs || [];
            this._init();
        }
    
        MP3.prototype = {
            ////由于是替换原型对象,所以constructor属性会丢失,所以需要手动设置
            constructor: MP3,
            _init: function () {
                this.render();
            },
            //数据驱动,只要歌曲列表发生改变,就调用render方法,将页面上信息进行刷新渲染
            render: function () {
                //获取到歌曲列表的父盒子
                var listDiv = document.getElementsByClassName("songslist-main")[0];
                //定义这个数组用来拼接字符串
                var strArr = [];
                //遍历歌曲列表中所有的歌曲信息
                for (var i = 0; i < this.songList.length; i++) {
                    var song = this.songList[i];
                    //使用每一个歌曲信息,拼接单独的歌曲html字符串
                    strArr.push('<span class="songslist-single">' +
                        '<span class="songslist-name">' + song.name + '</span>' +
                        '<span class="songslist-singer">' + song.singer + '</span>' +
                        '</span>');
                }
                //将所有的歌曲信息html字符串进行组合
                var str = strArr.join("");
                //直接将父盒子的内容修改为已经拼接好的字符串
                listDiv.innerHTML = str;
            },
            //查询
            selectSong: function (songName) {
                for (var i = 0; i < this.songList.length; i++) {
                    var song = this.songList[i];
                    if (song.name == songName) {
                        return song;
                    }
                }
                return null;
            },
            //增加
            addSong: function (songName, singer) {
                //判断是否有传入参数,而且要判断传入参数是否为空字符串
    
                // if(!songName||!singer){
                //      throw "请以正确方式添加歌曲!";
                // }
    
                if (songName == undefined || singer == undefined || songName == "" || singer == "") {
                    throw "请以正确方式添加歌曲!";
                }
                //使用传入的参数,构建一个歌曲对象
                var temp = {name: songName, singer: singer}
                //将歌曲对象添加到songList中
                this.songList.push(temp);
                //在根据歌曲列表重新渲染页面
                this.render();
                return temp;
            },
            //删除
            removeSong: function (songName) {
                //调用seleteSong方法找到指定歌曲
                var song = this.selectSong(songName);
                //获取这个歌曲在歌曲列表中索引
                var index = this.songList.indexOf(song);
                //判断这个索引是不是为-1 也就是与没有找到
                if (index != -1) {
                    //如果直到了,就直接将其从数组中删除
                    this.songList.splice(index, 1);
                    //因为数组改变了,所以再次重新渲染
                    this.render();
                    return true;
                } else {
                    return false;
                }
            },
            //修改
            updateSong: function (songName, singer) {
                var song = this.selectSong(songName);
                if (song == null) {
                    return null;
                } else {
                    song.singer = singer;
                    this.render();
                    return song;
                }
            }
        };
        var arr = [
            {name: '哎呦', singer: '石磊'},
            {name: '青春之歌', singer: '石磊'},
            {name: '最后一首歌', singer: '石磊'},
            {name: '我把青春另存了', singer: '石磊'},
        ];
        var mp3 = new MP3(arr);
        var songName = document.getElementsByTagName('input')[0];
        var songerName = document.getElementsByTagName('input')[1];
        var addBtn = document.getElementsByTagName('input')[2];
        var updateBtn = document.getElementsByTagName('input')[3];
        var removeBtn = document.getElementsByTagName('input')[4];
        console.log(addBtn);
        addBtn.onclick = function () {
            var song = songName.value;
            var singer = songerName.value;
            if (song.trim() !== "" && singer.trim() !== "") {
                mp3.addSong(song, singer);
            }
        }
        updateBtn.onclick=function () {
            var song = songName.value;
            var singer = songerName.value;
            if (song.trim() !== "" && singer.trim() !== "") {
                mp3.updateSong(song, singer);
            }
        }
        removeBtn.onclick = function () {
            var song = songName.value;
            if (song.trim() !== "") {
                mp3.removeSong(song);
            }
        }
    </script>
    </body>
    </html>

  • 相关阅读:
    转 | 禁忌搜索算法(Tabu Search)求解带时间窗的车辆路径规划问题详解(附Java代码)
    Branch and price and cut求解传统VRP问题以及VRPTW问题
    标号法(label-setting algorithm)求解带时间窗的最短路问题(ESPPRC)
    运筹学从何学起?如何快速入门精确式算法?
    转 | 模拟退火算法(SA)和迭代局部搜索(ILS)求解TSP的Java代码分享
    用Python画论文折线图、曲线图?几个代码模板轻松搞定!
    45. 截取“测试数据”后面的内容
    44. 更改oracle字符集编码american_america.zh16gbk 改为 SIMPLIFIED CHINESE_CHINA.ZHS16GBK
    18. 浏览器关闭页面时弹出“确定要离开此面吗?”
    6. concat_ws用法
  • 原文地址:https://www.cnblogs.com/wuqiuxue/p/8366454.html
Copyright © 2020-2023  润新知