欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Web APIs 2

程序员文章站 2022-07-14 10:19:29
...

今日学习目标:

  1. 能够说出排他操作的一般实现步骤
  2. 能够使用html5中的dataset方式操作自定义属性
  3. 能够根据提示完成百度换肤的案例
  4. 能够根据提示完成全选案例
  5. 能够根据提示完成tab栏切换案例
  6. 能够区分元素节点、文本节点、属性节点
  7. 能够获取指定元素的父元素
  8. 能够获取指定元素的所有子元素
  9. 能够说出childNodes和children的区别
  10. 能够使用createElement创建页面元素

排他操作

如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法:
所有元素全部清除样式(干掉其他人)
给当前元素设置样式 (留下我自己)
注意顺序不能颠倒,首先干掉其他人,再设置自己

首先先排除其他人,然后才设置自己的样式 这种排除其他人的思想我们成为排他思想

代码逻辑 :当点击的时候背景颜色变粉 运用循环来为每一个button注册事件
1.获取标签button的伪数组
2.遍历伪数组 注册单个事件
3.在事件里首先遍历伪数组 将所有的背景颜色清除
4.将点击的背景颜色变色 this.style.

案例:百度换肤
功能描述:有四个图片 点击那个就将body的背景换成哪张图片

<body>
    <ul class="baidu">
        <li><img src="images/1.jpg"></li>
        <li><img src="images/2.jpg"></li>
        <li><img src="images/3.jpg"></li>
        <li><img src="images/4.jpg"></li>
    </ul>
    <script>
        // 1. 获取元素 
        var imgs = document.querySelector('.baidu').querySelectorAll('img');
        // console.log(imgs);
        // 2. 循环注册事件 
        for (var i = 0; i < imgs.length; i++) {
            imgs[i].onclick = function() {
                // this.src 就是我们点击图片的路径   images/2.jpg
                // console.log(this.src);
                // 把这个路径 this.src 给body 就可以了
                document.body.style.backgroundImage = 'url(' + this.src + ')';
            }
        }
    </script>
</body>

注意: 最后将this.src赋值进去的时候用到了拼接字符串,注意写法**‘url(’ + this.src + ‘)’**

自定义属性操作

获取属性值

Web APIs 2二者最大的区别在于前者主要用于获取元素自身所带的属性,后者主要用于获取自己自定义的属性值。

设置属性值

Web APIs 2

  // 2. 设置元素属性值
        // (1) element.属性= '值'
        div.id = 'test';
        div.className = 'navs';
        // (2) element.setAttribute('属性', '值');  主要针对于自定义属性
        div.setAttribute('index', 2);
        div.setAttribute('class', 'footer'); // class 特殊  这里面写的就是

class比较特殊 在第一个里面写className 在第二个里面写class

移除属性

element.removeAttribute()

 // 3 移除属性 removeAttribute(属性)    
        div.removeAttribute('index');

如果是自带的属性用 元素.属性
自定义属性用另一个

tab栏切换

思路:
1.关于第一步 采取排他思想 点击时先将所有的li类别都设为0 ,在设置this的类别
2.关于对应的隐藏与切换,我们要明白他们的索引号是一一对应的 集点击a[1]的时候对应显示b[1],所以自定义一个属性来保存a的索引号 再把这个值传递给b 然后采取排他思想 先所有display:none 再自己 block

代码如下:

    <script>
        // 获取元素
        var tab_list = document.querySelector('.tab_list');
        var lis = tab_list.querySelectorAll('li');
        var items = document.querySelectorAll('.item');
        // for循环,给选项卡绑定点击事件
        for (var i = 0; i < lis.length; i++) {
            // 开始给5个小li 设置索引号 
            lis[i].setAttribute('index', i);
            lis[i].onclick = function() {
                // 1. 上的模块选项卡,当前这一个底色会是红色,其余不变(排他思想)
                // 干掉所有人 其余的li清除 class 这个类
                for (var i = 0; i < lis.length; i++) {
                    lis[i].className = '';
                }
                // 留下我自己 
                this.className = 'current';
                // 2. 下面的显示内容模块
                var index = this.getAttribute('index');
                console.log(index);
                // 干掉所有人 让其余的item 这些div 隐藏
                for (var i = 0; i < items.length; i++) {
                    items[i].style.display = 'none';
                }
                // 留下我自己 让对应的item 显示出来
                items[index].style.display = 'block';
            }
        }
    </script>

H5自定义属性

自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
自定义属性获取是通过getAttribute(‘属性’) 获取。
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
H5给我们新增了自定义属性的规范:
H5规定自定义属性以 data- 开头并赋值
Web APIs 2

  <div getTime="20" data-index="2" data-list-name="andy"></div>
    <script>
        var div = document.querySelector('div');
        // console.log(div.getTime);
        console.log(div.getAttribute('getTime'));
        div.setAttribute('data-time', 20);
        console.log(div.getAttribute('data-index'));
        console.log(div.getAttribute('data-list-name'));
        // h5新增的获取自定义属性的方法 它只能获取data-开头的
        // dataset 是一个集合里面存放了所有以data开头的自定义属性
        console.log(div.dataset);
        console.log(div.dataset.index);
        console.log(div.dataset['index']);
        // 如果自定义属性里面有多个-链接的单词,我们获取的时候采取 驼峰命名法
        console.log(div.dataset.listName);
        console.log(div.dataset['listName']);
    </script>

节点操作

获取元素有两种方法:
1.利用DOM提供的方法 逻辑性不强繁琐
2.利用节点层次关系获得元素 父子兄
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。
Web APIs 2
一般地,节点至少拥有nodeType(节点类型)nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
Web APIs 2

父节点

Web APIs 2

    <div class="demo">
        <div class="box">
            <span class="erweima">×</span>
        </div>
    </div>
    <script>
        // 1. 父节点 parentNode
        var erweima = document.querySelector('.erweima');
        // var box = document.querySelector('.box');
        // 得到的是离元素最近的父级节点(亲爸爸) 如果找不到父节点就返回为 null
        console.log(erweima.parentNode);
    </script>

子节点

Web APIs 2
不提倡 因为不仅获得元素节点

Web APIs 2

    <ul>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
        <li>我是li</li>
    </ul>
    <script>
        // DOM 提供的方法(API)获取
        var ul = document.querySelector('ul');
        var lis = ul.querySelectorAll('li');
        // 1. 子节点  childNodes 所有的子节点 包含 元素节点 文本节点等等
        console.log(ul.childNodes);
        console.log(ul.childNodes[0].nodeType);
        console.log(ul.childNodes[1].nodeType);
        // 2. children 获取所有的子元素节点 也是我们实际开发常用的
        console.log(ul.children);
    </script>

Web APIs 2
Web APIs 2
Web APIs 2
Web APIs 2
子节点 包括元素节点 属性节点 文本节点
所以要想得到元素节点 需要注意

实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,
考虑伪数组 实际开发的写法Web APIs 2

    <ol>
        <li>我是li1</li>
        <li>我是li2</li>
        <li>我是li3</li>
        <li>我是li4</li>
        <li>我是li5</li>
    </ol>
    <script>
        var ol = document.querySelector('ol');
        // 1. firstChild 第一个子节点 不管是文本节点还是元素节点
        console.log(ol.firstChild);
        console.log(ol.lastChild);
        // 2. firstElementChild 返回第一个子元素节点 ie9才支持
        console.log(ol.firstElementChild);
        console.log(ol.lastElementChild);
        // 3. 实际开发的写法  既没有兼容性问题又返回第一个子元素
        console.log(ol.children[0]);
        console.log(ol.children[ol.children.length - 1]);
    </script>

兄弟节点

Web APIs 2
包含元素节点文本节点
Web APIs 2
包含元素节点文本节点
Web APIs 2
得到下一个元素兄弟节点
Web APIs 2
这两个有兼容性问题 ie9以上才支持

目前可以自己封装一个函数:

 function getNextElementSibling(element) {
      var el = element;
      while (el = el.nextSibling) {
        if (el.nodeType === 1) {
            return el;
        }
      }
      return null;
    }  

创建节点

Web APIs 2

添加节点

Web APIs 2

    <ul>
        <li>123</li>
    </ul>
    <script>
        // 1. 创建节点元素节点
        var li = document.createElement('li');
        // 2. 添加节点 node.appendChild(child)  node 父级  child 是子级 后面追加元素
        var ul = document.querySelector('ul');
        ul.appendChild(li);
        // 3. 添加节点 node.insertBefore(child, 指定元素);
        var lili = document.createElement('li');
        ul.insertBefore(lili, ul.children[0]);
        // 4. 我们想要页面添加一个新的元素 : 1. 创建元素 2. 添加元素
    </script>

上一篇: css(07)

下一篇: Hive