Skip to content
on this page

扫码联系

编程学习&& IT

tian

DOM简介

◆ DOM是JS操控HTML和CSS的桥梁

◆ DOM (Document Object Model,文档对象模型)是JavaScript操作HTML文档的接口,DOM赋予我们添加、移除和修改页面元素(使文档操作变得非常优雅、简便。(元素的文字也是DOM的一个节点)

◆ DOM最大的特点就是将文档表示为节点树。

访问元素节点

◆ 所谓“访问”元素节点,就是指"得到”、"获取”页面上的元素节点

◆ 对节点进行操作,第一步就是要得到它

◆ 访问元素节点主要依靠document对象

认识document对象

◆ document对象是DOM中最重要的东西,几乎所有DOM的功能都封装在了document对象中

◆ document对象也表示整 个HTML文档,它是DOM节点树的根

获取元素的方式

可以不通过获取id名字而在js里面直接使用

document.getElmentById()

通过id获取元素

◆ 如果页面上有相同id的元素,则只能得到第一个

◆ 不管元素藏的位置有多深,都能通过id把它找到

css
document.getElmentById()

getElementsByClassName()

通过class类名获取元素数组

不兼容IE8及以下

css
document.getElementsByClassName() 

getElementsByTagName()

通过标签名获取元素数组

◆ 数组方便遍历,从而可以批量操控元素节点

◆ 即使页面上只有一个指定标签名的节点,也将得到长度为1的数组

◆ 任何一个节点元素也可以调用getElementsByTagName()方法,从而得到其内部的某种类的元素节点

css
document.getElementsByTagName()

getElementsByName()

通过name获取

css
document.getElementsByName()

querySelector()

通过选择器获取元素^

◆ querySelector()方法只能得到页面上一个元素,如果有多个元素符合条件,则只能得到第一个元素

◆ querySelector()方法从IE8开始兼容, 但从IE9开始支持CSS3的选择器,如:nth-child() 、 :[src^= 'dog']等CSS3选择器形式都支持良好

js
document.querySelector()       
//不支持 IE7 及以下

querySelectorAll()

通过选择器获取元素数组

◆ querySelectorAll()方法的功能是通过选择器得到元素数组

◆ 即使页面上只有一个符合选择器的节点,也将得到长度为1 的数组,

js
document.querySelectorAll()
// 不支持 IE7 及以下
js
document.querySelectorAll("[class^='text-']") 
// 获取所有class 以 text开头的元素

我们常用的方法中,getElementById和 getElementsByName(通过name属性获取元素)是必须以document开头的。

html
<body>
	<p>我是段落</p>
    <p>我是段落</p>
    <p>我是段落</p>
    <p>我是段落</p>
    <p>我是段落</p>


    <div id="box">
        <p>1</p>
        <p>2</p>
        <p>3</p>
    </div>
	<script>
         // 得到p标签的数组
        let aP = document.getElementsByTagName("p");
        console.log(aP);

        let box = document.getElementById("box");
        let box_p = box.getElementsByTagName("p");
        console.log(box_p);
    </script>
</body>

特殊元素的获取

js
console.log (document.head);//head
console.log (document.body);//body
console.log(document.title);////title标签的文字内容,可以赋值修改title
console.log(document.documentElement);//html
js
 document.title = "我修改后的title";

延迟运行

在测试DOM代码时,通常JS代码一定要写到HTML节点的后面,否则JS无法找到相应HTML节点

可以使用window.onload = function(){} 事件,使页面加载完毕后,再执行指定的代码

html
<script>
    // 给window对象添加onload事件监听.  onload表示页面都加载完毕了
    window.onload = function () {
        //得到盒子1
        let box1 = document.getElementById("box1");

        //得到盒子2
        let box2 = document.getElementById("box2");
        console.log(box1);
        console.log(box2);
    }
</script>
<div id="box1"></div>
<div id="box2"></div>

主要记住以下三种方式

通过id去获取

  • document.getElementById

通过选择器获取节点(列表)

  • document.querySelector()
  • document.querySelectorAll()

类数组对象

如果一个对象的所有键名都是正整数或零,并且有length属性,那么这个对象就很像数组,语法上称为“类似数组的对象”(array-like object)。

js
let obj = {
    0: 'a',
    1: 'b',
    2: 'c',
    length: 3
};
console.log(obj[0]); // 'a'
console.log(obj[1]); // 'b'
console.log(obj.length);//3
obj.push('d'); //// TypeError: obj.push is not a function

//对象obj就是一个类似数组的对象。但是,“类似数组的对象”并不是数组,因为它们不具备数组特有的方法。
//对象obj没有数组的push方法,使用该方法就会报错。

类似数组的对象”的根本特征,就是具有length属性

只要有length属性,就可以认为这个对象类似于数组。

但是有一个问题,这种length属性不是动态值,不会随着成员的变化而变化。

js
let obj = {
    length: 0
};

obj[3] = "tian有点飒";
console.log(obj.length);

//对象obj添加了一个数字键,但是length属性没变。这就说明了obj不是数组。

典型的“类似数组的对象”

函数的arguments对象

大多数 DOM 元素集

字符串

DOM事件

什么是事件?

事件就是文档或浏览器窗口中发生的一些特定的交互瞬间。

比如用户在一个网页上所做出的某些操作动作, 操作动作就是事件

DOMO级事件

语法: ele.事件=执行脚本

功能:在DOM对象上绑定事件

说明:执行脚本可以是一个匿名函数,也可以是一个函数的调用

注册事件

onclick 鼠标点击

onmouseenter 鼠标移入 ( 只触发一次 )

onmouseleave 鼠标移出

DOM事件的使用方式:

js
<div id="Wrap"></div>

let oWrap = document.getElementById( "wrap" );

oWrap.onclick = function() {
    	// wrap容器被点击时执行的内容
           console.log("已被点击");
        }

oWrap.onmouseenter = function() {
            console.log("鼠标移入了");
        }

操作标签的内容

如何改变元素节点中的内容?

改变元素节点中的内容可以使用两个相关属性:

​ ①innerHTML

​ ②innerText

◆innerHTML属性能以HTML语法设 置节点中的内容

◆innerText属性只能以纯文本的形式设置节点中的内容

js
<div id="Wrap"></div>

//获取wrap节点对象
let oWrap = document.getElementById( "wrap" );

oWrap.innerText= "<ul><li>黛玉</li><li>黛玉</li></ul>";
//innerText不会解析标签
//大部分就是字符串和数字,数字本身也是转化为字符串再赋值进来
oWrap.innerText = tianDSB;//此时报错 没有这个变量



oWrap.innerHTML = "<ul><li>黛玉</li><li>宝钗</li></ul>";
//innerHTML会解析标签

//  取值
console.log(oWrap.innerText);
console.log(oWrap.innerHTML);

操作元素的css样式

外部样式表

无法通过js操控,js只对当前这一个html文档有控制能力,别的文件是不能控制的

内联样式

js可以操作style标签,但是不常用,因为不好控制选择器优先级(不常用)

html
 <style>
     #wrap{
         width: 100px;
         height: 100px;
         background-color: pink;
     }
</style>
<style id="style"></style>

<div id="wrap"></div>

<script>
    let oStyle = document.getElementById("style");

    oStyle.innerText = "#wrap{background-color:green;}" 

    oStyle.innerText = "div{background-color:green;}"
    //这样就无法修改了  因为权重问题

</script>

行内CSS样式

这个才是我们通过会使用js操作样式的方法

元素.style.样式名 =

js
oBox.style.color = "red";
oBox.style.backgroundColor = 'red' ; //css属性名要设置成完整驼峰形式
oBox.style.fontSize = "20px";  //注意写单位
oBox.style.cssFloat = "left";
//不会覆盖内部或外部样式表

操作元素属性

改变标签合法属性

js
<div id="wrap"></div>

let oWrap = document.getElementById("wrap");

oWrap.title = "这是提示";
console.log(oWrap.title)
console.log(oWrap.yunmu);//只有合法标签属性才提供直接.操作
oWrap.id = "list";
oWrap.className = "box"; //class比较特殊

class :使用 className (推荐使用H5中新增classList操作class)

自定义标签属性的操作

.getAttribute()

.setAttribute()

.removeAttribute()

(也可操作合法标签属性)

js
// 获取getAttribute()
<div id="wrap" yunmu="dsb">div</div>

console.log( oWrap.getAttribute("yunmu") );
js
// 设置setAttribute()
oWrap.setAttribute("daiyu" , "黛玉");
console.log(wrap);
js
// 删除removeAttribute()
oWrap.removeAttribute("daiyu")

自定义属性不建议添加(团队开发时可能添加相同的自定义属性)

操作元素的类名来控制CSS样式

如果操作元素多个样式

js
#wrap{
    width: 200px;
    height: 200px;
    background-color: green;
}
<div id="wrap"></div>

let oWrap = document.getElementById("wrap");
oWrap.onclick = function(){
    oWrap.style.width = "300px";
    oWrap.style.height = "300px";
    oWrap.style.backgroundColor  = "pink";
}
//改写
oWrap.onclick = function(){
oWrap.style = "width: 300px; height:300px; background-color:purple"
   }
//字符串赋值给了对象  不合理的写法   最好写到cssText
oWrap.onclick = function(){
	oWrap.style.cssText = "width:300px;height:300px;background-color:purple"
}

最终我们可以写为

css
#wrap.active{
            width : 300px;
             height:300px; 
             background-color:purple
        }
oWrap.onclick = function(){
           oWrap.className = "active"
        }

小案例(点击展开)

js
#nav{
    width: 150px;
    height: 50px;
    background-color: pink;
    text-align: center;
    line-height: 50px;
    color: #fff;
    cursor: pointer;
    transition: 1s;
}
        
#nav.show{
    height: 200px;
}

<div id="nav">文字</div>

let oNav = document.getElementById("nav");

oNav.onclick = function() {
    oNav.className = "show"
}

classList

js
<div id="wrap" class="con"></div>


let oWrap = document.getElementById("wrap");
oWrap.className = "aa bb";//通过className添加两个类名  会覆盖原有的类名

oWrap.className = oWrap.className + " aa bb"//如此添加太过生硬

推荐使用H5中新增classList来代替className操作名字

js
 oWrap.classList.add("aa")//能自动处理空格和辨别相同类名

添加多个类名

元素.classList.add()

js
oWrap.classList.add("aa" , "bb")

移除类名

元素.classList.remove()

css
oWrap.classList.remove("aa" , "bb")

切换名字

元素.classList.toggle()

(有类名则添加,没有则删除)

不支持两个参数

css
oWrap.classList.toggle("con")

小案例(点击展开收起)

html
<style>
    #nav{
        width: 150px;
        height: 50px;
        background-color: pink;
        text-align: center;
        line-height: 50px;
        color: #fff;
        cursor: pointer;
        transition: 1s;
    }

    #nav.show{
        height: 200px;
    }
</style>

<div id="nav">文字</div>

<script>
    let oNav = document.getElementById("nav");
    oNav.onclick = function() {
        oNav.classList.toggle("show");
    }
</script>

弹出层案例

html
<style>
#cover{
    /* display: none; */
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background-color: rgba(0,0,0,.4);
    transform: scale(0);
    transition: .6s;
    }
    #cover.show{
        transform: scale(1);
    }

    #cover.hidden{
        transform: scale(0);
    }

    #cover .content{
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        margin: auto;
        width: 200px;
        height: 80px;
        text-align: center;
        background-color: #fff;
        font-size: 14px;
        line-height: 80px;
        font-weight: bold;
    }
</style>

<body>
    <div id="btn">
        <button class="tips">弹出按钮</button>
    </div>

    <div id="cover">
        <div class="content">我是弹窗内容</div>   
    </div>
</body>

<script>
    let otips  = document.querySelector("#btn .tips"),
        oCover = document.querySelector("#cover");

    otips.onclick = function() {
        // oCover.style.display="block";
        oCover.classList.add("show");
    }

    oCover.onclick = function() {
        // oCover.style.display="none";
        oCover.classList.remove("show");
    }
</script>

this初识

js
<div id="wrap1"> 如果云曾是天空的一封信</div>

let oWrap = document.getElementById("wrap1");

//事件函数
oWrap.onclick = function(){
    // oWrap.style.color = "skyblue"; 

    /*事件是添加给wrap , 事件函数里面又在操控wrap*/

    this.style.color = "pink"
    // 使用this关键字可以代替,你触发的是owrap的点击事件这个this就指向oWrap
    // 涉及到js的垃圾回收,后面会说.这个this只在事件函数里面使用
}

示例

js
<div id="wrap1"> 如果云曾是天空的一封信</div>
<div id="wrap2"> 如果云曾是天空的一封信</div>


let oWrap1 = document.getElementById("wrap1");
let oWrap2 = document.getElementById("wrap2");
oWrap1.onclick = function () {
    this.style.color = "pink"
}

oWrap1.onclick = function () {
    this.style.color = "pink"
}

//使用this可以改写为
function changeColor(){
    this.style.color = "pink"
}

oWrap1.onclick = changeColor;
oWrap2.onclick = changeColor;
//函数的上下文(this关键字)由调用函数的方式决定,function是“运行时上下文”策略,函数如果不调用,则不能确定函数的上下文
//规则1:对象打点调用它的方法函数,则函数的上下文是这个打点的对象


//事件处理函数的上下文是绑定事件的DOM元素

作业

hover伪类做不了的效果

图片显示和隐藏

动态菜单