javascript-排他思想+节点操作
排他思想
- 所有元素全部清除样式
- 给当前元素设置样式
- 注意顺序,先干掉其他人,再设置自己
<script>
//1.获取所有按钮元素
var btns = document.getElementsByTagName('button');
//btns得到的是伪数组 里面的每一个元素 btns[i]
for (var i = 0; i < btns.length; i++) {
btns[i].onclick = function () {
//(1)我们先把所有的按钮颜色去掉
for (var i = 0; i < btns.length; i++) {
btns[i].style.backgroundColor = '';
}
//(2)然后让当前的元素背景颜色为pink
this.style.backgroundColor = 'pink';
}
}
</script>
案列:百度换肤
这个案例练习的是给一组元素注册事件
给4个图片利用循环注册点击事件
当我们点击这个图片,让我们页面背景改为当前的图片
核心算法:把当前这个图片的src路径取过来,给body做背景即可
<style> * { margin: 0; padding: 0; } body { background: url(images/1.jpg) no-repeat center top; } li { list-style: none; } .baidu { overflow: hidden; margin: 100px auto; background-color: #fff; width: 410px; padding-top: 3px; } .baidu li { float: left; margin: 0 1px; cursor: pointer; } .baidu img { width: 100px; } </style>
<ul class="baidu">
<li><img src="images/1.jpg" alt=""></li>
<li><img src="images/2.jpg" alt=""></li>
<li><img src="images/3.jpg" alt=""></li>
<li><img src="images/4.jpg" alt=""></li>
</ul>
<script>
//1.获取元素
var imgs = document.querySelector('.baidu').querySelectorAll('img');
//2.循环注册事件
for (var i = 0; i < imgs.length; i++) {
imgs[i].onclick = function () {
//this.src就是我们点击图片的路径,把该路径给body
document.body.style.backgroundImage = 'url(' + this.src + ')';
}
}
</script>
表单中全选案例
- 全选和取消全选做法:让下面所以复选框的checked属性跟随全选按钮即可
- 下面复选框需要全部选中,上面的全选才能选中:给下面所以复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没有没选中的,如果有一个没选中的,上面全选就不选中。
- 设置一个变量来控制全选或不全选
<div class="wrap">
<table>
<thead>
<tr>
<th>
<input type="checkbox" id="j_cbAll">
</th>
<th>商品</th>
<th>价钱</th>
</tr>
</thead>
<tbody id="j_tb">
<tr>
<td>
<input type="checkbox">
</td>
<td>iPhone8</td>
<td>8000</td>
</tr>
<tr>
<td>
<input type="checkbox">
</td>
<td>mac</td>
<td>12000</td>
</tr>
<tr>
<td>
<input type="checkbox">
</td>
<td>watch</td>
<td>2000</td>
</tr>
</tbody>
</table>
</div>
<script>
//1.全选取消全选
//获取元素
var j_cbAll = document.getElementById('j_cbAll');//全选
var j_tbs = document.getElementById('j_tb').getElementsByTagName('input');
//注册事件
j_cbAll.onclick = function () {
// this.checked;可以得到当前复选框的选中状态,true选中状态
for (var i = 0; i < j_tbs.length; i++) {
j_tbs[i].checked = this.checked;
}
}
//2.下面复选框需要全部选中,上面的全选才能选中:给下面所以复选框绑定点击事件,每次点击,
//都要循环查看下面所有的复选框是否有没有没选中的,如果有一个没选中的,上面全选就不选中。
for (var i = 0; i < j_tbs.length; i++) {
j_tbs[i].onclick = function () {
// flag控制全选按钮是否选中
var flag = true;
//每次点击下面的复选框都要循环检查小按钮是否全选中
for (var i = 0; i < j_tbs.length; i++) {
if (!j_tbs[i].checked) {
flag = false;
break;//退出循环可以提高执行效率
}
}
j_cbAll.checked = flag;
}
}
</script>
自定义属性操作
获取属性值/设置属性值/移除属性值
<div id="demo" index="1" class="nav"></div>
<script>
var div = document.querySelector('div');
//1.获取元素的属性值
//(1)element.属性
console.log(div.id);
//(2)element.getAttribute('属性') get得到获取attribute 属性的意思
//程序自己添加的属性成为自定义属性
console.log(div.getAttribute('id'));
console.log(div.getAttribute('index'));
//2.设置属性值
//(1)第一种方法
div.id = 'test';
div.className = 'navs';
//(2)针对自定义
div.setAttribute('index', 2);
div.setAttribute('class', 'float');//class特殊 不需要弄classname
//3.移除属性
div.removeAttribute('index');
</script>
区别
第一种方法用于获取内置属性值(元素本身自带的属性)
第二种方法主要获得自定义属性
淘宝切换栏
<style> * { margin: 0; padding: 0; } .tab_list { height: 200px; } .tab_list li { float: left; height: 39px; line-height: 39px; padding: 0 20px; text-align: center; cursor: pointer; } .tab_list .current { background-color: brown; color: azure; } .item_info { padding: 20px 0 0 20px; } .item { display: none; } </style>
<div class="tab">
<div class="tab_list">
<ul>
<li class="current">商品介绍</li>
<li>规格与包装</li>
<li>售后保障</li>
<li>商品评价(5000+)</li>
<li>手机社区</li>
</ul>
</div>
<div class="tab_con">
<div class="item" style="display: block;">商品介绍模块内容</div>
<div class="item">规格与包装模块内容</div>
<div class="item">售后保障模块内容</div>
<div class="item">商品评价模块内容</div>
<div class="item">手机社区模块内容</div>
</div>
</div>
<script>
var tab_list = document.querySelector('.tab');
var lis = tab_list.querySelectorAll('li');
var items = document.querySelectorAll('.item');
for (var i = 0; i < lis.length; i++) {
//开始给5个li设置索引号
lis[i].setAttribute('index', i);
lis[i].onclick = function () {
//1.排他思想
for (var i = 0; i < lis.length; i++) {
lis[i].className = '';
}
this.className = 'current';
var index = this.getAttribute('index');
for (var i = 0; i < items.length; i++) {
items[i].style.display = 'none';
}
//干掉所有人 让其余div隐藏
items[index].style.display = 'block';
}
}
</script>
H5自定义属性
目的:为了保存并使用数据 ,有些数据可以保存到页面中而不用保存到数据库中
自定义属性获取通过getAttribute(‘属性’)获取。
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性
1.设置H5自定义属性
H5规定自定义属性data-开头作为属性名并赋值
<div getTime="20" data-index="2" data-list-name="ame"></div>
<script>
var div = document.querySelector('div');
console.log(div.getAttribute('getTime'));
div.setAttribute('data-time', 20);
console.log(div.getAttribute('data-index'));
//dataset 是一个集合里面存放了所有以data开头的自定义属性
console.log(div.dataset);
console.log(div.dataset.index);
console.log(div.dataset['index']);
//如果自定义属性里面有多个-连接的词,我们获取的时候采取驼峰命名法
console.log(div.dataset.listName);
</script>
节点操作
<ol>
<li>no.1</li>
<li>no.2</li>
<li>no.3</li>
<li>no.4</li>
</ol>
<script>
var ol = document.querySelector('ol');
//1.firstChild第一个子节点 不管是文本节点还是元素节点
console.log(ol.firstChild);
console.log(ol.lastChild);
//2.兼容性问题
console.log(ol.firstElementChild);
console.log(ol.lastElementChild);
//3.实际开发用法
console.log(ol.children[0]);
console.log(ol.children[ol.children.length - 1]);
</script>
创建节点增加节点
<ul>123</ul>
<script>
//1.创建节点元素节点
var li = document.createElement('li');
//2.添加节点 node.appendChild(child) node父级 child是子集 后面追加元素
var ul = document.querySelector('ul');
ul.appendChild(li);
//3.添加节点
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]);
</script>
发布留言案例
<textarea name="" id="">123</textarea>
<button>发布</button>
<ul>
</ul>
<script>
//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 {
//1.创建元素
var li = document.createElement('li');
li.innerHTML = text.value;
//2.添加元素
// ul.appendChild(li);
ul.insertBefore(li, ul.children[0]);
}
}
</script>

浙公网安备 33010602011771号