如何获取页面元素

DOM 在我们实际开发中主要用来操作元素

我们如何来获取页面中的元素呢?

获取页面中的元素可以使用以下几种方式:

根据 ID 获取

使用 getElementById() 方法可以获取带有 ID 的元素对象

<div id="time">2022-4-23</div>
<script>
    var timer = document.getElementById('time');
    console.log(timer);
</script>

结果:<div id="time">2022-4-23</div>

  1. 因为我们文档页面从上往下加载,所以先得有标签,所以我们 script 写到标签的下面
  2. get 是获得 element 元素 by 通过。采用了驼峰命名法
  3. 参数 ID 是大小写敏感的字符串

它返回的结果是一个对象

console.log(typeof timer);

结果:object

console.dir 可以打印我们返回元素对象,更好的查看里面的属性和方法

console.dir(timer);

根据标签名获取

使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的集合

<ul>
    <li>知否知否,应是等你很久</li>
    <li>知否知否,应是等你很久</li>
    <li>知否知否,应是等你很久</li>
    <li>知否知否,应是等你很久</li>
    <li>知否知否,应是等你很久</li>
</ul>
<script>
    var lis = document.getElementsByTagName('li');
    console.log(lis);
</script>

结果:五个<li>知否知否,应是等你很久</li>

返回的是获取过来元素对象的集合,以伪数组的形式储存的

可以获取这五个元素里面的第一个

<ul>
    <li>知否知否,应是等你很久1</li>
    <li>知否知否,应是等你很久2</li>
    <li>知否知否,应是等你很久3</li>
    <li>知否知否,应是等你很久4</li>
    <li>知否知否,应是等你很久5</li>
</ul>
<script>
    var lis = document.getElementsByTagName('li');
    console.log(lis[0]);
</script>

结果:<li>知否知否,应是等你很久1</li>

我们想要一次打印里面的元素对象我们可以采用遍历的方式

for (var i = 0; i < lis.length; i++) {
    console.log(lis[i]);
}

结果:
<li>知否知否,应是等你很久1</li>
<li>知否知否,应是等你很久2</li>
<li>知否知否,应是等你很久3</li>
<li>知否知否,应是等你很久4</li>
<li>知否知否,应是等你很久5</li>

注意:

  1. 因为得到的是一个对象的集合,所以我们想要操作里面的元素就需要遍历
  2. 得到元素对象是动态的,也就是当文字内容改变的时候,它的输出也会改变

如果页面中只有一个 li 返回的还是伪数组的形式

如果页面中没有该元素呢?

<ul>

</ul>
<script>
for (var i = 0; i < lis.length; i++) {
    console.log(lis[i]);
}
</script>

结果:[]

如果页面中没有元素,则返回的是一个空数组

还可以获取某个元素(父元素)内部所有指定标签名的子元素

element.getElementsByTagName('标签名');

注意:父元素必须是单个对象(必须指明是哪一个元素对象) 获取的时候不包括父元素而已

<ol>
    <li>知否知否,应是等你很久1</li>
    <li>知否知否,应是等你很久2</li>
    <li>知否知否,应是等你很久3</li>
    <li>知否知否,应是等你很久4</li>
    <li>知否知否,应是等你很久5</li>
</ol>
<script>
    var ol = document.getElementsByTagName('ol');
    console.log(ol[0].getElementsByTagName('li'));
</script>

结果:[li, li, li, li, li]

这样就可以把5个 li 获取出来了

也可以这样写,结果是一样的

var ol = document.getElementById('ol');
console.log(ol.getElementsByTagName('li'));

结果:[li, li, li, li, li]

通过 HTML5 新增的方法获取元素

getElementsByClassName('类名'); 可以根据 Class 类名返回元素对象集合

比如说要获取 box

<box class="box">盒子</box>
<box class="box">盒子</box>
<div id="nav">
    <ul>
        <li>首页</li>
        <li>产品</li>
    </ul>
</div>
<script>
    var boxs = document.getElementsByClassName('box');
    console.log(boxs);
</script>

结果:[div.box, div.box]

querySelector('选择器'); 可以根据指定选择器返回第一个元素对象

<box class="box">盒子1</box>
<box class="box">盒子2</box>
<div id="nav">
    <ul>
        <li>首页</li>
        <li>产品</li>
    </ul>
</div>
<script>
    var firstBox = document.querySelector('.box');
    console.log(firstBox);
</script>

结果:<box class="box">盒子1</box>

如果想要得到 ID 选择器里面的内容,可以这样输入

var firstBox2 = document.querySelector('#nav');
console.log(firstBox2)

结果:<div id="nav">...</div>

也可以直接选择元素

<box class="box">盒子1</box>
<box class="box">盒子2</box>
<div id="nav">
    <ul>
        <li>首页</li>
        <li>产品</li>
    </ul>
</div>
<script>
    var firstBox3 = document.querySelector('li');
    console.log(firstBox3);
</script>

结果:<li>首页</li>

切记,使用 querySelector() 必须加符号

querySelectorAll(); 返回指定选择器所有元素对象

<box class="box">盒子1</box>
<box class="box">盒子2</box>
<div id="nav">
    <ul>
        <li>首页</li>
        <li>产品</li>
    </ul>
</div>
<script>
    var allBox = document.querySelectorAll('.box');
    console.log(allBox);
</script>

结果:[div.box, div.box]

获取 body 和 html 元素

1. 获取 body 元素

var bodyEle = document.body;
console.log(bodyEle);

结果:body

它是一个元素对象

2. 获取 html 元素

var htmlEle = documenthtml;
console.log(htmlEle);

结果:undefind

因为 html 比较特殊,所以不能通过这种方法来获取

通过以下方法获取

var htmlEle = document.documentElement;
console.log(htmlEle);

结果:<html>...</html>

事件概述

JavaScript 使我们有能力创建动态页面,而事件是可以被 JavaScript 侦测到的行为

简单理解:触发---响应机制

网页中的每个元素都可以产生某些可以触发 JavaScript 的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后取执行某些操作

比如说,点击一个按钮,弹出对话框

1. 事件时由三部分组成:事件源、事件类型、事件处理程序,我们也称为事件三要素

<button id='btn>唐伯虎</button>
<script>
    // (1) 事件源,事件被触发的对象
    var btn = document.getElementById('btn');
    // (2) 事件类型,如果触发?什么事件?比如鼠标点击(onclick),或者鼠标经过,还是键盘按下
    // (3) 事件处理程序,通过一个函数赋值的方式完成
    btn.onclick = function() {
        alert('点秋香');
    }
</script>

实例:

执行事件的步骤

  1. 获取事件源
  2. 注册事件(绑定事件)
  3. 添加事件处理程序(采取函数赋值形式)

执行事件步骤

<div>123</div>
<script>
    // 获取事件源
    var div = document.querySelector('div');
    // 绑定事件和添加事件处理程序
    div.onclick = function() {
        console.log('我被选中了');
    }
</script>

打开控制台,然后点我,你可以看到数值一直在变

常见的鼠标事件

鼠标事件 触发条件
onclick 鼠标点击左键触发
onmouseover 鼠标经过时触发
onmouseout 鼠标离开时触发
onfocus 获得鼠标焦点触发
onblur 失去鼠标焦点触发
onmousemove 鼠标移动触发
onmouseup 鼠标弹起触发
onmousedown 鼠标按下触发

操作元素-修改元素内容

JavaScript 的 DOM 操作可以改变网页内容、结构和样式,我们可以利用 DOM 操作元素来改变元素里面的内容、属性等。注意以下都是属性

element.innerText 从其实位置到终止位置的内容,但它去除 html 标签,同时空格和换行也会去掉

element.innerHTML 其实位置到终止位置的全部内容,包括 html 标签,同时保留空格和换行

比如点击按钮替换元素显示系统时间

<button>显示当前系统时间</button>
<div>某个时间</div>
<script>
    // 1. 获取元素
    var btn = document.querySelector('button');
    var div = document.querySelector('div');
    // 2. 注册事件
    btn.onclick = function() {
        div.innerText = '2022-4-23';
    }
</script>

结果:2022-4-23 (是死的)

实例:

但是时间并不是动态的,可以通过以前使用过的方法来获取动态时间

<button>显示当前系统时间</button>
<div>某个时间</div>
<script>
    var btn = document.querySelector('button');
    var div = document.querySelector('div');
    btn.onclick = function () {
        div.innerText = getDate();
    }
    function getDate() {
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var dates = date.getDate();
        var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];     
        var day = date.getDay();
        return '今天是' + year + '年' + month + '月' + dates + '日' + arr[day];
    }
</script>

结果:今天是2022年4月23日星期六 (动态)

实例:

如果想要实现刷新浏览器就显示时间的效果可以这样

<p></p>
<script>
    function getDate() {
        var date = new Date();
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var dates = date.getDate();
        var arr = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
        var day = date.getDay();
        return '今天是' + year + '年' + month + '月' + dates + '日' + arr[day];
    }
    var p = document.querySelector('p');
    p.innerText = getDate();
</script>

时间会显示到最上面的空 <p></p> 标签

innerTextinnerHTML 都可以改变 HTML 的内容,但它们有什么区别呢?

首先是 innerText

<div></div>
<script>
    var div = document.querySelector('div');
    div.innerText = '2022';
</script>

结果:div是 '2022'

但是如果把文字尝试加粗

<div></div>
<script>
    var div = document.querySelector('div');
    div.innerText = '<strong>2022</strong>';
</script>

结果:div 是 '<strong>2022</strong>'

它不仅没有把文字加粗,反而把标签显示出来了,因为它不识别 HTML 标签

但是如果用的是 innerHTML 呢?

<div></div>
<script>
    var div = document.querySelector('div');
    div.innerHTML = '<strong>2022</strong>';
</script>

结果:div是'2022'

innerHTML 是 W3C 标准,也是使用最多的

innerTextinnerHTML 还有另外一个区别,innerText 会去除空格和换行,但是 innerHTML 会保留空格和换行

操作元素-修改元素属性

比如说修改一张图片,需要修改 src 属性

<button id="on">开启</button>
<button id="off">关闭</button>

<img src="images/off.jpg" title="关灯">
<script>
    var on = document.getElementById('on');
    var off = document.getElementById('off');
    var img = document.querySelector('img');
    on.onclick = function () {
        img.src = 'images/on.jpg';
        img.title = '开灯';
    }
    off.onclick = function () {
        img.src = 'images/off.jpg';
        img.title = '关灯';
    }
</script>

实例:

常用元素的属性操作

1. innerText innerHTML 改变元素内容
2. src href
3. id alt title

案例:分时显示不同图片,显示不同问候语

根据不同时间,页面显示不同图片,同时显示不同问候语。

如果上午时间打开页面,显示上午好,显示上午的图片。

如果下午时间打开页面,显示下午好,显示下午图片。

如果晚上时间打开页面,显示晚上好,显示晚上图片。

案例分析:

  1. 根据系统不同时间来判断,所以需要用到日期内置对象
  2. 利用多分支语句来设置不同的图片
  3. 需要一个图片,并且根据时间修改图片,就需要用到操作元素 src 属性
  4. 需要一个 div 元素,显示不同问候语,修改元素内容即可

代码:

<div> </div>
<img src="">
<script>
    var img = document.querySelector('img');
    var div = document.querySelector('div');
    var date = new Date();
    var h = date.getHours();
    if (h < 12) {
        img.src = 'https://url.cy/WhUPj3';
        div.innerHTML = '上午好'
        console.log('上午时间');
    } else if (h < 18) {
        img.src = 'https://url.cy/XvQDk3';
        div.innerHTML = '下午好';
        console.log('下午时间');
    } else {
        img.src = 'https://url.cy/sIb5K2';
        div.innerHTML = '晚上好';
        console.log('晚上时间');
    }
</script>

案例:

表单元素属性操作

利用 DOM 可以操作如下表单元素属性:

type、value、checked、selected、disabled

input 标签是 value 属性的,所以不能使用 innerHTML 来修改内容,需要使用 input.value = '内容'; 来修改内容

<button>按钮</button>
<input type="text" value="输入内容">
<script>
    var btn = document.querySelector('button');
    var input = document.querySelector('input');
    btn.onclick = function () {
        input.value = '被点击了';
    }
</script>

如果想要某个表单被禁用,不能被再点击,可以使用 disabled

btn.disabled = true;

this.disabled 的效果是一样的

this.disabled = true;

代码:

<button>按钮</button>
<input type="text" value="输入内容">
<script>
    var btn = document.querySelector('button');
    var input = document.querySelector('input');
    btn.onclick = function () {
        input.value = '被点击了';
        // btn.disabled = true;    也可以这样输入
        this.disabled = true;    // 经常使用
    }
</script>

示例:

案例:仿显示密码

点击按钮将密码框切换为文本乱搞,并可以查看密码明文

案例分析:

  1. 核心思路:点击眼睛按钮,把密码框类型改为文本框就可以看见里面的密码
  2. 一个按钮两个状态,点击一次,切换为文本框,继续点击一次切换为密码框
  3. 算法:利用一个 flag 变量,来判断 flag 的值,如果是 1 就切换为文本框,flag 设置为 0,如果是 0 就切换为密码框,flag 设置为 1

代码:

<div>
    <a id="eye" href="#eye">显示密码</a>
    <input type="password" id="pwd">
</div>
<script>
    // 1.获取元素
    var eye = document.getElementById('eye');
    var pwd = document.getElementById('pwd');
    // 2.注册事件
    var flag = 0;
    eye.onclick = function () {
        if (flag == 0) {
            pwd.type = 'text';
            eye.innerHTML = '隐藏密码';
            flag = 1;
        } else {
            pwd.type = 'password';
            eye.innerHTML = '显示密码';
            flag = 0;
        }
    }
</script>

显示密码

样式属性操作

我们可以通过 JS 修改元素的大小、颜色、位置等样式

  1. element.style    行内样式操作
  2. element.className    类名样式操作

使一个 div 的背景颜色改变

var div = document.querySelector('div');
div.onclick = function () {
    this.style.backgroundColor = 'purple';
}

点我测试

注意:

  1. JS 里面的样式采取驼峰命名法,比如:fontSize、backgroundColor
  2. JS 修改 style 样式操作,产生的是行内样式,CSS 权重比较高

案例:关闭广告

  1. 核心思路:利用样式的显示和隐藏完成,display:none 隐藏元素 display:block 显示元素
  2. 点击按钮,就让这个二维码盒子隐藏起来即可

代码:

<div id="box">
    <i id="close">x</i>
    <div>我是小广告</div>
</div>
<script>
    var box = document.querySelector('#box');
    var close = document.querySelector('#close');
    close.onclick = function () {
        box.style.display = 'none';
    }
</script<

示例:

x
我是小广告

案例:显示隐藏文本框内容

当鼠标点击文本框时,里面的默认文字隐藏,当鼠标离开文本框时,里面的文字显示

案例分析:

  1. 首先表单需要 2 个新时间,获得焦点 onfocus 失去焦点 onblur
  2. 如果获得了焦点,判断表单里面内容是否为文字,如果时默认文字,就清空表单内容
  3. 如果失去焦点,判断表单内容是否为空,如果为空,则表单内容改为默认文字

代码:

<input type="text" value="输入框">
<script>
    // 1.获取元素
    var text = document.querySelector('input');
    // 2.注册事件
    text.onfocus = function () { // onfocus 代表获得焦点
        if (this.value === '输入框') {
            this.value = '';
            // 获得焦点需要把文本框里面的文字颜色变黑
            this.style.color = '#333';
        }
    }
    text.onblur = function () { // onblur 代表失去了焦点
        if (this.value === '') {
         this.value = '输入框';
        }
        // 失去焦点需要把文本框里面的文字颜色变成浅色
        this.style.color = '#999';
    }
</script>

实例:

使用 className 修改样式属性

如果你尝试给元素点击变换效果实在是很麻烦

test.onclick = function() {
    this.style.backgroundColor = 'purple';
    this.style.color = #fff;
    this.style.fontSize = '25px';
    this.style.marginTop = '100px';
}

你可以通过这个代码改变元素的类名

test.onclick = function() {
    this.className = 'change';
}

这样就可以改变元素类名了,新类名时 change

注意:

  1. 如果样式修改较多,可以采取操作类名方式更改元素样式
  2. class 因为是个保留字,因此使用 className 来操作元素类名属性
  3. className 会直接更改元素类名,会覆盖原先的类名
  4. 如果想要保留原先的类名,可以这样写:this.className = 'first change';

案例:密码框验证信息

用户如果离开密码框,里面输入个数不是6~16则提示错误信息,否则提示输入正确信息

案例分析:

  1. 首先判断的事件是表单失去焦点 onblur
  2. 如果输入正确则提示正确信息颜色变为绿色
  3. 如果输入的不是6~16位,则提示错误信息颜色变为红色
  4. 因为里面变化样式较多,我们采取 className 修改样式

代码:

<div class="register">
    <input type="password" class="ipt">
    <p class="message">请输入6~16位密码</p>
</div>
<script>
    var ipt = document.querySelector('.ipt');
    var message = document.querySelector('.message');
    ipt.onblur = function () {
        if (this.value.length == 0) {
            message.innerHTML = '您没有输入!请输入6~16位密码!';
            message.className = 'wrong';
        } else if (this.value.length < 6 || this.value.length > 16) {
            message.innerHTML = '您输入的位数错误!请输入6~16位密码!';
            message.className = 'wrong';
        } else {
            message.className = 'right';
            message.innerHTML = '您输入的位数正确!';
        }
    }
</script>

实例:

操作元素总结

操作元素是 DOM 核心内容

操作元素:

  1. innerText
  2. innerHTML

操作常见元素属性:

  1. src
  2. href
  3. title
  4. alt等...

操作表单元素属性:

  1. type
  2. value
  3. disabled等...

操作元素样式属性

  1. element.style
  2. className

排他思想(算法)

比如有五个按钮,如何实现点击哪个按钮让那个按钮变色,其他按钮复原呢?

利用 for 循环,下面是 JS 代码:

var btns = document.getElementsByTagName('button');
for (var i = 0; i < btns.length; i++) {
    btns[i].onclick = function() {
        // 我们先把所有的按钮背景颜色去掉
        for (var i = 0; i < btns.length; i++) {
            btns[i].style.backgroundColor = '';
        }
        // 然后让当前元素背景颜色位 pink
        this.style.backgroundColor = 'pink';
    }
}

如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法:

  1. 所有元素全部清除样式(干掉其他人)
  2. 给当前元素设置样式(留下我自己)
  3. 注意顺序不能颠倒,首先干掉其他人,再设置自己

案例:百度换肤

  1. 这个案例联系的是给一组元素注册事件
  2. 给4个小图片利用循环注册点击事件
  3. 当我们点击了这个图片,让我们页面背景改为当前图片
  4. 核心算法:把当前图片的 scr 路径取过来,给 body 做为背景即可

代码:自己想去!!

实例:

案例:表格隔行变色

  1. 用到新的鼠标事件,鼠标经过 onmouseover 鼠标离开 onmouseout
  2. 核心思路:鼠标经过 tr 行,当前的行面背景颜色,鼠标离开去掉当前的背景颜色
  3. 注意:第一行(thead里面的行)不需要变换颜色,因此我们获取的是 tbody 里面的行

代码:

var trs = document.querySelector('tbody').querySelectorAll('tr');
for (var i = 0; i < trs.length; i++) {
    trs[i].onmouseover = function () {
        this.className = 'bg';
    }
    trs[i].onmouseout = function () {
        this.className = '';
    }
}

实例:

案例:表单全选取消全选案例

  1. 全选和取消全选做法:让下面所有复选框 checked 属性(选中状态)跟随全选按钮即可

自定义属性的操作

1. 获取元素的属性值

var 属性 = document.querySelector('元素');
console.log(属性.id);

或者

console.log(div.getAttribute('id'));

添加自定义属性值

<div id='demo' index='1'></div>

element.setAttribute('属性', '值'); 主要针对于自定义属性

属性.setAttribute('index', 2);

修改自定义属性从 1 修改到 2

修改 class 元素

div.setAttribute('class', 'footer');

即能修改自定义属性也能修改 class 属性,因为比较特殊,所以不是 chassName 直接是 class

使用 removeAttribute(属性) 移除属性

属性.removeAttribute('index');

自定义属性 index 就不见了

案例:tab 栏切换(重点案例)

当鼠标点击上面相应的选项卡(tab),下面内容跟随变化

案例分析:

  1. Tab 栏切换有 2 个大模块
  2. 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想)修改类名的方式
  3. 下面的模块内容,会跟随上面的选项卡变化。所以下面模块变化写到点击事件里面
  4. 规律:下面的模块显示内容和上面的选项卡一一对应,相匹配
  5. 核心思路:给上面的 tab 里面的所有小 li 添加自定义属性,属性值从 0 开始编号。
  6. 当我们点击 tab 里面的某个小 li,让 tab 里面对应序号的内容显示,其余隐藏(排他思想)

代码:太长了,所以略

实例:

点我试试