DOM--操作元素

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

1.改变元素内容

改变元素内容有两种方式,分别如下

// 第一种:element.innerText 表示从起始位置到终止位置的内容, 但它去除 html 标签, 同时空格和换行也会去掉
// 比如:
<body>
    <p>我真棒!</p>
    <script>
        // 需求:将p元素中的内容替换成以h2标签,同时h2标签中的文字为:努力做到最好~
        // 1. 获取元素
        // 注意:使用标签获取元素得到的是一个集合,需要使用下标获得具体值
        let p = document.getElementsByTagName("p")[0];
        // 2. 操作元素
        p.innerText = '<h2>努力做到最好~</h2>'
    </script>
</body>

上述代码,执行的结果如下:

 我们的原始需求是想把 “我真棒!” 的文字改为 “努力做到最好~,同时该文字添加h2的样式,但是使用innerText属性,并没有得到我们想要的,这是因为 innerText 属性是不识别HTML标签的,而是把其当成单纯的文本内容,从而得到如上结果。

那么,要想实现以上需求,该怎么办呢?

这就需要使用改变文本内容的另一个属性——innerHTML,它也是我们实际开发中最常用的。具体使用如下:

// 第二种:element.innerHTML 表示起始位置到终止位置的全部内容,包括 html 标签,同时保留空格和换行
<body>
    <p>我真棒!</p>
    <script>
        // 需求:将p元素中的内容替换成以h2标签,同时h2标签中的文字为:努力做到最好~
        // 1. 获取元素
        // 注意:使用标签获取元素得到的是一个集合,需要使用下标获得具体值
        let p = document.getElementsByTagName("p")[0];
        // 2. 操作元素
        p.innerHTML = '<h2>努力做到最好~</h2>'
    </script>
</body>

只要把上面代码中的p.innerText 改成 p.innerHTML ,就可实现下图效果:

通过代码演示,可以直观的感受到 innerText 和 innerHTML 的作用和区别,作用就是用来改变元素的内容,删除元素中的内容,则只需要设置 element.innerText=""  或者 element.innerHTML="" ,即设置属性值为空。区别:一个识别HTML标签,一个不识别,推荐使用innerHTML。

2. 常用元素的属性操作

① innerText、innerHTML 改变元素内容
② src、href
③ id、alt、title

2.1 案例:图片的点击切换

<style>
    * {
        margin: 0;
        padding: 0;
    }
    .box {
        width: 400px;
        padding: 20px;
        margin: 50px;
        text-align: center;
        border: 1px solid #ccc;
    }
    .box img {
        width: 370px;
        height: 240px;
        margin: 10px 0;
    }
    .box button {
        padding: 3px 7px;
        margin: 0 5px;
    }
</style>
<body>
    <div class="box">
        <p></p>
        <img src="images/01.jpg" alt="">
        <button>上一张</button>
        <button>下一张</button>
    </div>
    <script>
        // 需求:在p元素中呈现内容 "一共有x张图片,当前是第x张,点击按钮实现图片上下的切换"
        // 1. 获取元素
        // 注意:使用标签获取元素得到的是一个集合,需要使用下标获得具体值
        let p = document.getElementsByTagName("p")[0];
        let img = document.querySelector("img");
        // 注意:使用querySelectorAll()获取到的是一个集合,需要使用下标获得具体值
        let btn = document.querySelectorAll("button");
        // 2. 定义一个数组存放图片地址
        let imgArr = [
            'images/01.jpg',
            'images/02.jpg',
            'images/03.jpg',
            'images/04.jpg',
            'images/05.jpg',
        ];
        // 3. 定义一个变量 index 表示当前图片的索引号,因为默认打开浏览器,呈现在页面上的是第一张,所以index=0
        let index = 0;
        // 4. 为了防止打开页面时p标签中存有值,所以需要先为其添加内容
        // 注意:图片张数与图片地址的个数一致,即数组长度即为图片张数,而index是从0开始的,但是用户知道是从1开始的,所以当前的图片是第(index+1)张
        p.innerHTML = '一共有' + imgArr.length + '张图片,当前是第' + (index + 1) + '张';
        // 5. 给上一张按钮绑定点击事件
        btn[0].onclick = function() {
            // 点击上一张,则意味着当前的index-1
            index--;
            // 但是数组的index最小为0,所以要进行判断,如果当前是第一张,那么点击上一张,则让其显示最后一张,实现循环
            if (index < 0) {
                index = imgArr.length - 1;
            };
            // 通过更改图片标签的src属性,实现图片的真正切换
            // 语法:element.src='新的url';
            img.src = imgArr[index];
            // 图片切换了,意味着p标签的内容也要相应变化
            p.innerHTML = '一共有' + imgArr.length + '张图片,当前是第' + (index + 1) + '张';
        };
        // 6. 给下一张按钮绑定点击事件,思路基本一样
        btn[1].onclick = function() {
            // 点击下一张,则意味着当前的index+1
            index++;
            // 但是数组的index最大为数组长度-1,所以要进行判断,如果当前是最后一张,那么点击下一张,则让其显示第一张,实现循环
            if (index > imgArr.length - 1) {
                index = 0;
            };
            // 通过更改图片标签的src属性,实现图片的真正切换
            // 语法:element.src='新的url';
            img.src = imgArr[index];
            // 图片切换了,意味着p标签的内容也要相应变化
            p.innerHTML = '一共有' + imgArr.length + '张图片,当前是第' + (index + 1) + '张';
        };
    </script>
</body>

 

3.表单元素的属性操作

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

type、value、checked、selected、disabled

 3.1 案例:密码可见性的切换

<style>
    .box {
        position: relative;
        width: 500px;
        margin: 50px auto;
    }
    input {
        margin: 10px 0;
        width: 500px;
        height: 30px;
        border: 0;
        outline: none;
        border-bottom: 1px solid #ccc;
    }
    #account_ts {
        position: absolute;
        top: 54px;
        right: 8px;
        font-size: 13px;
    }
    button {
        margin-top: 20px;
        width: 500px;
        height: 40px;
        border-radius: 20px;
        background-color: red;
        border: 0;
        color: #fff;
    }
    div {
        font-size: 14px;
        color: #888;
    }
    .log {
        height: 40px;
        margin-top: 20px;
    }
    .left {
        float: left;
    }
    .right {
        float: right;
    }
    label img {
        position: absolute;
        right: 4px;
        top: 108px;
        width: 22px;
        height: 22px;
        color: rgb(47, 191, 47);
        cursor: pointer;
    }
</style>
<body>
    <div class="box">
        <h3>京东登录</h3>
        <input type="text" placeholder="用户名/邮箱/已验证手机" id="account">
        <label for="">
            <img src="images/close.png" alt="">
        </label>
        <input type="password" placeholder="密码" id="pwd"><br>
        <button>登录</button>
        <div class="log">
            <div class="left">短信验证码登录</div>
            <div class="right">手机快速注册</div>
        </div>
    </div>
    <script>
        // 需求:点击密码框右侧的眼睛实现密码的显示与隐藏
        // 本质:改变文本框的type属性,如果是text,则是显示密码,如果password则密码加密
        // 1. 获取元素
        let img = document.querySelector('img');
        let inputPwd = document.getElementById("pwd");
        // 2. 给右侧眼睛注册点击事件
        // 由于要进行点击切换,所以要使用开关思想实现眼睛的睁开和关闭(定义一个变量表示状态)
        let flag = true;
        img.onclick = function() {
            if (flag) {
                // 如果flag为true,则将图片切换为眼睛睁开的,即表示密码可见性
                this.src = 'images/open.png';
                // 将密码框改为文本框,即输入的密码可见
                inputPwd.type = 'text';
                // 并将变量flag赋值为false,实现切换
                flag = false;
            } else {
                // 如果flag为false,则将图片切换为眼睛关闭的,即表示密码不可见性
                this.src = 'images/close.png';
                // 将文本框改为密码框,即输入的密码不可见
                inputPwd.type = 'password';
                // 并将变量flag赋值为true,实现切换
                flag = true;
            }
        }
    </script>
</body>

 

 

4.样式属性操作

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

① element.style 行内样式操作
② element.className 类名样式操作

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

(3)如果样式修改较多,可以采取操作类名方式更改元素样式。 
(4)class因为是个保留字,因此使用className来操作元素类名属性
(5)className 会直接更改元素的类名,会覆盖原先的类名

4.1 案例: 循环精灵图背景

<style>
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
    .box {
        width: 250px;
        margin: 100px;
    }
    .box li {
        list-style: none;
        float: left;
        width: 24px;
        height: 24px;
        background-color: pink;
        margin: 15px;
        background: url(images/sprite.png) no-repeat;
    }
</style>
<body>
    <div class="box">
        <ul>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>
    <script>
        // 需求:利用 for 循环设置一组元素的精灵图背景,并将其呈现在页面中
        // ① 首先精灵图图片排列是有规律的(竖向等差排列)
        // ② 核心思路:利用for循环 修改精灵图片的背景位置background-position
        // ③ 剩下的就是考验你的数学功底了(找到索引号和坐标之间的关系,这里是索引号*44即为y坐标值)
        // 1. 获取元素,所有的小li
        let lis = document.querySelectorAll("li");
        // 2. 遍历所有的小li
        for (let i = 0; i < lis.length; i++) {
            // 让索引号*44,就是每个li的背景y坐标
            let index = i * 44;
            // 横坐标是不变的,所以为0,而横纵坐标之间要以-隔开
            lis[i].style.backgroundPosition = '0-' + index + 'px'
            console.log('0-' + index + 'px');
        }
    </script>
</body>

 案例分析:

① 首先精灵图图片排列有规律的
② 核心思路: 利用for循环 修改精灵图片的 背景位置 background-position
③ 剩下的就是考验你的数学功底了
④ 让循环里面的 i 索引号 * 44 就是每个图片的y坐标

5.总结

 操作元素是 DOM 核心内容,一定要掌握,以下为本文章主要介绍的操作元素的脉络框架:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值