zoukankan      html  css  js  c++  java
  • Python学习 Day 046

    主要内容:

    • 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{
                 600px;
                height: 80px;
                line-height: 80px;
                text-align:center;
                overflow:hidden;
            }
            ul li{
                float:left;
                margin: 0 10px;
                  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{
                 480px;
                margin: 20px auto;
                border: 1px solid red;
            }
            ul{
                 100%;
                overflow: hidden;
            }
            ul li{
                float: left;
                 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.定时器

  • 相关阅读:
    Codeforces 700A As Fast As Possible(二分答案)
    BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
    Codeforces 701C They Are Everywhere(Two pointers+STL)
    Codeforces 430B Balls Game(Two Pointers)
    CSU 1812 三角形和矩形
    CSU 1804 有向无环图
    CSU 1803 2016
    CSU 1808 地铁
    CodeForces 707B Bakery
    CodeForces 707A Brain's Photos
  • 原文地址:https://www.cnblogs.com/wcx666/p/9936471.html
Copyright © 2011-2022 走看看