Python学习 Day 046 - DOM 操作 二

本文深入解析了JavaScript中DOM操作的高级技巧,包括创建、追加、删除节点,以及使用面向对象的方式提升代码效率。同时,文章探讨了定时器的使用场景和优化策略,为前端开发者提供了实用的编程指南。

主要内容:

  • 1.DOM的操作(创建,追加,删除)
  • 2.js中的面向对象
  • 3.定时器

1. DOM的操作(创建,追加,删除)

(1)DOM节点的获取

  • parentNode 获取父级标签

  • nextElementSibling 获取下一个兄弟节点

  • children 获取所有的子标签

    <script>
        var oP = document.getElementById("wuxia");
        console.log(oP.parentNode); // 父级div标签下的所有内容
        console.log(oP.nextElementSibling.innerText);  //萧峰
        console.log(oP.nextSibling.innerText); // IE浏览器
        
        var a = oP.nextElementSibling|| oP.nextSibling;
        console.log(a);
        console.log(oP.parentNode.childen);
    </script>

(2) DOM的增删操作

创建 createElement()

//既可以创建已有的标签,还可以创建自定义的标签
var oDiv = document.createElement('div')

追加 appendChild() 父子标签操作

父.appendChild(oDiv);

删除 removeChild()

父.removeChild(子节点);
自己.parentNode.removeChild(自己)

插入insertBefore()

父.insertBefore(新的子节点,要参考的节点)

利用创建删除实现隐藏代码示例

    <script>
        var oBtn = document.querySelector("#btn");
        var oDel = document.querySelector("#del");
        var oFather = document.querySelector(".father");

        var oP = null;
        var oA = null;
        oBtn.onclick = function(){
            //创建 dom p标签
            oP = document.createElement("p");
            oA = document.createElement("a");
            //追加到父级标签中
            oFather.appendChild(oP);
            oFather.insertBefore(oA,oP);
            //设置对象属性值
            oA.href = 'http://www.baidu.com';
            //设置值
            oA.innerText="百度";
            oP.innerHTML = "alex";
            oP.setAttribute("class","active")
        };
        oDel.onclick = function(){
            //如果oP对象存在就结束程序
            if (!oP){
                return;
            //
            }else{
                console.log(oFather);
                //将增加的p标签移出
                oFather.removeChild(oP)
            }
        }
    </script>

(3) 网页中显示隐藏性能消耗问题

1.可以通过控制元素的类名或者是style属性,对元素进行显示隐藏
    好处: 可以在网页中频繁性的切换,主要控制的是display:none|block;
    坏处: 文档初始化会有渲染开销,但是这点开销不算什么.
2.通过DOM操作 appendChild和removeChild 对元素显示隐藏
    好处:文档初始化的时候不会产生渲染开销
    坏处: 不要在网页中做频繁性的切换,会产生性能消耗

(4)使用js模拟hover选择器

    <title>Title</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        ul{
            list-style: none;
        }
        ul{
            width: 600px;
            height: 80px;
            line-height: 80px;
            text-align:center;
            overflow:hidden;
        }
        ul li{
            float:left;
            margin: 0 10px;
            width:  80px;
            height: 80px;
            background: darkturquoise;
            color: #fff;
        }
        ul li.active{
            background: red;
        }
    </style>
</head>
<body>
<ul>
    <li>举</li>
    <li>头</li>
    <li>望</li>
    <li>明</li>
    <li>月</li>
</ul>
<script>
    var lists = document.getElementsByTagName("li");
    for(var i =0;i<lists.length;i++){
        lists[i].onclick = function(){
            //在修改当前盒子样式之前,现将所有盒子的类名置空
            for(var j=0; j<lists.length;j++){
                lists[j].className ="";
            }
            this.className = "active"; //修改当前 鼠标进入盒子的样式
        }
    }
</script>

(5)选项卡

    <title>Title</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        ul{
            list-style: none;
        }
        #tab{
            width: 480px;
            margin: 20px auto;
            border: 1px solid red;
        }
        ul{
            width: 100%;
            overflow: hidden;
        }
        ul li{
            float: left;
            width: 160px;
            height: 60px;
            line-height: 60px;
            text-align: center;
            background-color: #cccccc;
        }
        ul li a{
            text-decoration: none;
            color:black;
        }
        li.active {
            background-color: darkcyan;
        }
        p{
            display: none;
            height: 200px;
            text-align: center;
            line-height: 200px;
            background-color: darkgrey;
        }
        p.active{
            display: block;
        }
    </style>
</head>
<body>
<div>
    <div id="tab">
        <ul>
            <li class = "active">
                <a href="javascript:void(0);">首页</a>
            </li>
            <li class = "active">
                <a href="javascript:void(0);">新闻</a>
            </li>
            <li class = "active">
                <a href="javascript:void(0);">图片</a>
            </li>
        </ul>
        <p class="active">首页内容</p>
        <p>新闻内容</p>
        <p>图片内容</p>
    </div>
</div>

<script>
    var lists = document.getElementsByTagName("li");
    var oPs = document.getElementsByTagName("P");
         // var i;
        //i=3 变量提升 会导致 变量 是一个全局作用域
        //var 声明变量 全局作用域,存在变量提升
    for(var i= 0; i<lists.length;i++){ //为了给每个dom添加事件
        lists[i].currentIndex = i;
        console.dir(lists[i]);
        lists[i].onclick = function(){
            for(var j = 0; j<lists.length;j++){
                lists[j].className = "";
                oPs[j].className = '';
            }
            this.className = "active";
            oPs[this.currentIndex].className = 'active'
        }
    }
</script>

注意;变量提升问题

<script>
    // var a;
    // //变量提升
    // console.log(a);//undefined
    // a = 1;
    // console.log(a);
    console.log(a);
    {
        var a = 2;
    }
    console.log(a);

    // let声明的变量 1 块级作用域 2.不存在变量提升
    console.log(b); //找不到,不存在
    {
        let b= 3;
    }
    console.log(b)
</script>
变量提升

通过es6中的let来解决变量提升

<script>
    var lists = document.getElementsByTagName("li");
    var oPs = document.getElementsByTagName("P");
         // var i;
        //i=3 变量提升 会导致 变量 是一个全局作用域
        //var 声明变量 全局作用域,存在变量提升
    for(let i= 0; i<lists.length;i++){ //为了给每个dom添加事件
        console.dir(lists[i]);
        lists[i].onclick = function(){
            for(var j = 0; j<lists.length;j++){
                lists[j].className = "";
                oPs[j].className = '';
            }
            this.className = "active";
            oPs[i].className = 'active'
        }
    }
</script>

2.js中的面向对象


(1)使用Object或对象字面量创建对象

// 构造函数方式创建对象
    let person = new Object();
    person.name = 'alex';
    person.fav = function () {
        console.log(this);
    }
    //字面量方式创建 使用最多
    var person2 = {
        name:'wusir',
        age:19,
        fav:function () {
            alert(this.age);
        }
    }
    person2.fav();

(2)工厂模式创建对象

 function createPerson(name, age) {
        let person = new Object();
        person.name = name;
        person.age = age;
        person.fav = function () {
            console.log(this);
        }

        return person;
    }

      function createFruit(name, age) {
        let fruit = new Object();
        fruit.name = name;
        fruit.age = age;
        fruit.fav = function () {
            console.log(this);
        }

        return fruit;
    }

    var p1 = createPerson('alex',17);
    var f1 = createFruit('桃子',1);
    console.log(p1 instanceof Object);
    console.log(f1 instanceof Object);

(3)构造函数模式创建对象

function Person(name,age){
        this.name = name;
        this.age = age;
        this.fav = function () {
            alert(this.name)
        }
    }

    function Fruit(name,age){
        this.name = name;
        this.age = age;
        this.fav = function () {
            alert(this.name)
        }
    }
//    创建对象 使用new关键字
    var p1 = new Person('alex',17);
    var f1 = new Fruit('桃子',17);
    console.log(p1 instanceof Object);
    console.log(f1 instanceof Object);
    console.log(p1 instanceof Person);
    console.log(f1 instanceof Fruit);

(4)原型模式创建对象

function Person(name,age){
        this.name = name;
        this.age = age;
}
Person.prototype.fav = function () {
    console.log(this.name);
}
let p1 = new Person('alex',16);
let p2 = new Person('alex',16);

p1.fav();

//es6 使用class关键字来创建对象
class Furit{
    //初始化的构造器方法
    constructor(name='alex',age=16){
        this.name = name;
        this.age = age
    }
    //对象的单体模式 等价于fav:function(){}
    fav(){
        console.log(this.age);
    }
}

var f1 =  new Furit();
f1.fav();
es6的用法:
1.模板字符串  `` 变量名使用${}
2.class 类的概念
3.箭头函数 ()=>3  等价于 function(){ return 3}

3.定时器

 

转载于:https://www.cnblogs.com/wcx666/p/9936471.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌单(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌单” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌单管理:创建 “公开 / 私有 / 加密” 歌单,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌单封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜单”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌单共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值