JavaScript day004

92 阅读4分钟

DOM:Document Object Model:文档对象模型,专门用于操作html文档的,提供了一些方法

DOM树概念

DOM树概念:DOM将我们的HTML看作了是一个倒挂的树状结构,但是树根不是html标签,而是document对象

document对象:不需要程序员创建,由浏览器的js解释器自动创建,一个页面只有一个document对象

作用:只要是对象就提供了属性和方法,等待我们学习,【找到】想要的任何DOM元素/对象/节点,甚至进行【操作】

DOM会将页面上的每个元素、属性、文本、注释都当作一个DOM元素/对象/节点

查找元素

1、通过 ID 查找元素:

var elem=document.getElementById("id值");

特殊:
	1、如果页面有多个重复的id,只会返回第一个
	2、没找到,返回null
	3、其实id根本不用查找,直接可用
	4、你们不准用,id留给后端使用

2、*通过 标签名 查找元素:

var elems=document/parent.getElementsByTagName("标签名");

特殊:
	1、返回值,返回了一个类数组对象,没找到,返回空类数组
	2、js不能直接操作DOM集合,解决:要么使用下标得到某一个元素,要么使用遍历得到每一个元素
	3、parent->代表的是你已经找到的某个父元素

3、*通过 class名 查找元素

var elems=document/parent.getElementsByClassName("标签名");

特殊:
	1、返回值,返回了一个类数组对象,没找到,返回空类数组
	2、js不能直接操作DOM集合,解决:要么使用下标得到某一个元素,要么使用遍历得到每一个元素
	3、parent->代表的是你已经找到的某个父元素

4、*通过关系找元素:前提:必须先找到一个元素才可以用调用关系

	父元素:elem.parentNode;
	子元素:elem.children; - 集合
	第一个子元素:elem.firstElementChild;
	最后一个子元素:elem.lastElementChild;
	前一个兄弟:elem.previousElementSibling;
	后一个兄弟:elem.nextElementSibling;

操作元素:前提:找到元素才可以操作

1、内容:

1、*innerHTML - 获取和设置开始标签到结束标签之间的内容,支持识别标签
		获取:elem.innerHTML;
		设置:elem.innerHTML="新内容";

	2、innerText - 获取和设置开始标签到结束标签之间的文本,不支持识别标签
		获取:elem.innerText;
		设置:elem.innerText="新内容";

	3、*value - 专门为input准备的
		获取:input.value;
		设置:input.value="新内容";

2、*属性:

获取属性值:elem.getAttribute("属性名");
设置属性值:elem.setAttribute("属性名","属性值");
移除属性值:elem.removeAttribute("属性名");

简化版:
	获取属性值:elem.属性名
	设置属性值:elem.属性名="属性值";
		
特殊:1class需要写为className
	 2、自定义属性操作不了

3、*样式:

使用样式的方式:
	1、内联样式
	2、内部样式表
	3、外部样式表

二阶段我们的js就是要操作【内联样式】:
	1、不会牵一发动全身
	2、优先级最高

获取:elem.style.css属性名;
设置:elem.style.css属性名="css属性值";
特殊:1、css属性名,有-的地方,要去掉-,变为小驼峰命名法
			border-radius -> borderRadius
	 2、获取样式时,也只能获取到内联样式

4、*绑定事件:

elem.on事件名=function(){
		操作;
	*****this关键字:这个
			如果单个元素绑定事件,this->这个元素
			如果多个元素绑定事件,this->当前触发事件的元素
	}

一切的获取,都是为了做判断
一切的设置,都是在修改|添加

表格的隔行变色案例

   <style>
        table {
            width: 500px;
            margin: auto;
            border: 1px solid #000;
            border-collapse: collapse;
            table-layout: fixed;
        }

        td {
            border: 1px solid #000;
        }
    </style>
</head>

<body>
    <button>按钮</button>
    <table>
        <tr>
            <td>1222222222</td>
            <td>2</td>
            <td>3</td>
        </tr>
        <tr>
            <td>4</td>
            <td>5</td>
            <td>6</td>
        </tr>
        <tr>
            <td>7</td>
            <td>8</td>
            <td>9</td>
        </tr>
    </table>
    <table>
        <tr>
            <td>1</td>
            <td>2</td>
            <td>3</td>
        </tr>
        <tr>
            <td>4</td>
            <td>5</td>
            <td>6</td>
        </tr>
        <tr>
            <td>7</td>
            <td>8</td>
            <td>9</td>
        </tr>
    </table>
    <script>
        //表格隔行变色:奇数次点击奇数行变色,偶数次点击偶数行变色,可以不断的切换起来
        //找到了第一个按钮和一个技术器
        var btn = document.getElementsByTagName("button")[0];
        var trs = document.getElementsByTagName("tr");
        var i=0;
        //绑定点击事件
        btn.onclick = function () {
            //计数器递增
            i++;
            if (i % 2 == 1) {
                //所有行都在设置颜色
                for (var j = 0; j < trs.length; j++) {
                    if (j % 2 == 1) {
                        //奇数行为粉色
                        trs[j].style.background = "pink"
                    } else {
                        //偶数行为白色
                        trs[j].style.background = "#fff"
                    }
                }
            } else {
                for (var j = 0; j < trs.length; j++) {
                    if (j % 2 == 0) {
                        //偶数行为红色
                        trs[j].style.background = "red"
                    } else {
                        //奇数行为白色
                        trs[j].style.background = "#fff"
                    }
                }
            }
        }
    </script>
</body>

表格隔行变色.png

隔行变色.png

选项卡案例

 <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }

        .tabs>ul {
            display: flex;
        }

        .tabs>ul>li {
            width: 100px;
            line-height: 50px;
            background: pink;
            border: 1px solid #ccc;
            text-align: center;
            color: #fff;
            cursor: pointer;
        }

        .tabs>div {
            width: 400px;
            line-height: 26px;
            border: 1px solid #ccc;
            background: purple;
            color: #fff;
            text-indent: 2em;
            display: none;
        }

        .tabs>ul>li.active {
            background: purple;
        }

        .tabs>div.active {
            display: block;
        }
    </style>
</head>

<body>
    <div id="tabs" class="tabs">
        <ul>
            <li a="0" class="active">苗苗姐</li>
            <li a="1">袍老爷</li>
            <li a="2">卢老爷</li>
        </ul>
        <div class="active">苗苗姐是一个温柔体贴逗逼的老师,Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae nihil
            corporis at
            ipsam delectus reiciendis? Quas dolor consectetur fugit quasi earum in eum dicta deserunt accusamus tempore.
            Et
            veniam vel.</div>
        <div>袍老爷是一个天不怕地不怕的天棒,Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae nihil corporis at ipsam
            delectus
            reiciendis? Quas dolor consectetur fugit quasi earum in eum dicta deserunt accusamus tempore. Et veniam vel.
        </div>
        <div>卢老爷是一个严肃认真可靠的老师,Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae nihil corporis at ipsam
            delectus
            reiciendis? Quas dolor consectetur fugit quasi earum in eum dicta deserunt accusamus tempore. Et veniam vel.
        </div>
    </div>
    <script>
       //找到了所有的li和div,循环给li榜上了事件
       var lis = document.getElementsByTagName("li"),
       //div这句话的意思是[div,div,div] 
       divs = tabs.getElementsByTagName("div");
        for (var i = 0; i < lis.length; i++) {
            lis[i].onclick = function () {
                //循环所有的li和div并且清空掉class
                for (var i = 0; i < lis.length; i++) {
                    lis[i].className = "";
                    divs[i].className = "";
                }
                //当前点击li设置为active
                this.className = "active";
                //获取当前点击的li的自定义属性-自定义下标
                var i = this.getAttribute("a");
                //这个和搭配给类数组集合divs使用。就能找到对应的那个div,添加active
                divs[i].className = "active";
            }
        }
    </script>
</body>

选项卡.png

购物车案例

<head>
    <title>使用Selector API实现购物车客户端计算</title>
    <meta charset="utf-8" />
    <style>
        table {
            width: 600px;
            text-align: center;
            border-collapse: collapse;
        }

        td,
        th {
            border: 1px solid black
        }

        td[colspan="3"] {
            text-align: right;
        }

        /*tbody>tr>td:last-child{background-color:red}*/
        /*tfoot>tr>td:last-child{background-color:red}*/
    </style>
    <!--<script src="js/6_2.js"></script>-->
</head>

<body>
    <table id="data">
        <thead>
            <tr>
                <th>商品名称</th>
                <th>单价</th>
                <th>数量</th>
                <th>小计</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>iPhone6</td>
                <td>4488</td>
                <td>
                    <button>-</button>
                    <span>1</span>
                    <button>+</button>
                </td>
                <td>4488</td>
            </tr>
            <tr>
                <td>iPhone6 plus</td>
                <td>5288</td>
                <td>
                    <button>-</button>
                    <span>1</span>
                    <button>+</button>
                </td>
                <td>5288</td>
            </tr>
            <tr>
                <td>iPad Air 2</td>
                <td>4288</td>
                <td>
                    <button>-</button>
                    <span>1</span>
                    <button>+</button>
                </td>
                <td>4288</td>
            </tr>
            <tr>
                <td>3090ti显卡</td>
                <td>20000</td>
                <td>
                    <button>-</button>
                    <span>1</span>
                    <button>+</button>
                </td>
                <td>20000</td>
            </tr>
            <tr>
                <td>3080ti显卡</td>
                <td>18000</td>
                <td>
                    <button>-</button>
                    <span>1</span>
                    <button>+</button>
                </td>
                <td>18000</td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <td colspan="3">Total: </td>
                <td id="total">0</td>
            </tr>
        </tfoot>
    </table>
    <script>
        //找到了所有按钮
        var btns = document.getElementsByTagName("button");
        var tbody = document.getElementsByTagName("tbody")[0];
        var trs = tbody.children;
        for (var i = 0, sum = 0; i < trs.length; i++) {
            sum += parseInt(trs[i].lastElementChild.innerHTML);
        }
        total.innerHTML = sum;
        //循环遍历绑定事件
        for (var i = 0; i < btns.length; i++) {
            btns[i].onclick = function () {

                //区分+
                if (this.innerHTML == "+") {
                    //通过关系,找到数量,获取出数量的内容+1后,再设置回去
                    var span = this.previousElementSibling;
                    var spanV = parseInt(span.innerHTML) + 1;
                    span.innerHTML = spanV;
                    //通过关系,找到单价,获取出数量的内容
                    var price = this.parentNode.previousElementSibling.innerHTML;
                    //通过关系,找到小计,小计=单价*数量
                    this.parentNode.nextElementSibling.innerHTML = price * spanV;
                } else {
                    var span = this.nextElementSibling;
                    var spanV = parseInt(span.innerHTML) - 1;
                    if (spanV > 0) {//保证数量不能等于0
                        span.innerHTML = spanV;
                        var price = this.parentNode.previousElementSibling.innerHTML;
                        this.parentNode.nextElementSibling.innerHTML = price * spanV;
                    }
                }
                //找到小计的所有内容垒加到一起在设置回去
                var tbody = document.getElementsByTagName("tbody")[0];
                var trs = tbody.children;
                for (var i = 0, sum = 0; i < trs.length; i++) {
                    sum += parseInt(trs[i].lastElementChild.innerHTML);
                }
                total.innerHTML = sum;
            }
        }
    </script>
</body>

购物车.png