Web APIs 2
今日学习目标:
- 能够说出排他操作的一般实现步骤
- 能够使用html5中的dataset方式操作自定义属性
- 能够根据提示完成百度换肤的案例
- 能够根据提示完成全选案例
- 能够根据提示完成tab栏切换案例
- 能够区分元素节点、文本节点、属性节点
- 能够获取指定元素的父元素
- 能够获取指定元素的所有子元素
- 能够说出childNodes和children的区别
- 能够使用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 + ‘)’**
自定义属性操作
获取属性值
二者最大的区别在于前者主要用于获取元素自身所带的属性,后者主要用于获取自己自定义的属性值。
设置属性值
// 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- 开头并赋值
<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 元素(节点)均可被修改,也可以创建或删除。
一般地,节点至少拥有nodeType(节点类型)nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
父节点
<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>
子节点
不提倡 因为不仅获得元素节点
<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>
子节点 包括元素节点 属性节点 文本节点
所以要想得到元素节点 需要注意
实际开发中,firstChild 和 lastChild 包含其他节点,操作不方便,而 firstElementChild 和 lastElementChild 又有兼容性问题,
考虑伪数组 实际开发的写法
<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>
兄弟节点
包含元素节点文本节点
包含元素节点文本节点
得到下一个元素兄弟节点
这两个有兼容性问题 ie9以上才支持
目前可以自己封装一个函数:
function getNextElementSibling(element) {
var el = element;
while (el = el.nextSibling) {
if (el.nodeType === 1) {
return el;
}
}
return null;
}
创建节点
添加节点
<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>
推荐阅读
-
web服务器集群(多台web服务器)session同步、共享的3种解决方法
-
解决SSH连接超时的2个配置方法
-
SSH框架之Struts2第一篇
-
黑莓KEY2红色版美国上市:骁龙660加持
-
华为MatePad Pro 5G正式开售:直降300元、麒麟990 5G/2K屏加持
-
用户放心买小米10 Pro 卢伟冰:2/3月旗舰全面超它的几乎没有
-
iPhone9/SE2被弃?苹果考虑将A13处理器新机命名“iPhone”:参考iPad
-
ARM中国发布“周易”Z2 AIPU处理器:性能翻倍、最多32核心
-
雷军翻出小米2A:第一款支持NFC的小米手机
-
5000mAh电池!Redmi 8系列今天宣布:告别2GB内存