前端学习笔记-Day2
一、元素排他思想算法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>
<script>
// 获取所有按钮元素
// 根据标签名获取元素
var btns = document.getElementsByTagName('button');
// BTN获得是数组
for(var i = 0; i < btns.length; i++)
{
btns[i].onclick = function(){
// 首先将所有的按钮背景颜色去掉
for(var j = 0; j < btns.length; j++)
{
btns[j].style.backgroundColor = '';
}
// 然后才让当前的元素背景颜色变为Pink
this.style.backgroundColor = 'pink';
}
}
</script>
</body>
</html>
- 所有元素全部清除样式
- 给当前元素设置样式
- 顺序不可以颠倒
二、案例分析-更换背景图片
- 给四个图片利用循环注册点击事件
- 当我们点击图片之后,页面背景改为当前的图片
- 核心思想:将当前图片的src路径取出来,给Body作为背景
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<ul>
<li><img src = "images/ldh.jpg"></li>
<li><img src = "images/wrong.jpg"></li>
</ul>
<script>
// 获取元素
// 现根据类名 获取元素 再根据标签名获取元素
var imgs = document.querySelector('.baidu').querySelector('img');
// 循环注册事件
for(var i = 0; i < imgs.length; i++)
{
imgs[i].onclick = function(){
// 改变Body标签的背景图片
document.body.style.backgroundImage = 'url(' + this.src + ')';
}
}
</script>
</body>
</html>
三、案例分析-表格颜色
- 鼠标事件:鼠标经过onmouseover 鼠标离开onmouseout
- 核心思路:鼠标经过tr行 当前行的变背景颜色 鼠标离开去掉当前的背景颜色
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.bg{
background-color: pink;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>代码</th>
<th>名称</th>
<th>最新公布净值</th>
<th>累计净值</th>
<th>前单位净值</th>
<th>净值增长率</th>
</tr>
</thead>
<tbody>
<tr>
<td>003526</td>
<td>xxxxxx</td>
<td>1.1111</td>
<td>1.2121</td>
<td>1.3221</td>
<td>003526</td>
</tr>
</tbody>
</table>
<script>
// 获取元素 获取的是tbody里面的所有的行
var trs = document.querySelector('tbody').querySelectorAll('tr');
// 利用循环绑定注册事件
for(var i = 0; i < trs.length; i++)
{
// 鼠标经过注册事件
trs[i].onmouseover = function(){
this.className = 'bg';// 直接通过类名更改样式
}
trs[i].onmouseout = function(){
this.className = '';// 不添加样式
}
}
</script>
</body>
</html>
四、案例分析-全选
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 全选和取消全选 让下面所有复选框的checked属性跟随全选按钮
// 获取元素
// 获取全选按钮
var j_cbAll = document.getElementById('j_cbAll');
// 获取所有单选框
var j_tbs = document.getElementById('j_tb').getElementsByTagName('input');
// 全选按钮注册事件
j_cbAll.onclick = function(){
// checked属性查看复选框的选中状态
for(var i = 0; i < j_tbs.length; i++)
{
// 所有单选框的状态随着复选框状态变化
j_tbs[i].checked = this.checked;
}
}
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 == false)
{
flag = false;
break;
}
}
j_cbAll.checked = flag;
}
}
</script>
</body>
</html>
五、自定义属性
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id = "demo" index = "1" class = "nav"></div>
<script>
var div = document.querySelector('div');
// element.属性
console.log(div.id);
//element.getAttribute('属性')
console.log(div.getAttribute('id'));
console.log(div.getAttribute('index'));
// 设置属性值
div.id = 'test';
div.className = 'navs';
// 针对自定义属性
div.setAttribute('index',2);
div.setAttribute('class','footer');
// 移除属性
div.removeAttribute('index');
</script>
</body>
</html>
六、H5自定义属性
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
自定义属性获取是通过getAttribute(‘属性’) 获取。
但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
H5给我们新增了自定义属性:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div getTime = "20" data-index = "2" data-list-name = "andy"></div>
<script>
var div = document.querySelector('div');
console.log(div.getAttribute('getTime'));
// 设置自定义属性
div.setAttribute('data-time',20);
console.log(div.getAttribute('data-list-name'));
// h5新增的获取自定义属性的方法
// 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>
</body>
</html>
七、利用节点操作属性
7.1 节点概述
网页中的所有内容都是节点(标签、属性、文本、注释)在DOM中节点使用Node来表示,
节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)三个基本属性
7.1 父节点parentNode
寻找该节点的父节点,找不到返回null
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 节点 -->
<div>
我是div
</div>
<span>我是span</span>
<ul>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
</ul>
<div class = "box">
<span class = "erweima">x</span>
</div>
<script>
var box = document.querySelector('.box');
var e = document.querySelector('.erweima');
console.log(e.parentNode);// 获取父节点 box
</script>
</body>
</html>
7.2 childNodes 所有子节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 节点 -->
<div>
我是div
</div>
<span>我是span</span>
<ul>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
</ul>
<div class = "box">
<span class = "erweima">x</span>
</div>
<script>
var box = document.querySelector('.box');
var e = document.querySelector('.erweima');
console.log(e.parentNode);// 获取父节点 box
// 原始的获取所有子节点方法
var ul = document.querySelector('ul');
var lis = ul.querySelectorAll('li');// 返回子节点集合
// 子节点
console.log(ul.childNodes);// 获取所有子节点
</script>
</body>
</html>
注意:childNodes返回值包含了所有的子节点 元素节点 文本节点,需要进行筛选
for(var i = 0; i < ul.childNodes.length; i++)
{
if(ul.childNodes[i].nodeType == 1)
{
// 如果是元素节点 不是文本节点 打印
console.log(ul.childNodes[i]);
}
}
使用children获取所有的子元素节点 实际开发常用的
console.log(ul.children);
7.3 子节点
这两个方法 很可能获取的是文本节点
获取第一个子元素节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 节点 -->
<div>
我是div
</div>
<span>我是span</span>
<ul>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
<li>我是Li</li>
</ul>
<div class = "box">
<span class = "erweima">x</span>
</div>
<script>
var ol = document.querySelector('ol');
// 获取第一个元素节点 或者是文本节点
console.log(ol.firstChild);
console.log(ol.lastChild);
// 返回第一个子元素节点
console.log(ol.firstElementChild);
console.log(ol.lastElementChild);// 获取最后一个子元素节点
// 或者写成 使用children 获取所有元素节点 排除文本节点
console.log(ol.children[0]);// 第一个子元素节点
console.log(ol.children[ol.children.length - 1]);// 获取最后一个子元素节点
</script>
</body>
</html>
7.4 兄弟节点
function getNextElementSibling(element)
{
var el = element;
while(el = el.nextSibling)
{
if(el.nodeType === 1)
{
return el;//寻找元素节点
}
}
return null;
}
7.5 创建节点
创建节点之后需要添加节点
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 节点 -->
<ul>
<li>
123
</li>
</ul>
<script>
// 创建节点元素
var li = document.createElement('li');
// 添加节点
// 先获取ul元素对象
var ul = document.querySelector('ul');
ul.appendChild(li);// 添加元素节点到末尾
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<!-- 节点 -->
<ul>
<li>
123
</li>
</ul>
<script>
// 创建节点元素
var li = document.createElement('li');
// 添加节点
// 先获取ul元素对象
var ul = document.querySelector('ul');
ul.appendChild(li);// 添加元素节点到末尾
// 在指定节点前面插入节点
var lili = document.createElement('li');
// 在第一个孩子节点前面插入节点
ul.insertBefore(lili,ul.children[0]);
</script>
</body>
</html>