Javascript节点

185 阅读4分钟

#节点的删除

<div class="box">
        <button>删除</button>
        <ul>
            <li>321</li>
            <li>123</li>
            <li>132</li>
        </ul>
</div>
<script>
        // createElement:创建节点
        // appendChild:追加一个节点
        // removeChild:删除一个节点
        var btn = document.querySelector("button")
        var ul = document.querySelector("ul")
        var liList = document.querySelectorAll("li")
        btn.onclick = function(){
            if(ul.children.length == 0){
                this.disabled = true;
            }else{
                ul.removeChild(ul.children[0])
            }
        }
</script>

#留言板案例

<div>
        <textarea name="" id="" cols="30" rows="10"></textarea>
        <button>发布</button>
        <ul>

        </ul>
</div>
<script>
        var textarea = document.querySelector("textarea")
        var btn = document.querySelector("button")
        var ul = document.querySelector("ul")
        btn.onclick = function(){
            var li = document.createElement("li")
            if(textarea.value !== ""){
                li.innerText = textarea.value
                var btn1 = document.createElement("button")
                btn1.innerText = "删除"
                btn1.onclick = function(){
                    ul.removeChild(li)
                }
                li.appendChild(btn1)
                ul.appendChild(li)
                textarea.value = ""
            }else{
                alert("发布内容不能为空")
            }
        }
</script>

#克隆节点

<div class="box">
        <ul>
            <li>123</li>
            <li>321</li>
            <li>132</li>
            <li>312</li>
        </ul>
</div>

<script>
        var ul = document.querySelector("ul")
        // var newul = ul.cloneNode()
        var newul = ul.cloneNode(true)
        console.log(newul)
</script>

#表格操作

<div class="box">
        <table cellspacing = "0" width="400px" align="center" border="1">
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>科目</th>
                    <th>成绩</th>
                    <th>操作</th>
                </tr>
            </thead>
            <tbody>

            </tbody>
        </table>
</div>

<script>
        // 数组生成DOM元素
        // 数组里面可以有对象
        var students = [
            {
                name:"张三",
                subject:"javascript",
                score: 99
            },
            {
                name:"李四",
                subject:"javascript",
                score: 100
            },
            {
                name:"王朝",
                subject:"javascript",
                score: 99
            },
        ]

        // 向tbody里面进行appendChild值,列出所有的数据
        var tbody = document.querySelector("tbody")
        for(var i = 0; i < students.length; i++){
            // 创建一个tr
            var tr = document.createElement("tr")
            tr.align = "center"
            // 循环创建td
            for(var key in students[i]){
                var td = document.createElement("td")
                td.innerHTML = students[i][key]
                tr.appendChild(td)
            }
            // 增加删除操作
            var td = document.createElement("td")
            td.innerHTML = "<a href = 'javascript:void(0)'>删除</a>"
            tr.appendChild(td)
            // 将tr放入tbody里面
            tbody.appendChild(tr)
        }

        // 给每一个a标签添加一个删除事件
        var allA = document.querySelectorAll("a")
        for(var i = 0; i < allA.length; i++){
            allA[i].onclick = function(){
                console.log(i)
                // 当点击的时候,for循环已经执行完毕!!取到i值为最大值
                tbody.removeChild(this.parentNode.parentNode)
            }
        }
</script>

#创建元素的三种方法

<script>
        // 创建元素1
        // var tr = document.createElement("tr")
        // var li = document.createElement("li")
        // li.innerText = "你好"
        // document.body.appendChild(li)

        // 创建元素2
        // innerHTML = ""
        // var inner = "<tr></tr>"
        // document.body.innerHTML = "<li>你好</li>"

        // 创建元素3
        // document.write("写到document中去")
        // document.write("<li>你好</li>")
</script>

#innerHTML

<script>
        for(var i = 0; i < 10; i++){
            document.body.innerHTML += "<div>你好</div>"
            // 每一次执行就会重新渲染页面!!!速度比较慢
        }
</script>

#通过数组的方式进行拼接

<script>
        var arr = []
        for(var i = 0; i < 100; i++){
            // 数组是在内存中的数据,所以速度比较快
            arr.push("<div>你好</div>")
        }
        // 渲染了一次页面
        document.body.innerHTML = arr.join("")
</script>

#createElement

<script>
        var d1 = +new Date()
        for(var i = 0; i < 100; i++){
            var div = document.createElement("div")
            div.innerText = "你好"
            document.body.appendChild(div)
        }
        var d2 = +new Date()
        console.log(d2 - d1)

        // 尽可能减少DOM操作,减少页面渲染
</script>

#事件注册

<button>点击</button>
<script>
        var btn = document.querySelector("button")

        // btn.onclick = function(){
        //     console.log("点击1")
        // }
        // btn.onclick = function(){
        //     // 只有这个事件处理函数执行了
                // 把之前的处理函数覆盖了
        //     console.log("点击2")
        // }

        // 使用addEventListener绑定事件,一旦事件产生会执行绑定在上面的所有的事件处理函数
        var f1 = function(){
            console.log("点击事件产生了!!!")
        }

        var f2 = function(){
            console.log("点击事件产生了1!!!")
        }

        btn.addEventListener("click",f1)
        btn.addEventListener("click",f2)

        // 有增加就有删除
        // removeEventListener
        btn.removeEventListener("click", f1)
</script>

#冒泡事件

<div>
        <ul>
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
        </ul>
</div>
<script>
        var ul = document.querySelector("ul")
        // 冒泡事件
        var li = document.querySelectorAll("li")
        for(var i = 0; i < li.length; i++){
            li[i].onclick = function(){
                console.log("这是点击了")
            }
        }

        ul.onclick = function(){
            // 当点击li的时候,就会执行该函数
            // 冒泡事件,当点击,这个事件就会一直向上传递,执行每一个事件函数,直到html
            // 冒泡事件是浏览器的默认事件
            console.log("ul点击事件")
        }
</script>

#事件流的三个阶段

<div>
        <ul>
            <li>1</li>
            <li>2</li>
            <li class="san">3</li>
        </ul>
</div>

<script>
        // 事件流分为三个阶段
        // 捕获阶段    捕获 你点击了谁就捕获谁 (capture)
        
        // 目标阶段    查到了谁点击了 (target)

        // 冒泡阶段    (bubbling)
        var san = document.querySelector(".san")

        san.onclick = function(){
            console.log("zhixing")
        }
</script>

#三个事件流阶段案例

<style>
        .da{
            width: 400px;
            height: 400px;
            border: 1px solid red;
        }
        .zhong{
            width: 200px;
            height: 200px;
            border: 1px solid red;
        }
        .xiao{
            width: 100px;
            height: 100px;
            border: 1px solid red;
        }
</style>

<div class="da">
        <div class="zhong">
            <div class="xiao"></div>
        </div>
</div>
<script>
        // 捕获阶段事件也可以进行绑定
        var da = document.querySelector(".da")
        var zhong = document.querySelector(".zhong")
        var xiao = document.querySelector(".xiao")

        // 第三个参数为true,那么这个事件处理函数就是捕获阶段的
        da.addEventListener("click",function(){
            console.log("da捕获阶段")
        },true)
        da.addEventListener("click",function(){
            console.log("da冒泡")
        },false)
        zhong.addEventListener("click",function(){
            console.log("zhong捕获阶段")
        },true)
        zhong.addEventListener("click",function(){
            console.log("zhong冒泡")
        },false)
        // 当处于目标阶段时,应该是谁先注册了函数谁先执行
        xiao.addEventListener("click",function(){
            console.log("xiao捕获阶段")
        },true)
        xiao.addEventListener("click",function(){
            console.log("xiao冒泡")
        },false)
</script>