文章目录
1.Dom(文档对象模型)
2.元素获取方法
-
<div id="time">2019-9-9</div> // 1.返回的是一个元素对象 var timer = document.getElementById("time"); console.log(typeof timer); console.log(timer); // console.dir打印我们返回的元素对象,更好的查看里面的属性和方法 console.dir(timer);
-
<ul> <li>我是ul1</li> <li>我是ul2</li> </ul> <ol id="o"> <li>我是ol1</li> <li>我是ol2</li> </ol> ------------------------------------------------------------------ // 2.返回的是元素对象合集,以伪数组形式存储的 // 如果页面中只有一个li,返回的还是伪数组的形式 // 如果页面中没有这个元素,返回的是空的伪数组的形式 console.log(document.querySelector('#o li')); console.log(document.querySelectorAll('ol li')); var lis = document.getElementsByTagName('li'); console.log(lis); for (var i = 0; i < lis.length; i++) { console.log(lis[i]); } var ol = document.getElementsByTagName('ol'); // 还可以获取某个(父)元素内部所有指定标签名的子元素 // 父元素必须是单个对象,获取的时候不包括父元素自己 console.log(ol[0].getElementsByTagName('li'));//这样更便捷
-
<div class="box">盒子1</div> <div class="box">盒子2</div> document.getElementsByClassName('类名')//根据类名返回元素对象集合 console.log(document.getElementsByClassName('box'));
-
重点(常用)
<div id="time">2019-9-9</div> <div class="box">盒子1</div> <div class="box">盒子2</div> document.querySelector('选择器');//根据指定选择器返回第一个元素对象 console.log(document.querySelector('.box')); console.log(document.querySelector('#time')); // 返回指定选择器的所有元素对象合集 console.log(document.querySelectorAll('.box')); console.log(document.querySelectorAll('ol li'));
-
获取body和html元素
// 获取body和html元素 var bodyEle = document.body; console.log(bodyEle); var htmlEle = document.documentElement; console.log(htmlEle);
3.常见鼠标事件和事件三要素
鼠标事件 | 触发条件 |
---|---|
onclick | 鼠标点击左键触发 |
onmouseover | 鼠标经过触发 |
onmouseout | 鼠标离开触发 |
onfocus | 获得鼠标焦点触发 |
onblur | 失去鼠标焦点触发 |
onmousemove | 鼠标移动触发 |
onmouseup | 鼠标弹起触发 |
onmousedown | 鼠标按下触发 |
mouseenter和mouseleave | 经过和离开但是不会冒泡 |
<button id="btn">唐伯虎</button>
<script>
var btn = document.getElementById('btn');
btn.onclick = function () {
alert('点秋香');
}
事件源btn,事件类型onclick,事件处理程序:弹出对话框
4.innerText和innerHtml的区别:⭐️
<div></div>
<p>
我是文字
<span>123</span>
</p>
<script>
// innerText 和 innerHTML的区别
// 1. innerText 不识别html标签 非标准 去除空格和换行
var div = document.querySelector('div');
div.innerText = '<strong>今天是:</strong> 2019';
// 2. innerHTML 识别html标签 W3C标准 保留空格和换行的
// div.innerHTML = '<strong>今天是:</strong> 2019';
// 这两个属性是可读写的 可以获取元素里面的内容
var p = document.querySelector('p');
console.log(p.innerText);
console.log(p.innerHTML);
</script>
5.修改元素内容和属性及样式属性
<div>单独</div>
<button>点击</button>
<script>
var btn = document.querySelector('button');
var div = document.querySelector('div');
btn.onclick = function () {
div.innerText = '绝世武神';
div.innerHTML = '武神';//后面会覆盖前面的
}
------------------------------------------------
<button id="ldh">刘德华</button>
<button id="zxy">张学友</button> <br>
<img src="images/ldh.jpg" alt="" title="刘德华">
<script>
// 修改元素属性 src
// 1. 获取元素
var ldh = document.getElementById('ldh');
var zxy = document.getElementById('zxy');
var img = document.querySelector('img');
// 2. 注册事件 处理程序
zxy.onclick = function() {
img.src = 'images/zxy.jpg';
img.title = '张学友思密达';
}
ldh.onclick = function() {
img.src = 'images/ldh.jpg';
img.title = '刘德华';
}
------------------------------------------------
// element.style行内样式操作
//element.className 类名样式操作
var div = document.querySelector('div');
// 2. 注册事件 处理程序
div.onclick = function() {
// div.style里面的属性 采取驼峰命名法
//Js修改style样式操作,产生的是行内样式,权重较高
this.style.backgroundColor = 'purple';
this.style.width = '250px';
}
6.修改表单属性
<button>按钮</button>
<input type="text" value="有本事你就点我呀">
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function () {
input.value = '我被点击了';
this.disabled = true;
}
</script>
7.className修改元素样式
div {
width: 100px;
height: 100px;
background-color: pink;
}
.change {
background-color: purple;
color: #fff;
font-size: 25px;
margin-top: 100px;
}
</style>
</head>
<body>
<div class="first">文本</div>
<script>
// 1. 使用 element.style 获得修改元素样式 如果样式比较少 或者 功能简单的情况下使用
var test = document.querySelector('div');
test.onclick = function() {
// this.style.backgroundColor = 'purple';
// this.style.color = '#fff';
// this.style.fontSize = '25px';
// this.style.marginTop = '100px';
// 让我们当前元素的类名改为了 change
// 2. 我们可以通过 修改元素的className更改元素的样式 适合于样式较多或者功能复杂的情况
// 3. 如果想要保留原先的类名,我们可以这么做 多类名选择器
// this.className = 'change';
this.className = 'first change';
}
8.排他思想
<button></button>
<button></button>
<button></button>
<button></button>
<button></button>
<button></button>
<script>
var b=document.getElementsByTagName('button');
//b得到的是一个伪数组
for(var i=0;i<b.length;i++){
b[i].onclick=function(){
//先把所有按钮的背景颜色去掉
for(var i=0;i<b.length;i++){
b[i].style.backgroundColor='';
}
//然后才添加颜色
this.style.backgroundColor='pink';
}
}
9.表单全选
<table width='300px' hight="300">
<thead>
<th><input id="qx" type="checkbox" name="" id=""></th>
<td>商品</td>
<td>价钱</td>
</thead>
<tbody>
<tr>
<td><input type="checkbox" name="" id=""></td>
<td>哈哈</td>
<td>个个</td>
</tr>
<tr>
<td><input type="checkbox" name="" id=""></td>
<td>哥哥</td>
<td>哥哥</td>
</tr>
<tr>
<td><input type="checkbox" name="" id=""></td>
<td>哥哥</td>
<td>哥哥</td>
</tr>
</tbody>
</table>
<script>
var qx = document.getElementById('qx');
var dx = document.querySelector('tbody').querySelectorAll('input');
console.log(dx);
qx.onclick = function () {
for (var i in dx) {
dx[i].checked = this.checked;
}
}
for (var i in dx) {
dx[i].onclick = function () {
var flag = true;
for (var i = 0; i < dx.length; i++) {
if (!dx[i].checked) {
flag = false;
break;
}
}
qx.checked = flag;
}
}
10.属性的获取,设置修改和删除
自定义属性通过getAttribute获取
自定义属性的目的:未来保存并使用数据,有些数据可以保存到页面中而不是数据库中
//1-获取元素的属性
<div id="deom" in="1" class="g" data-index='2'></div>
//(1)element.属性 获取内置属性
var div = document.querySelector('div')
console.log(div.id);
//(2)element.getAttribute('属性') 我们程序员自己添加的属性
console.log(div.getAttribute('id'));
console.log(div.getAttribute('in'));
console.log(div.in);//自定义的无法获取
//2-设置元素属性值
//(1)element.属性='值' 设置内置属性
div.id = 'test';
div.className = 'navs';
//(2)element.setAttribute('属性','值'); 主要针对于自定义属性
div.setAttribute('in', 2);
div.setAttribute('class', 'foot')
//3-移除属性 removeAttribute(属性)
div.removeAttribute('in');
----------------------------------------------------------------
H5自定义属性规范
有些自定义属性容易引起歧义,不易判断是内置属性还是自定义属性
//h5规范,规定自定义属性data-开头作为属性名并且赋值
<div getTime='ff' data-index='2' data-list-name='andy'></div>
console.log(div.getAttribute('data-index'))//方法1常用
//方法2,有兼容性问题
//dataset是一个集合,存放所有以data开头的自定义属性
console.log(div.dataset.index);
console.log(div.dataset['index']);
//如果自定义属性里面有多个-链接的单词,我们获取的时候采取驼峰命名法
console.log(div.dataset.listName)
console.log(div.dataset['listName'])
11.tab栏切换
<div class="tab">
<div class="tab_list">
<ul>
<li class="current">商品介绍</li>
<li>规格与包装</li>
<li>售后保障</li>
<li>商品评价(50000)</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">
商品评价(50000)模块内容
</div>
<div class="item">
手机社区模块内容
</div>
</div>
</div>
<script>
// 1、排他思想
// 2、设置元素属性:元素.setAttribute('属性名','值')
// 3、访问元素属性:元素.getAttribute('属性名')
var tab_list = document.querySelector('.tab_list');
var lis = tab_list.querySelectorAll('li');
var items = document.querySelectorAll('.item')
for (var i = 0; i < lis.length; i++) {
lis[i].setAttribute('index', i);
lis[i].addEventListener('click', function () {
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'
}
items[index].style.display = 'block';
})
}
// for (var i = 0; i < lis.length; i++) {
// //开始给5个小li设置索引号
// lis[i].setAttribute('index',i);
// lis[i].onclick = function () {
// //排他思想
// for (var i = 0; i < lis.length; i++) {
// lis[i].className = '';
// }
// this.className = 'current';
// //2-下面的内容显示模块
// var index=this.getAttribute('index');
// for(var i=0;i<items.length;i++){
// items[i].style.display='none'
// }
// items[index].style.display='block';
// }
// }
12.父子节点
<div class="y">
<div class="f">
<span class="z">grgt</span>
</div>
</div>
<ul>
<li>欣欣子</li>
<li>欣欣子</li>
<li>欣欣子</li>
<li>欣欣子</li>
</ul>
<ol>
<li>欣欣子</li>
<li>欣欣子</li>
<li>欣欣子</li>
<li>欣欣子</li>
</ol>
<script>
// 父节点
var zi = document.querySelector('.z')
// var f=document.querySelector('f');
//得到的是距离最近的父节点。如果没有父节点就为 null
console.log(zi.parentNode);
//子节点
var ul = document.querySelector('ul');
var lis = document.querySelectorAll('li');
//1.子节点 childNodes 所有的子节点包含 元素节点,文本节点等
console.log(ul.childNodes);
console.log(ul.childNodes[0].nodeType);//文本节点的nodeType属性是3
console.log(ul.childNodes[1].nodeType);//元素节点的nodeType属性是1
//2-children 获取所有的子元素节点,也是我们实际开发常用的
console.log(ul.children);
//第一个子节点和最后一个子节点
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>
</body>
13.新浪菜单
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
a {
text-decoration: none;
font-size: 14px;
}
.nav {
margin: 100px;
}
.nav>li {
position: relative;
float: left;
width: 80px;
height: 41px;
text-align: center;
}
.nav li a {
display: block;
width: 100%;
height: 100%;
line-height: 41px;
color: #333;
}
.nav>li>a:hover {
background-color: #eee;
}
.nav ul {
display: none;
position: absolute;
top: 41px;
left: 0;
width: 100%;
border-left: 1px solid #FECC5B;
border-right: 1px solid #FECC5B;
}
.nav ul li {
border-bottom: 1px solid #FECC5B;
}
.nav ul li a:hover {
background-color: #FFF5DA;
}
</style>
</head>
<body>
<ul class="nav">
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="">私信</a>
</li>
<li>
<a href="">评论</a>
</li>
<li>
<a href="">@我</a>
</li>
</ul>
</li>
</ul>
<script>
// 1. 获取元素
var nav = document.querySelector('.nav');
console.log(nav);
var lis = nav.children;
for (var i = 0; i < lis.length; i++) {
lis[i].onmouseover = function () {
this.children[1].style.display = 'block'
};
lis[i].onmouseout = function () {
this.children[1].style.display = 'none'
}
}
</script>
</body>
14.兄弟节点
<div>我是div</div>
<span>我是span</span>
<script>
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);
15.创建添加,删除和复制元素
<ul>
<li>123</li>
</ul>
<script>
//创建节点元素节点
var li = document.createElement('li');
//添加节点 node.appendChild(child) node是父级 child是子级 后面追加元素,类似于数组中的push
var ul = document.querySelector('ul');
ul.appendChild(li);
//3-添加节点 node.insertBefore(child,指定元素);
var lili = document.createElement('li');
ul.insertBefore(lili, ul.children[0]);
//我们想要页面添加一个新的元素 : 1.创建元素 2.添加元素
<button>删除</button>
<ul>
<li>熊大</li>
<li>熊二</li>
<li>光头强</li>
</ul>
<script>
//1-获取元素
var ul = document.querySelector('ul');
var btn = document.querySelector('button');
//2-删除元素 node.removeChild(child);
// ul.removeChild(ul.children[0]);
//3-点击按钮移除删除里面的孩子
btn.onclick = function () {
if (ul.children.length == 0) {
this.disabled = true;
} else {
ul.removeChild(ul.children[0]);
}
}
</script>
//1-node.cloneNode();括号为空或者里面是false 浅拷贝,只复制标签不复制里面的内容
//1-node.cloneNode(true);括号为true 深浅拷,复制标签复制里面的内容
var lili = ul.children[0].cloneNode(true);
16.注册事件两种方法🔯
首选第2种
<button>传统注册事件</button>
<button>方法监听注册事件</button>
<button>attachEvent</button>
<script>
var btns = document.querySelectorAll('button');
//2-传统方式注册事件 传统注册事件,注册事件的唯一性,同一元素或事件只能设置一个处理函数,最后面的会覆盖前面的
btns[0].onclick = function () {
alert('李');
}
btns[0].onclick = function () {
alert('欣');
}
//方法监听注册方式
// 2.(1)事件侦听注册事件 addEventListener里面的事件类型字符串 必定加引号,而且不带on,Ie9以上支持
// (2)同一个元素看,同一个事件可以添加多个侦听器(事件处理程序)
btns[1].addEventListener('click', function () {
alert(22);
})
btns[1].addEventListener('click', function () {
alert(33);
})
17.删除事件
var divs = document.querySelectorAll('div');
divs[0].onclick = function () {
alert(11);
//传统方式删除事件
divs[0].onclick = null;
}
//2.removeEventListener删除事件
divs[1].addEventListener('click', fn)//里面的fn不需要调用小括号()
function fn() {
alert(22);
divs[1].removeEventListener('click', fn)
}
18.事件流:捕获和冒泡
-
1.JS代码中只能执行捕获或者冒泡其中的一个阶段,只能有一个
-
2.onclick 和 attachEvent(ie) 只能得到冒泡阶段
-
捕获阶段 如果addEventListener 第3个参数是 true 那么则处于捕获阶段 document->html->body->father->son
<div class="father">
<div class="son">son盒子</div>
</div>
<script>
var son = document.querySelector('.son');
son.addEventListener('click', function () {
alert('son');
}, true)
var father = document.querySelector('.father');
father.addEventListener('click', function () {
alert('father');
}, true)
-
冒泡阶段 如果addEventListener 第3个参数是 false 或者不填那么则处于冒泡阶段 son->father->body->html->document
var son = document.querySelector('.son'); son.addEventListener('click', function () { alert('son'); }) var father = document.querySelector('.father'); father.addEventListener('click', function () { alert('father'); }) document.addEventListener('click', function () { alert('document'); })
19.事件对象
var div=document.querySelector('div');
div.onclick=function(e){
// console.log(e);
// console.log(window.event);
// e=e||window.event;兼容性问题处理方法
console.log(e);
}
// div.addEventListener('click',function(e){
// console.log(e);
// })
//1.event 就是一个事件对象,写到我们侦听函数的 小括号里面 当形参来看
//2.事件对象只有有了事件才会存在,它是系统给我们自动创建的,不需要我们传递参数
//3.事件对象 是我们事件的一系列相关数据的集合 跟事件相关的 比如鼠标点击里面就包含了鼠标的相关信息,鼠标坐标啊,如果是键盘事件里面的就包含的键盘事件的信息 比如 判断用户按下了哪个键
// 4.这个事件对象我们可以自己命名 比如 event , evt , e
// 5. 事件对象也有兼容性问题 ie678 只通过 window.event
targe和this的区别
<div>123</div>
<ul>
<li>abc</li>
<li>bc</li>
<li>c</li>
</ul>
<script>
//常见事件对象的属性和方法
//1- e.target 返回的是触发事件的对象 (元素) this 返回的是绑定事件的对象(元素)
// 区别: e.target 点击了那个元素,就返回那个元素 this 那个元素绑定了这个点击事件,那么就返回谁
var div = document.querySelector('div');
div.addEventListener('click', function (e) {
console.log(e.target);
console.log(this);
})
var ul = document.querySelector('ul');
ul.addEventListener('click', function (e) {
console.log(this);
console.log(e.target);
})
常见对象的属性和方法
e.type | 返回事件的类型,比如click ,mouseover,不带on |
---|---|
e.preventDefault() | 阻止默认事件(行为),比如不让链接跳转 |
e.stopPropagation() | 阻止冒泡标准 |
//常见事件对象的属性和方法
//1-返回事件类型
var div = document.querySelector('div');
div.addEventListener('click', fn);
div.addEventListener('mouseover', fn);
div.addEventListener('mouseout', fn);
function fn(e) {
console.log(e.type);
}
//2.阻止默认行为(事件) 让链接不跳转,或者让提交按钮不提交
var a = document.querySelector('a');
a.addEventListener('click', function (e) {
e.preventDefault();//dom标准写法
})
//3.传统的注册方式
a.onclick = function () {
//普通浏览器 e.preventDafault(); 方法
e.preventDefault();
// 低版本浏览器 ie678 returnValue 属性
e.returnValue;
// 我们可以利用 return false 也能阻止默认行为 没有兼容性问题
return false;// 特点:return 后面的代码不执行了,而且只限于传统的注册方式
alert(11);
}
事件委托原理
不是给每个子节点单独设置监听器,而是设在父节点上,利用冒泡影响设置每个子结点
<ul>
<li>知否知否,点我应有弹框在手</li>
<li>知否知否,点我应有弹框在手</li>
<li>知否知否,点我应有弹框在手</li>
<li>知否知否,点我应有弹框在手</li>
<li>知否知否,点我应有弹框在手</li>
<li>知否知否,点我应有弹框在手</li>
</ul>
<script>
//事件委托的核心原理:给父节点添加侦听器, 利用事件冒泡影响每一个子节点
var ul = document.querySelector('ul');
var lis = ul.querySelectorAll('li');
ul.addEventListener('click', function (e) {
// alert('知否知否,点我应有弹框在手!');
for(var i=0;i<lis.length;i++) {
lis[i].style.backgroundColor = '';
}
e.target.style.backgroundColor = 'pink';
})
</script>
20.鼠标事件对象
//鼠标事件对象 MouseEvent
document.addEventListener('click', function (e) {
//1-client 鼠标在可视区的x和y坐标
console.log(e.clientX);
console.log(e.clientY);
//2-page 鼠标在页面文档的x和y坐标 ie9以上才支持
console.log('------------');
console.log(e.pageX);
console.log(e.pageY);
//3-screen 鼠标在电脑屏幕的x和y坐标
console.log('------------');
console.log(e.screenX);
console.log(e.screenY);
})
21.常用键盘事件
//1- keyup 按键弹起的时候触发
document.onkeyup=function(){
console.log('我弹起了');
}
//2- keydown 按键按下的时候触发 能识别功能键· 比如 ctrl shift 左右箭头啊
document.addEventListener('keydown',function(){
console.log('我按下了down');
})
//3- keypress 按键按下的时候触发 不能识别功能键· 比如 ctrl shift 左右箭头啊
window.addEventListener('keypress',function(){
console.log('我按下了press');
})
//4- 三个事件的执行顺序 keydown--keypress--keyup
//键盘事件对象中的keyCode属性可以得到相应键的ASCII码值
//1-我们的keyup 和keydown事件不区分字母大小写 a 和 A 得到的·都是大写65
//2-我们的keypress事件区分字母大小写 a97和A65
document.addEventListener('keyup', function (e) {
console.log('up:' + e.keyCode);
if (e.keyCode === 65) {
alert('你按下的是a键');
} else {
alert('你没按下a键');
}
})
document.addEventListener('keypress', function (e) {
console.log('press:' + e.keyCode);
})
22.拖放算法
- 在
mousedown
上 —— 根据需要准备要移动的元素(也许创建一个它的副本,向其中添加一个类或其他任何东西)。 - 然后在
mousemove
上,通过更改position:absolute
情况下的left/top
来移动它。 - 在
mouseup
上 —— 执行与完成的拖放相关的所有行为。
ball.onmousedown = function(event) {
// (1) 准备移动:确保 absolute,并通过设置 z-index 以确保球在顶部
ball.style.position = 'absolute';
ball.style.zIndex = 1000;
// 将其从当前父元素中直接移动到 body 中
// 以使其定位是相对于 body 的
document.body.append(ball);
// 现在球的中心在 (pageX, pageY) 坐标上
function moveAt(pageX, pageY) {
ball.style.left = pageX - ball.offsetWidth / 2 + 'px';
ball.style.top = pageY - ball.offsetHeight / 2 + 'px';
}
// 将我们绝对定位的球移到指针下方
moveAt(event.pageX, event.pageY);
function onMouseMove(event) {
moveAt(event.pageX, event.pageY);
}
// (2) 在 mousemove 事件上移动球
document.addEventListener('mousemove', onMouseMove);
// (3) 放下球,并移除不需要的处理程序
ball.onmouseup = function() {
document.removeEventListener('mousemove', onMouseMove);
ball.onmouseup = null;
};
};