您当前的位置: 首页 >  前端

HM-hhxx!

暂无认证

  • 3浏览

    0关注

    123博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

前端学习第二十二课(Web_API-排他、属性、节点操作)

HM-hhxx! 发布时间:2022-04-28 22:19:16 ,浏览量:3

目录

1.1 排他操作

1.2 自定义属性操作

1.2.1 获取属性值

 1.2.2 设置属性值

1.2.3 移除属性

1.2.4 H5自定义属性

1.3 节点操作

1.3.1 节点概述

1.3.2 节点层级

1.3.3 父级节点

1.3.4 子节点

1.3.5 兄弟节点

1.3.6 创建节点

1.3.7 添加节点

1.3.8 简单留言板案例

1.1 排他操作

1)排他思想:

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

  1. 所有元素全部清除样式(干掉其他人)

  2. 给当前元素设置样式 (留下我自己)

  3. 注意顺序不能颠倒,首先干掉其他人,再设置自己

案例:背景换肤


    
// 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 + ')'; } }

 案例分析:

这个案例练习的是给一组元素注册时间,给4个小图片利用循环注册点击事件,当我们点击这个图片,背景图片变换为该图片。

核心算法:把当前图片的src路径取过来,给body当作背景图片。

1.2 自定义属性操作 1.2.1 获取属性值

方法:

emelemt.属性  获取属性值;

element.getAttribute('属性');

区别: emelemt.属性  获取内置属性值(元素本身自带的属性)

emelemt.getAttribute('属性'); 主要获得自定义的属性(标准)是程序员自定义的属性

例如:

var div = document.querySelector('div'); // 1. 获取元素的属性值 // (1) element.属性 console.log(div.id); //(2) element.getAttribute('属性') get得到获取 attribute 属性的意思 我们程序员自己添加的属性我们称为自定义属性 index console.log(div.getAttribute('id')); console.log(div.getAttribute('index'));
 1.2.2 设置属性值

方法:

element.属性 = '值'    设置内置属性值

element.setAttribute('属性','值');

区别:

element.属性    用于设置内置属性值

element.setAttribute('属性','值'); 主要设置自定义的属性(标准)

例如:

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

用法:

element.removeAttribute('属性');

// class 不是className
        // 3 移除属性 removeAttribute(属性)    
        div.removeAttribute('index');
1.2.4 H5自定义属性

自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。

自定义属性获取是通过getAttribute(‘属性’) 获取。

但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。

H5给我们新增了自定义属性:

1)设置H5自定义属性

H5规定自定义属性data-开头作为属性名并赋值。

例如:

或者使用JS设置

element.setAttribute('data-index',2)

2)获取H5自定义属性值

a、兼容性获取   element.getAttribute('data-index');

b、H5新增element.dataset.index  或者element.dataset['index'];(ie11+)

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']);
1.3 节点操作 1.3.1 节点概述

网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。

HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。

 一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

元素节点 nodeType为1;

属性节点nodeType为2;

文本节点nodeType为3(文本节点包含文字、空格、换行等)

在实际开发中,节点操作主要操作的是元素节点。

1.3.2 节点层级

利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。

 1.3.3 父级节点 :

node.parentNode

parentNode属性可返回某节点的父节点,注意是最近的一个父节点。

如果指定的节点没有父节点,则返回null。

例如:

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

 console.log(erweima.parentNode);返回节点为box节点。

1.3.4 子节点

1)所有子节点

parentNode.childNodes(标准)

该方式返回包含指定节点的子节点的集合,该集合为即时更新的集合。

返回值里面包含了所有的子节点,包括元素节点,文本节点等。

如果我们只想要获得里面的元素节点,则需要经过处理,所以一般不使用childNodes。

2)子元素节点

parentNode.children(非标准)

parentNode.children 是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回(该方式要重点掌握)。

例如:

    
  • 我是li
  • 我是li
  • 我是li
  • 我是li
// 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);

运行结果如图所示: 

 3)第1个子节点

parentNode.firstChild

该方式返回第一个子节点,找不到则返回null。同样,也是包含所有的节点。

4)最后1个子节点

parentNode.lastChild 

该方式用于返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点。

5)第1个子元素节点

parentNode.firstElementChild

该方式返回第一个子元素节点,找不到则返回null。

6)最后1个子元素节点

parentNode.lastElementChild

该方式返回最后一个子元素节点,找不到则返回null。

firstElementChild、lastElementChild这种方法存在一定兼容性问题,IE9以上才支持。

实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢?

解决方案:

如果想要第一个子元素节点,可以使用:parentNode.children[0]

如果想要最后一个子元素节点,可以使用:parentNode.children[parentNode.children.length-1]

    
  1. 我是li1
  2. 我是li2
  3. 我是li3
  4. 我是li4
  5. 我是li5
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]);

运行结果如下:

 1.3.5 兄弟节点

下一个兄弟节点

nextSibling

上一个兄弟节点

previousSibling

例如:

    
我是div
我是span var div = document.querySelector('div'); // 1.nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等 console.log(div.nextSibling); console.log(div.previousSibling); // 2. nextElementSibling 得到下一个兄弟元素节点 console.log(div.nextElementSibling); console.log(div.previousElementSibling);

运行结果:

 1.3.6 创建节点

document.createElement('tagName')

document.createElement()方法创建由tagName指定的HTML元素,因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点。

1.3.7 添加节点

1)node.appendChild(child)

该方法将一个节点添加到指定父节点的子节点列表末尾,类似于CSS里面的after为元素。

2)node.insertBefore(child,指定元素)

该方法将一个节点添加到父节点的指定子节点前面,类似于CSS里面的before为元素。

例如:  

    
  • 123
// 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. 添加元素

运行结果:

1.3.8 简单留言板案例

 核心思路:点击按钮后,动态创建一个li,添加到ui里面;

创建li的同时,把文本域里面的值通过li.innerHTML赋值给li;

如果想要更新留言后面显示就用appendChild,前面显示就用insertBefore。


    
    发布
    
// 1. 获取元素 var btn = document.querySelector('button'); var text = document.querySelector('textarea'); var ul = document.querySelector('ul'); // 2. 注册事件 btn.onclick = function() { if (text.value == '') { alert('您没有输入内容'); return false; } else { // console.log(text.value); // (1) 创建元素 var li = document.createElement('li'); // 先有li 才能赋值 li.innerHTML = text.value; // (2) 添加元素 // ul.appendChild(li); ul.insertBefore(li, ul.children[0]); } }

运行结果: 

关注
打赏
1663160980
查看更多评论
立即登录/注册

微信扫码登录

0.0366s