获取元素
使用getElementByld()方法可以获取带有ID的元素对象
<body>
<div id="time">2020-10-10</div>
<script>
//我们的文档页面是从上往下加载,所以先得有标签
//get 获得element元素by通过驼峰命名法
//参数是 id 大小写敏感的字符串
//返回的是一个元素对象
var timer = document.getElementById('time');
console.log(timer);
//console.dir()打印我们返回的元素对象,更好的查看对象里面的属性何方法
console.dir(timer);
</script>
</body>
使用标签名getElementsTagName()方法返回带有指定标签名的对象的集合
<div class="box">盒子</div>
<div class="box">盒子</div>
<div>
<ul>
<li>首页</li>
<li>产品</li>
</ul>
</div>
<script>
//1. getElementsByClassName 根据类名获取某些元素集合
var boxs = document.getElementsByClassName('box');
console.log(boxs);
// querySelector()返回指定选择器的第一个元素对象
var firstBox = document.querySelector('.box');
console.log(firstBox);
var nav = document.querySelector('#nav');
console.log(nav);
var li = document.querySelector('li');
console.log(li);
// querySelectorAll() 返回指定选择器的所有元素对象集合
var allBox = document.querySelectorAll('.box');
console.log(allBox);
</script>
获取特殊元素(body html)
<script>
//获取body标签
var bodyEle = document.body;
console.log(bodyEle);
console.dir(bodyEle);
//获取html标签
var htmlEle = document.documentElement;
console.log(htmlEle);
</script>
事件三要素
<button id="btn">唐伯虎</button>
<script>
//点击一个按钮,弹出对话框
//1. 事件是由三部分组成 事件源 事件类型 事件处理程序 成为事件的三要素
//事件源 事件被触发的对象
var btn = document.getElementById('btn');
//事件类型 如何触发什么时间 比如鼠标点击(onclick) 还是鼠标经过 还是键盘按下
//事件处理程序 通过一个函数赋值的方式 完成
btn.onclick = function () {
alert('点秋香');
}
</script>
<body>
<div>123</div>
<script>
//执行时间步骤
//点击div 控制台输出 我被选中了
//获取事件源
var div = document.querySelector('div');
//绑定事件
//div.onclick
//3.添加事件处理程序
div.onclick = function() {
alert('我被选中了');
}
</script>
</body>
常见的鼠标事件
改变元素内容
element.innerText 可以修改元素的内容
<button>显示当前系统时间</button>
<div>某个时间</div>
<p>张三</p>
<script>
//当我们点击了按钮,div里面的文字会发生变化
//获取元素
var btn = document.querySelector('button');
var div = document.querySelector('div');
//注册事件
btn.onclick = function () {
div.innerText = getDate();
}
function getDate() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
var dates = date.getDate();
var array = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'];
var day = date.getDay();
return '今天是' + year + '年' + month + '月' + dates + '日' + array[day];
}
//元素可以不用添加事件
var p = document.querySelector('p');
p.innerText = getDate();
</script>
innerText 和innerHTML 的区别
innerText 不识别html标签 去除空格和换行
innerHTML 识别html标签 保留空格和换行
<div></div>
<p>
我是文字
<span>123</span>
</p>
<script>
//innerText 和 innerHTML 的区别
//1. innerText 不识别html标签 去除空格和换行
var div = document.querySelector('div');
// div.innerText = '今天是2021年5月21号';
//innerHTML 识别html标签 保留空格和换行
div.innerHTML = '<strong>今天是</strong>2021年5月21号';
//这两个元素是可读写的,可以获取元素里面的内容
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
</script>
操作元素修改元素属性
<button id="xiao">小标签</button>
<button id="11">二维码</button>
<img src="images/regetype.png" alt="">
<script>
//修改元素属性 src
var ldh = document.getElementById('xiao');
var zxy = document.getElementById('11');
var img = document.querySelector('img');
//注册事件处理程序
zxy.onclick = function () {
img.src = 'images\account.png';
}
ldh.onclick = function () {
img.src = 'images/regetype.png';
}
</script>
修改表单元素
<button>按钮</button>
<input type="text" value="输入内容">
<script>
//获取元素
var btn = document.querySelector('button');
var input = document.querySelector('input');
//注册事件,处理程序
//表单里面的值是通过value来修改的
btn.onclick = function () {
input.value = '点击后';
//禁用表单 不能进行再次点击 disabled
//btn.disabled = true;
this.disabled = true;//this指向的是事件函数的调用者
}
</script>
样式属性操作
element.style 行内样式操作
element.className 类名样式操作
常见的正则表达式服符号
创建正则表达式对象:
正则表达式对象的 test()方法
true/ false = 正则表达式.test(用户填写的字符串);
获取属性值
<div id="demo" index='1'></div>
<script>
//获取元素的属性值
//element.属性
var div = document.querySelector('div');
console.log(div.id);
//element.getAttribute('属性') 可以获取得到自定义属性
console.log(div.getAttribute('id'));
console.log(div.getAttribute('index'));
</script>
更改属性值和移除属性
<div id="demo" index='1'></div>
<script>
//获取元素的属性值
//element.属性
var div = document.querySelector('div');
console.log(div.id);
//element.getAttribute('属性') 可以获取得到自定义属性
console.log(div.getAttribute('id'));
console.log(div.getAttribute('index'));
//设置元素属性值
//element.属性 = 值
div.id = 'test';
//element.setAttribute('属性', '值'); 主要针对于自定义属性
div.setAttribute('index', '2');
//移除属性removeAttribute(属性)
div.removeAttribute('index');
</script>
H5规定自定义属性data-开头最为属性名并且赋值
比如<div data-index = '1'><div>
节点操作 利用DOM提供的方法进行获取元素
逻辑性不强,繁琐
利用节点层次关系获取元素
利用父子兄关系节点关系获取元素
逻辑性强,但是兼容性差
节点
至少拥有三个基本属性
节点类型:nodeType
节点名称:nodeName
节点值:nodeValue
节点层级
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系
父级节点
node.parentNode
<div class="box">
<span class="erweimma"></span>
</div>
<script>
//1.父节点parentNode 得到的是距离元素最近的父级节点
var erweima = document.querySelector('.erweima');
// var box = document.querySelector('.box');
var box = erweima.parentNode;
</script>
子节点
childNodes 得到所有的子节点包含元素节点和文本节点等等
children 返回所有的元素节点其余节点不返回
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<div class="demo">
<div class="box">
<span class="erweima"></span>
</div>
</div>
<script>
//DOM提供的方法获取
var ul = document.querySelector('ul');
//var lis = ul.querySelectorAll('li');
//子节点 childNodes得到所有的子节点包含元素节点和文本节点等等
console.log(ul.childNodes);
//children(非标准) 返回所有的元素节点其余节点不返回
console.log(ul.children);
</script>
获取第一个子节点,找不到返回null,包含所有的节点
firstChild
获取最后一个子节点
lastChild
第一个元素节点
firstElementChild
<ol>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ol>
<script>
var ol = document.querySelector('ol');
//firstChild
console.log(ol.firstChild);
//lastChild
console.log(ol.lastChild);
//firstElementChild
console.log(ol.firstElementChild);
//实际上
console.log(ol.children[0]);
console.log(ol.children[ol.children.length - 1]);
</script>
兄弟节点
nextSibling
previousSibling
nextElementSibling
previousElementSibling
<div>我是div</div>
<span>我是span</span>
<script>
var div = document.querySelector('div');
//nextSibling得到的是下一个兄弟节点 包含元素节点 和文本节点等等
console.log(div.nextSibling);
console.log(div.previousSibling);
//返回下一个兄弟元素节点
console.log(div.nextElementSibling);
console.log(div.previousElementSibling);
</script>
创建和添加节点
creatElement(‘tagName’)
appendChild(child)
<ul>
<li>123</li>
</ul>
<script>
//创建节点元素节点
var li = document.createElement('li');
//添加节点
var ul = document.querySelector('ul');
ul.appendChild(li);
var lili = document.createElement('li');
ul.appendChild(lili, ul.children[0]);
</script>
删除节点(父节点里面的子节点)
node.remove(child)
<button>删除</button>
<ul>
<li>熊大</li>
<li>熊二</li>
<li>光头强</li>
</ul>
<script>
//获取元素
var ul = document.querySelector('ul');
var btn = document.querySelector('button');
//删除元素 node.remove(child)
//ul.removeChild(ul.children[0]);
//点击按钮依次删除里面的孩子
btn.onclick = function () {
if (ul.children.length == 0) {
this.disabled = true;
} else {
ul.removeChild(ul.children[0]);
}
}
</script>
复制节点
node.cloneNode()
注意:
/括号里面的参数为空或者里面是false,则是浅拷贝,只复制标签,不复制里面的内容
//括号里面的参数里面是true,则是深拷贝,复制标签和里面的内容
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
//node.cloneNode()
//括号里面的参数为空或者里面是false,则是浅拷贝,只复制标签,不复制里面的内容
//括号里面的参数里面是true,则是深拷贝,复制标签和里面的内容
var ul = document.querySelector('ul');
var lili = ul.children[0].cloneNode();
ul.appendChild(lili);
</script>
注册事件
给元素添加事件称为注册事件或者绑定事件
两种方式:传统方式和方法监听注册方式
<button>传统注册事件</button>
<button>方法监听注册事件</button>
<script>
var btns = document.querySelectorAll('button');
//传统方式注册事件
btns[0].onclick = function () {
alert('hi');
}
btns[0].onclick = function () {
alert('how are you');
}
//事件监听注册事件 addEventListener里面的事件类型值字符串需要加引号 不要on
//同一个元素同一个事件可以添加多个监听器
btns[1].addEventListener('click', function () {
alert(22);
})
btns[1].addEventListener('click', function () {
alert(33);
})
</script>
删除事件
<div>1</div>
<div>2</div>
<div>3</div>
<script>
var divs = document.querySelectorAll('div');
divs[0].onclick = function () {
alert(11);
//传统方式删除事件
divs[0].onclick = null;
}
divs[1].addEventListener('click', fn)//里面的fn调用不需要加()
function fn() {
alert(22);
divs[1].removeEventListener('click', fn);
}
</script>
DOM事件流
冒泡阶段和捕获阶段
<div class="father">
<div class="son">son盒子</div>
</div>
<script>
//dom 事件流 三个阶段
// 1.js代码中只能执行捕获或者冒泡其中的一个阶段
// 2.onclick 和 attachEvent(ie) 只能得到冒泡阶段
// 3.捕获阶段 如果addEventListener 第三个参数是 true那么则处于捕获阶段
// var son = document.querySelector('.son');
// son.addEventListener('click', function () {
// alert('son');
// }, true);
// var father = document.querySelector('.father');
// father.addEventListener('click', function () {
// alert('father');
// }, true);
// 4.冒泡阶段 如果addEventListener 第三个参数是 false或者省略那么则处于冒泡阶段
var son = document.querySelector('.son');
son.addEventListener('click', function () {
alert('son');
}, false);
var father = document.querySelector('.father');
father.addEventListener('click', function () {
alert('father');
}, false);
document.addEventListener('click', function () {
alert('document')
}, false)
</script>
事件对象
<div>123</div>
<script>
//事件对象
var div = document.querySelector('div');
div.onclick = function (e) {
// console.log(e);
// console.log(window.event);
e = e || window.event;
console.log(e);
}
//1.event就是一个事件对象,写到我们侦听函数的小括号里面当形参来看
//2.事件对象只有有了事件才会存在 他是系统创建的,不需要我们传递参数
//3.事件对象是事件的一系列相关数据的集合 跟事件相关的
// 4.这个事件对象可以自己命名
//5. 事件对象又兼容性问题 兼容性写法
</script>
事件对象常见的属性和方法
<div>123</div>
<a href="http://www.baidu.com">百度</a>
<form action="http://www.baidu.com">
<input type="submit" value="提交" name="sub">
</form>
<script>
//常见对象的属性和方法
//1.返回事件类型
var div = document.querySelector('div');
div.addEventListener('click', fn);
div.addEventListener('mouseover', fn);
div.addEventListener('mouseout', fn);
function fn() {
console.log(e.type);
}
//阻止默认行为(事件)让链接不跳转 或者让提交按钮不提交
var a = document.querySelector('a');
a.addEventListener('click', function (e) {
e.preventDefault();
})
//传统的注册方式
a.onclick = function (e) {
//普通浏览器
e.preventDefault();
//低版本浏览器 returnValue
e.returnValue;
//可以利用return falsez阻止默认行为,而且没有兼容性问题
return false;
}
</script>
组织冒泡事件
e.stopPropagation() 阻止冒泡标准(兼容性问题)
e.cancleBubble = true; //传统方法
事件委托(委派 代理)
原理:不是每个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用冒泡原理影响设置每个子节点
<ul>
<li>点我应有弹框在手</li>
<li>点我应有弹框在手</li>
<li>点我应有弹框在手</li>
<li>点我应有弹框在手</li>
<li>点我应有弹框在手</li>
</ul>
<script>
//事件委托的核心原理:给父节点添加一个时间按监听器,然后利用冒泡原理影响设置每个子节点
var ul = document.querySelector('ul');
ul.addEventListener('click', function (e) {
//alert('点我应有弹框在手');
//e.target 这个可以得到我们点击的对象
e.target.style.backgroundColor = 'pink';
})
</script>
常用的鼠标事件
鼠标事件对象
常用的键盘事件
案例
```javascript
<input type="text">
<script>
var serrch = document.querySelector('input');
document.addEventListener('keyup', function (e) {
if (e.keyCode == 83) {
serrch.focus();
}
})
</script>