Web API是浏览器提供的一套操作浏览器功能和页面元素的API(BOM和DOM)。
文档对象模型(DOM) 是处理可扩展标记语言(HTML或者XML)的标准编程接口
DOM主要用来操作页面元素
我们获取过来的DOM元素都是一个对象(object)!!
所以称为文档对象模型获取元素
关于DOM。我们主要针对元素操作,主要有创建、增、删、改、查、属性操作、事件操作。
主要修改dom的元素属性,dom元素的内容、属性表单的值等。
修改元素属性:src 、href、title等修改普通元素:innerHTML、innerText修改表单内容:value、disabled等修改元素样式:style、calssName主要针对自定义属性
setAttribute:设置dom的属性值getAttribute:得到dom的属性值removeAttribute:移除属性给元素注册事件
使用getElementByld()方法获取带有ID的元素对象。
<body> <div id="time"> 2020-6-25</div> <script> // 1. 文档页面从上面往下加载,要先有便签 所以script写到标签下面 // 2. get 获得 element 元素 by 通过 // 3. 参数 id是大小写敏感的字符串 // 4. 返回的是一个元素对象 var timer = document.getElementById('time') console.log(timer); console.log(typeof timer); // console.dir(timer) 打印我们返回的元素对象 更好的查看里面的属性和方法 console.dir(timer) </script> </body>根据标签名获取
使用getElementsByTagName(‘标签名’);方法 可以返回带有指定标签名的对象集合
使用element.getElementsByTagName(‘标签名’);
可以获取某个元素(父元素)内部所有指定标签名的子元素
注意:父元素必须是单个对象(必须指明是哪一个元素对象)。获取时不包括父元素自己
<body> <div> <ul> <li>一闪一闪亮晶晶1</li> <li>一闪一闪亮晶晶2</li> <li>一闪一闪亮晶晶3</li> <li>一闪一闪亮晶晶4</li> <li>一闪一闪亮晶晶5</li> </ul> <ol id="ol"> <li>漫天都是小星星</li> <li>漫天都是小星星</li> <li>漫天都是小星星</li> <li>漫天都是小星星</li> <li>漫天都是小星星</li> </ol> </div> <script> //1. 返回的是 元素对象的集合 以伪数组的形势存储的 var lis = document.getElementsByTagName('li'); console.log(lis); console.log(lis[0]); // 一次打印里面的元素对象 可以用遍历 for(var i = 0;i < lis.length ;i++){ console.log(lis[i]); } // 3.如果页面中只有一个li 返回的还是伪数组的形式 // 4.如果页面中没有这个元素 返回的是一个空的伪数组 // 5.element.getElementsByTagName('标签名'); console.log('--------------------------------------------'); var ol = document.getElementById('ol') console.log(ol.getElementsByTagName('li')); </script> </body> 通过HTML5新增方法获取 (ie9以上版本支持) 1.document.getElementsByCalssName('类名');//根据类名返回元素对象集合 2.document.querySelector('选择器'); //根据指定选择器返回第一个元素对象 3.document.querySelectorAll('选择器'); //根据指定选择器返回所有元素 //-------------------------------------------------------------------------- <body> <div class="box">盒子1</div> <div class="box">盒子2</div> <div id="nav"> <ul> <li>首页</li> <li>导航</li> </ul> </div> <script> // 1.document.getElementsByCalssName('类名');//根据类名返回元素对象集合 var boxs = document.getElementsByClassName('box'); console.log(boxs); console.log('----------------------------------------------'); // 2.document.querySelector('选择器');//返回指定选择器的第一个元素对象 // 切记 里面的选择器需要加符号 .box #nav var box = document.querySelector('.box'); console.log(box); var nav = document.querySelector('#nav'); console.log(nav); var li = document.querySelector('li'); console.log(li); console.log('--------------------------------------------------'); // 3.document.querySelectorAll('选择器');返回指定选择器所有元素对象 var allBox = document.querySelectorAll('.box') console.log(allBox); var lis = document.querySelectorAll('li') console.log(lis); </script> </body> 特殊元素获取(body,html)获取body元素
<script> var bodyEle = document.body; console.log(bodyEle); console.dir(bodyEle); //返回body元素对象 </script>获取html元素
<script> var htmlEle = document.documentElement; console.log(htmlEle); //返回html元素对象 </script> js使我们有能力创建动态页面,而事件是可以被js侦测到的行为。
简单理解:触发----响应机制。
网页中每一个元素都可以产生某些可以触发js的事件,例如,我们可以在用户点击某个按钮时产生一个事件,然后去执行某些操作。
执行事件的步骤
获取事件源注册事件(绑定事件)添加事件处理程序(采取函数赋值的形式) <div id="div1">123</div> <script> // var div = document.querySelector('div') // div.onclick = function (){ // alert('456') // } // 执行事件步骤 // 点击div 弹出窗口 456 // 1.获取事件源 var div1 = document.getElementById('div1') // 2.绑定事件 // div1.onclick // 3.添加事件处理程序 div1.onclick = function(){ alert('456'); } </script> js的 DOM 操作可以改变页面内容、结构和样式,我们可以利用DOM操作来改变元素里面的内容、属性等。注意以下都是属性
innerText, innerHTML 改变元素内容
src ,href
id ,alt,title
修改元素属性src 其余都是类似的
<body> <button id="ldh">图一</button> <button id="zxy">图二</button> <img src="timg.jpg" > <!-- <img src="timg%20(1).jpg" > --> <script> var ldh = document.getElementById('ldh'); var zxy = document.getElementById('zxy'); var img = document.querySelector('img') zxy.onclick = function(){ img.src = 'timg%20(1).jpg'; } ldh.onclick = function(){ img.src = 'timg.jpg'; } </script> </body>案例 分时问候
视频讲解
利用 DOM可以操作如下表单元素属性
type(类型属性)、value(值属性)、checked(选择)、selected、disabled(表单是否被使用)
<body> <button >按钮</button> <input type="" name="" id="" value="输入内容" /> <script> var button = document.querySelector('button'); var input = document.querySelector('input'); button.onclick = function(){ // input.innerHTML 用来修改div里面的内容 不能用来修改表单 // 表单里面的值通过属性来修改 如文字内容用value修改 input.value = '被点击了'; // 如果想要某个表单被禁用 不能点击用 disabled 下面两个都可以 // button.disabled = true ; // this 指向的是事件函数的调用者 button this.disabled = true ; } </script> </body>视频讲解
可以通过js修改元素的大小、颜色、位置等样式。
element.style 行内样式操作样式比较少 或者功能比较简单的时候使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div{ width: 300px; height: 300px; background-color: chartreuse; } </style> </head> <body> <div></div> <script> var div = document.querySelector('div'); div.onclick = function(){ // div.style里面的属性用驼峰命名法 div.style.backgroundColor = 'pink'; div.style.width = '600px'; } </script> </body> </html> element.className 类名样式操作适合样式较多或者功能复杂的情况
修改后会覆盖(修改)原来的类名
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div{ width: 300px; height: 300px; background-color: chartreuse; } .change{ width: 600px; height: 300px; background-color: coral; margin-top: 50px; font-size: 50px; color: cornsilk; } </style> </head> <body> <div class="first">123</div> <script> var div = document.querySelector('div'); div.onclick = function(){ // 让我们当前元素的类名改为了change // div.className = 'change' // 如果要保留原来的类名 可以这样做 多类名选择器 div.className = 'first change'; } </script> </body> </html>https://www.bilibili.com/video/BV1k4411w7sV?p=20
https://www.bilibili.com/video/BV1k4411w7sV?p=21
https://www.bilibili.com/video/BV1k4411w7sV?p=22
https://www.bilibili.com/video/BV1k4411w7sV?p=24
开关灯
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> body{ background-color: white; } </style> </head> <body> <button id="douse">关灯</button> <button id="openBnt">开灯</button> <script> // 获取事件源 var douse = document.getElementById('douse') var openBnt = document.getElementById('openBnt') var body = document.querySelector('body'); // 注册事件 douse.onclick = function(){ body.style.backgroundColor = 'black'; } openBnt.onclick = function (){ body.style.backgroundColor = 'white'; } </script> </body> </html>1.给所有元素清除样式
2.给当前元素设置样式
顺序不能颠倒
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <button>按钮</button> <button>按钮</button> <button>按钮</button> <button>按钮</button> <button>按钮</button> <button>按钮</button> <script> var btn = document.getElementsByTagName('button'); // bnt得到的是伪数组 里面的每个元素是btn[i] // 遍历数组把所有的btn绑定函数 循环注册事件 for (var i = 0; i < btn.length; i++) { // 记录索引号 this.btn[i].index = i; btn[i].onclick = function () { console.log(this.index); console.log(this); console.log(btn); // 把所有的按钮先清空样式 for (var i = 0; i < btn.length; i++) { btn[i].style.backgroundColor = ''; } // 为当前元素修改样式 this.style.backgroundColor = 'pink'; } } </script> </body> </html>https://www.bilibili.com/video/BV1k4411w7sV?p=27
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> body{ background-color: pink; } div { border: slateblue 1px solid; margin: 5px; float: left; } div:first-child{ width: 100px; height: 100px; background-color: pink; } div:nth-child(2){ width: 100px; height: 100px; background-color: plum; } div:nth-child(3){ width: 100px; height: 100px; background-color:palegreen; } div:nth-child(4){ width: 100px; height: 100px; background-color: salmon; } </style> </head> <body> <div id="pink"></div> <div id="plum"></div> <div id="palegreen"></div> <div id="salmon"></div> <script> // 获取事件源 var body = document.querySelector('body'); var pink = document.getElementById('pink'); var plum = document.getElementById('plum'); var palegreen = document.getElementById('palegreen'); var salmon = document.getElementById('salmon'); pink.onclick = function(){ body.style.backgroundColor = 'pink'; } plum.onclick = function(){ body.style.backgroundColor = 'plum'; } palegreen.onclick = function (){ body.style.backgroundColor = 'palegreen'; } salmon.onclick = function(){ body.style.backgroundColor = 'salmon'; } </script> </body> </html>https://www.bilibili.com/video/BV1k4411w7sV?p=28
https://www.bilibili.com/video/BV1k4411w7sV?t=4&p=29
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> table{ margin: 100px auto; width: 40vh; height: 30vh; /* border: chartreuse 1px solid; */ } thead>tr>th{ width: 100vh; height: 40px; background-color:#008CD0; } tbody{ background-color: RGB(244,240,245); text-align: center; } </style> </head> <body> <div class="warp"> <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>手机1</td> <td>500</td> </tr> <tr> <td><input type="checkbox"></td> <td>手机1</td> <td>500</td> </tr> <tr> <td><input type="checkbox"></td> <td>手机1</td> <td>500</td> </tr> </tbody> </table> </div> <div></div> <script> // 1.全选和取消全选的做法:让下面所有复选框的checked属性(选中状态)跟随 全选按钮即可 // 获取元素 var j_cbAll = document.getElementById('j_cbAll'); //全选按钮 var j_tbs = document.getElementById('j_tb').getElementsByTagName('input')//下面所有的复选框 // 注册事件 j_cbAll.onclick = function(){ console.log(j_cbAll.checked); for(var i = 0 ; i < j_tbs.length ;i++){ j_tbs[i].checked = j_cbAll.checked; } } // 2.下面复选框需要全部选中,上面复选框才能选中做法:给下面所有复选框绑定事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的,上面全选就不选中 // 可以设置一个变量,来控制是否全部选中。 for(var i = 1 ; i < j_tbs.length ; i++){ j_tbs[i].onclick = function (){ // flag 控制 全选按钮是否被选中 var flag = true; // 每次点击下面的复选框都要循环4个小按钮是否全部被选中 for(var i = 1 ; i < j_tbs.length ; i++){ if(!j_tbs[i].checked){ flag = false; break;//只要有一个没有选中 就直接退出for循环,这样可以提高效率 } } j_cbAll.checked = flag; } } </script> </body> </html>获取属性值
element.属性element.getAttribute(‘属性’)区别:
element.属性 获取内置属性值element.getAttribute(‘属性’); 主要获得自定义属性(标准)修改属性
(1) element.属性 = ‘值’
(2) element.setAttribute(‘属性’,‘值’) ; 主要针对自定义属性
移除属性
(1)element.removAttribute(属性)
代码总结
<body> <div id="deom" index='1' class="n"></div> <script> var div = document.querySelector('div'); // 1.获取元素的属性 // (1) element.属性 console.log(div.id); // (2) element.getAttribute('属性') get 得到 attribute 属性的意思 // 我们程序员自己添加的属性称为自定义属性 // 上面div里面的 index='1' index就是自定义属性 console.log(div.getAttribute('id')); console.log(div.getAttribute('index')); // ------------------------------------------------------ // 2.设置属性值 // (1) element.属性 = '值' div.id = 'test' console.log(div.id); div.className = '123' // (2) element.setAttribute('属性','值') ; 主要针对自定义属性 div.setAttribute('index',3); div.setAttribute('calss','foot')//class比较特殊 这里写的是class不是calssName // ------------------------------------------------------ // 3.移除属性 removAttribute(属性) div.removeAttribute('index'); </script> </body>自定义属性的目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
1.设置H5自定义属性
H5规定自定义属性data-开头作为属性名并且赋值。
比如
<div data-index = '1' > </div> //或者使用js设置 element.setAtteribute('data-index',3)2.获得H5自定义属性
//1.兼容性获取 element.getAtteribute('data-index'); //2. H5新增的获取自定义属性 elemen.dataset.index 或者 element.dataset['index'] 只能获取data- 开头的 ie11才兼容 //dataset 是一个集合里面存放了所有以data开头的自定义属性 console.log(div.dataset); console.log(div.dataset.index); //如果自定义属性里面有多个-连接的单词 ,我们获取的时候采取驼峰命名法。 <div data-last-name = 'andy'> </div> console.log(div.dataset.lastName); console.log(dav.sataset['lastName']);利用节点层级关系获取元素
利用父子兄弟节点关系获取元素
逻辑性枪法,但兼容性差
节点概述
一般节点至少拥有 nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)
三个基本属性
nodeType(节点类型)
元素节点的nodeType 为 1
属性节点 为 2
文本节点 为 3 (文本节点包括文字、空格、换行等)
实际开发,节点操作主要操作元素节点
https://www.bilibili.com/video/BV1k4411w7sV?p=41
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> body, li, a { margin: 0; padding: 0; list-style: none; text-decoration: none } .nav { width: 500px; height: 280px; margin: 100px auto; /* border: olivedrab 1px solid; */ display: flex; } .nav>li { position: relative; /* display: flex; */ } .nav>li>a { display: block; height: 40px; width: 72px; background-color: rgba(255, 255, 255, 0.904); margin-bottom: 1px; text-align: center; line-height: 40px; color: rgb(66, 66, 66); border-bottom: tomato 1px solid; } .nav>li>a:hover { color: white; background-color: tomato; } .nav>li>ul { position: absolute; top: 42px; left: -40px; width: 60px; height: 180px; cursor: pointer; /* border: steelblue 1px solid; */ display: none; } .nav>li>ul>li { /* position: absolute; */ border-left: rgb(247, 165, 150) 1px solid; border-right: rgb(247, 165, 150) 1px solid; border-bottom: rgb(247, 165, 150) 1px solid; /* display: none; */ width: 100%; height: 30px; text-align: center; padding: 5px; margin-bottom: 1px; } .nav>li>ul>li:hover { background-color: rgb(247, 165, 150); color: rgb(253, 253, 212); } </style> </head> <body> <ul class="nav"> <li> <a href="#">微博</a> <ul> <li>私信</li> <li>读评论</li> <li>@我</li> </ul> </li> <li> <a href="#">微博</a> <ul> <li>私信</li> <li>读评论</li> <li>@我</li> </ul> </li> <li> <a href="#">微博</a> <ul> <li>私信</li> <li>读评论</li> <li>@我</li> </ul> </li> <li> <a href="#">微博</a> <ul> <li>私信</li> <li>读评论</li> <li>@我</li> </ul> </li> </ul> <script> // 获取元素 var nav = document.querySelector('.nav') var lis = nav.children;//得到四个li console.log(nav); console.log(nav.children); console.log(lis); // 循环 所有li 注册事件 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> </html>document.write()方法 了解就好
document.write()直接将内容写入页面的内容流中,但是文档流执行完毕,则它会导致页面全部重绘。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <!-- 创建节点 document.createElement('tagName') document.createElement() 方法创建由 tagName 指定的HTML元素。 因为这些元素原先不存在是根据我们的需求动态生成的,所以我们也称为 动态创建节点 --> <!-- 添加节点 1. node.appendChlid(chlid) node.appendChlid(chlid) 方法将一个节点添加到指定父元素的子节点列表末尾 类似添加数组元素的push。 例如 css 里面的after 伪元素 2. ul.appendChild(child,指定元素); --> <ul> <li>123</li> </ul> <script> //获取元素 var ul = document.querySelector('ul'); // 1. 创建元素节点 var li = document.createElement('li'); // 2.添加节点 node.appendChlid(chlid) node 父级 child 子级 类似添加数组元素的push。 ul.appendChild(li); // 3. 添加节点 ul.appendChild(child,指定元素); var lili = document.createElement('li'); ul.insertBefore(lili, ul.children[0]); // 4. 我们想要页面 添加新的元素 先创建元素 再添加元素 //---------------------高级做法 ---------------------------------------------------------------- insertAdjacentHTML可以直接插入html节点 // 创建li和section var li = ' <li class=""><span>新选项卡</span><i class="">x</i></li>' // 把创建好的元素追加到对应父元素里面 // 原來做法:动态创建元素 但是元素里面的内容比较多,需要innerHTML赋值,再appendChild追加到父元素里面 // 高级做法:利用insertAdjacentHTML()可以直接把字符串格式元素添加到父元素中 //appendChild不支持追截字符串的子元素,insertAdjacentHTML支持追加字符串的子元素 that.ul.insertAdjacentHTML('beforeEnd', li) </script> </body> </html>https://developer.mozilla.org/zh-CN/docs/Web/API/Element/insertAdjacentHTML
textarea 没有value值 暂时实现不了 (x)
textarea 改成input 完成了(√)
https://www.bilibili.com/video/BV1k4411w7sV?t=94&p=44
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { width: 600px; height: 400px; /* border: 1px red solid; */ margin: 300px auto; position: relative; } li { background-color: sandybrown; margin-bottom: 10px; margin-left: -40px; /* list-style-type: none; */ font-size: 30px; color: white; } input { position: absolute; top: -217px; left: 0px; /* border-radius: 20px; */ display: block; margin: 0px auto; width: 300px; height: 200px; font-size: 20px; } button { position: absolute; top: -34px; left: 312px; /* border-radius: 20px; */ } </style> </head> <body> <!-- 核心思路:点击按钮之后就创建一个li,添加到ul里面。 在创建li的同事,把文本域里面的值通过li.innerHTML赋值给li 如果想要新的留言后面显示就用appendChild 想要前面显示就用inserBefor --> <div> <input id="text" type="text " value=""> <button>发布评论</button> <ul> <li>我是神评论</li> </ul> </div> <script> // 获取元素 var btn = document.querySelector('button'); var input = document.getElementById('text'); var ul = document.querySelector('ul'); console.log(input); // console.log(input.value); // 注册事件 btn.onclick = function () { // 创建元素 var li = document.createElement('li'); if (input.value == 0) { alert('请输入评论'); } else { // 先有li 才能赋值 li.innerHTML = input.value; // 添加元素 ul.appendChild(li); } } </script> </body> </html>https://www.bilibili.com/video/BV1k4411w7sV?t=92&p=46
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { width: 600px; height: 400px; /* border: 1px red solid; */ margin: 300px auto; position: relative; } li { background-color: sandybrown; margin-bottom: 10px; margin-left: -40px; /* list-style-type: none; */ font-size: 30px; color: white; } li a { /* display: inline-block; */ border-radius: 10px; float: right; line-height: 40px; text-decoration: none; color: rgb(0, 136, 136); font-size: 16px; margin-left: 350px; /* background-color: khaki; */ } input { position: absolute; top: -217px; left: 0px; /* border-radius: 20px; */ display: block; margin: 0px auto; width: 300px; height: 200px; font-size: 20px; } button { position: absolute; top: -34px; left: 312px; /* border-radius: 20px; */ } </style> </head> <body> <!-- 核心思路:点击按钮之后就创建一个li,添加到ul里面。 在创建li的同事,把文本域里面的值通过li.innerHTML赋值给li 如果想要新的留言后面显示就用appendChild 想要前面显示就用inserBefor --> <div> <input id="text" type="text " value=""> <button>发布评论</button> <ul> <!-- <li>我是神评论<a href='#'>删除</a></li> --> </ul> </div> <script> // 获取元素 var btn = document.querySelector('button'); var input = document.getElementById('text'); var ul = document.querySelector('ul'); console.log(input); // console.log(input.value); // 注册事件 btn.onclick = function () { // 创建元素 var li = document.createElement('li'); if (input.value == '') { alert('请输入评论'); } else { // 先有li 才能赋值 li.innerHTML = input.value + " <a href=''>删除</a>"; // 添加元素 ul.insertBefore(li, ul.children[0]); // 删除元素 删除的是当前链接的li a的父级 var as = document.querySelector('a'); for (var i = 0; i < as.length; i++) { as[i].onclick = function () { // node.removeChild(chile); 删除的是li 是当前a链接所在的li this.parentNode; ul.removeChild(this.parentNode); console.log(a[i]); } } } } </script> </body> </html>创建学生信息
https://www.bilibili.com/video/BV1k4411w7sV?p=48
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> table{ width: 500px; /* height: 200px; */ /* background-color: darkgray; */ margin: 100px auto; } thead{ /* display: inline-block; */ /* padding: 20px; */ text-align: center; padding: 10px; background-color: darksalmon; color: ghostwhite; } td{ border: lightcoral 1px solid; text-align: center; font-size: 14px; } </style> </head> <body> <table> <thead> <tr> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> </body> <script> // 先去准备好学生数据 模拟数据库 var datas = [ { name : '阿呆', age : 20, sex : 'boy' }, { name : '小红', age : 21, sex : 'girl' }, { name : '小黑', age : 22, sex : 'boy' }, { name : '张三', age : 35, sex : 'boy' }, ]; // 往tbody 里面创建行 , 有几个人我们就创建几行 var tboty = document.querySelector('tbody'); for(var i = 0; i < datas.length;i++){ // 创建tr行 var tr = document.createElement('tr'); tboty.appendChild(tr); // 行里面创建单元格td(和数据有关) 单元格的数量取决于每个对象里面的属性个数 用for循环遍历对象 for(var k in datas[i]){ // 创建单元格td var td = document.createElement('td'); // 把对象的属性值 datas[i][k] 给td td.innerHTML = datas[i][k]; tr.appendChild(td) } // 创建 删除 单元格 var td = document.createElement('td'); td.innerHTML = '<a href="javascript:;">删除</a>'; tr.appendChild(td); } // 删除操作 开始 var as = document.querySelectorAll('a') for(var i = 0 ; i < as.length ; i++){ as[i].onclick = function (){ // 点击a 删除 当前a所在的行(a父级的父级) tboty.removeChild( this.parentNode.parentNode) } } </script> </html>注册事件有两种方式:传统方式(前面学习的就是传统方式)和方法监听注册方式
传统方式:
on开头的事件 例如:onclick特点: 注册事件的唯一性同一个事件只能设置一个梳理数据,最后注册的处理函数将会覆盖注册的处理函数方法监听注册方式:addEventListener()
w3c标准 推荐方式
addEventListener() 它是一个方法
特点:同一个元素同一个事件可以注册多个监听器
按照注册顺序依次执行
ie9之前的版本支持attachEvent() (了解) 一般用不到
语法
eventTarget.addEventListener(type,listener[,useCapture])
eventTarget.addEventListener()方法将指定的监听器注册到eventTarget(目标对象)上,当改对象触发指定的事件时。就会执行事件处理函数。
三个参数
type:事件类型字符串,比如click mouseover,注意这里不要带on
listener:事件处理函数,事件发生时会调用改监听函数
useCapture:可选参数,是一个布尔值,默认false。之后学
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <button>方法监听注册事件</button> <button id="attachEvent">attachEvent</button> <script> var btn = document.querySelector('button'); // addEventListener里面的事件类型是字符串 必定加引号而且不带on // 同一个元素同一个事件可以注册多个监听器(事件处理程序) btn.addEventListener('click', function () { alert('123'); }) btn.addEventListener('click', function () { alert('456'); }) // ----------------------------------------------- // attachEvent() // ie9之前的版本支持attachEvent() (了解)方法 // 谷歌浏览器不支持了会报错 // 封装函数解决报错 btn2 = document.querySelector('#attachEvent') // console.log(btn2); btn2.attachEvent('onclick', function () { // alert('attachEvent') }) </script> </body> </html>https://www.bilibili.com/video/BV1k4411w7sV?t=31&p=60
删除事件兼容性解决方案七分半
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { width: 100px; height: 100px; background-color: cornflowerblue; } </style> </head> <body> <div>1</div> <div>2</div> <div>3</div> <script> var div = document.querySelectorAll('div'); div[0].onclick = function () { alert('1') // 传统方式删除事件 div[0].onclick = null; } div[1].addEventListener('click', fn)//这个fn调用不用加小括号 //方法监听注册方式删除事件 function fn() { alert(2); // 放在里面可以点一次2 div[1].removeEventListener('click', fn) } </script> </body> </html>事件流描述的是页面中就收事件的顺序。
事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流。
代码验证
https://www.bilibili.com/video/BV1k4411w7sV?p=62
this 和 e.target 的区别
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> div { width: 100px; height: 100px; background-color: chocolate; } </style> </head> <body> <!-- this 和 target 的区别 --> <div>123</div> <ul> <li>abc</li> <li>abc</li> <li>abc</li> </ul> <script> // 常见事件对象的属性和方法 // 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 (eve) { // 我们给 ul 绑定了事件 那么this指向的就是ul console.log(this); // eve.target 指向了我们点击的那个对象 谁触发了事件我们就指向谁 我们点击的是li那么eve.target指向的就是li console.log(eve.target); }) </script> </body> </html>事件委托原理:
不要个每一个子节点单独设置事件监听器,而是事件监听器设置在其父节点上,然后利用
冒泡原理影响设置每一个子节点。
作用:
只操作了一次DOM,提高程序性能。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <ul> <li>点击弹框</li> <li>点击弹框</li> <li>点击弹框</li> <li>点击弹框</li> <li>点击弹框</li> </ul> <script> // 事件委托原理:给父节点添加监听器,利用事件冒泡影响每一个子节点 var ul = document.querySelector('ul'); ul.addEventListener('click',function(event){ alert('弹框来了'); // event.target 可以获得点击的对象 点击的是li 所以可以操作li event.target.style.backgroundColor = 'pink'; }) </script> </body> </html>keyCode返回按键ASCII码值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <script> // 键盘事件对象中的keyCode属性可以得到响应你就按的ASCII码值 document.addEventListener('keyup',function(event){ console.log(event.keyCode) // keyup 和 keydown 事件不区分大小写 ASCII码值一样 // keypress 不识别功能键但是区分大小写 }) </script> </body> </html>up’,function(event){ // console.log(event.keyCode) if(event.keyCode === 83){ search.focus(); }
}) </script> ```