2021-12-06
一、事件绑定
<body> <button id="btn1" onclick="onBtn()">按钮1</button> <button id="btn2">按钮2</button> <script> function onBtn(){ alert('事件属性触发') } // 获取按钮元素 var btn2Ele = document.querySelector('#btn2') //绑定事件 btn2Ele.onclick = function(){ alert('事件绑定触发') } </script> </body>二、DOM操作css样式
三、操作元素属性1.style操作样式 <script> //行内样式 style var divEle = document.querySelector('div') divEle.style.width = '200px' // 设置元素width样式值为200px divEle.style.height = '200px' divEle.style.backgroundColor = 'red' //操作内部样式 className var h2Ele = document.querySelector('h2') // h2Ele.className = 'c1' // h2Ele.className = 'c2' //操作多个内部样式 classList h2Ele.classList.add('c1') h2Ele.classList.add('c2') h2Ele.classList.add('c3') h2Ele.classList.remove('c2') </script> 2.className操作内部样式 <script> var h2Ele=document.querySlector('h2) h2Ele.className='类名' </script> 3.添加多个样式:classList 里例如: h2Ele.class.add('c1') h2Ele.class.add('c2')操作样式=> 获取操作的元素=> style行内样式语法:标签元素.style.样式名 = 样式值
<body> <div id="d1" a='100' class="c1"></div> <script> var divEle = document.querySelector('#d1') //获取id名为#d1元素 var value1 = divEle.getAttribute('class') // 操作class属性 var value2 = divEle.getAttribute('a') console.log(value1, ' ', value2) divEle.setAttribute('data-index',1001) //新增属性 divEle.removeAttribute('a') // 移除属性 </script> </body>四、DOM 节点
html标签元素 <div id="d1">元素一</div> document文档对象模型 html文档中的所有元素都可以看作是dom节点对象 整个文档 document对象 html标签 根对象 每个html标签元素 元素节点对象 内容 文本节点对象 属性 属性节点对象<!--children=> 所有子元素节点childNodes=> 所有节点包含文本节点--><body><div id="d1"><p>元素一</p><span>元素二</span><h2>标题</h2></div><script>var divRootEle = document.querySelector('#d1')var childNodeArray = divRootEle.childNodes //返回当前节点的所有子节点console.log('childNodeArray.length :',childNodeArray.length);console.log('divRootEle.firstElementChild: ',divRootEle.firstElementChild);console.log('divRootEle.firstChild: ',divRootEle.firstChild);console.log('divRootEle.lastElementChild: ',divRootEle.lastElementChild);console.log('divRootEle.lastChild: ',divRootEle.lastChild);//var spanEle = document.querySelector('span')console.log('spanEle.nextElementSibling: ',spanEle.nextElementSibling);console.log('spanEle.nextSibling: ',spanEle.nextSibling);console.log('spanEle.previousElementSibling: ',spanEle.previousElementSibling);console.log('spanEle.parentElement: ',spanEle.parentElement);</script></body>
五、DOM小结
dom节点知识点小结 1. dom节点 - 每个html标签、标签属性、内容、注释...都被看成dom节点 2. 节点分类 元素节点 属性节点 文本节点 注释节点 document文档节点 3. 节点树形结构 document html head body 4. 获取dom节点 - getElement系列 - queryselector系列 - 层次结构 parentElement 父节点 children 子元素节点 firstElementChild lastElementChild nextElementSibling previousElementSibling - 非常规节点获取 document.body 获取body/head document.body/head
2021-12-07
一、动态操作节点- 使用js代码创建删除节点 - 创建节点: createElement createTextNode createAttribute - 添加节点 父节点.appendChild(子节点) 父节点.insertBefore(新子节点,原来的子节点) - 移除节点 父节点.removeChild(子节点) 节点.remove() - 替换节点 replaceChild - 复制节点 cloneNode <body> <div> <p>原来的节点</p> </div> <script> //插入节点 function testInsertNode() { var divEle = document.querySelector('div') var pEle = document.querySelector('p') //创建一个新的span节点 var spanEle = document.createElement('span') //<span></span> var textNode = document.createTextNode('我是新元素span') //我是新元素span spanEle.appendChild(textNode) //<span>我是新元素span</span> divEle.insertBefore(spanEle, pEle) } //创建节点 function testCreateNode() { //元素节点 var divEle = document.createElement('div') console.log(divEle); //<div></div> //文本节点 var textNode = document.createTextNode('js动态操作节点') console.log(textNode); //属性节点 var attrNode = document.createAttribute('id') attrNode.value = 'd1' //id="d1" divEle.appendChild(textNode) // <div>js动态操作节点</div> console.log(divEle); divEle.setAttributeNode(attrNode) //获取body节点 document.body.appendChild(divEle) } //删除节点 function testRemoveNode() { var divEle = document.querySelector('div') var pEle = document.querySelector('p') // divEle.removeChild(pEle) pEle.remove() } //替换节点 function testReplaceNode() { var divEle = document.querySelector('div') var pEle = document.querySelector('p') var h2Ele = document.createElement('h2') var h2TextNode = document.createTextNode('标题') h2Ele.appendChild(h2TextNode) // <h2>标题</h2> //替换 divEle.replaceChild(h2Ele, pEle) } //复制节点 function testClone() { var divEle = document.querySelector('div') var newDivEle = divEle.cloneNode(true) // <div> // <p>原来的节点</p> // </div > document.body.appendChild(newDivEle) } // testInsertNode() // testRemoveNode() // testReplaceNode() testClone() </script> </body>
二、节点属性
<body> <div>元素一</div> <ul> 1 <li>元素一</li> 2 <li>元素二</li> 3 <li>元素三</li> 4 </ul> <script> function testNodeAttribute() { var divEle = document.querySelector('div') console.log(divEle.nodeType, ' ', divEle.nodeValue, ' ', divEle.nodeName); } function testUlNode() { var ulEle = document.querySelector('ul') var nodeArr = ulEle.childNodes console.log('nodeType' + ' ' + 'nodeValue' + ' ' + 'nodeName'); for (var i = 0; i < nodeArr.length; i++) { var nodeItem = nodeArr[i] console.log(nodeItem.nodeType + ' ' + nodeItem.nodeValue + ' ' + nodeItem.nodeName); } } testUlNode() // testNodeAttribute() </script> </body>
三、获取样式值
操作节点样式 dom.style.样式名 = 样式值 获取行间样式 dom.style.样式名 获取非行间样式值 var 样式值 = window.getComputedStyle(节点).样式名 => 非IE浏览器 var 样式值 = dom.currentStyle.样式名 => IE浏览器 <style> .c1{ height: 300px; width: 400px; } </style> <body> <!-- <div style="width:200px;">元素一</div> --> <div class="c1"></div> <script> function testClassStyle(){ var divEle = document.querySelector('div') // console.log('divEle.style.width :', divEle.style.height); console.log( window.getComputedStyle(divEle).height ); console.log( window.getComputedStyle(divEle).width ); } testClassStyle() function testSetStyle() { var divEle = document.querySelector('div') divEle.style.height = '100px' } //获取行间样式 function testGetStyle() { var divEle = document.querySelector('div') console.log('divEle.style.width :', divEle.style.width); } // testGetStyle() </script> </body>四、获取偏移量
<style> *{padding: 0; margin: 0;} div{ width: 100px; height: 100px; background-color: cadetblue; margin: 100px; padding: 10px; position: relative; } p{ position: absolute; width: 20px; height: 20px; background-color: rgb(237, 100, 225); } <body> <div> <p></p> </div> <script> function testOffset(){ var divEle = document.querySelector('div') var pEle = document.querySelector('p') console.log( 'divEle.offsetTop :',divEle.offsetTop, ' divEleoffsetLeft', divEle.offsetLeft ); console.log( 'pEle.offsetTop :',pEle.offsetTop, 'pEle.setEleoffsetLeft', pEle.offsetLeft ); } testOffset() </script> </body>
五、获取元素尺寸
<style> div{ width: 100px; height: 100px; padding: 20px; border: 5px solid blue; } </style> <body> <div></div> <script> function testSize(){ //获取内容宽高 var divEle = document.querySelector('div') console.log('内容宽 :', window.getComputedStyle(divEle).width ); console.log('内容宽 + padding :', divEle.clientWidth); console.log('内容宽 + padding + border', divEle.offsetWidth); } testSize() </script> </body>
2021-12-08
一、事件对象
1.事件对象:每触发一个事件都会生成事件对象,事件对象包含对事件的描述信息,例如坐标位置等
2.获取事件对象
事件处理函数中定义一个形式e获取,
要兼容ie浏览器 window.event获取
兼容写法
e = e || window.event <body>
<button>按钮</button>
<script>
var btnEle = document.querySelector('button')
btnEle.onclick = function(e){
e = e || window.event //兼容写法
console.log(e);
}
</script>
</body>
二、获取光标位置
事件对象中获取光标位置 offsetX offsetY 相对自身事件源 clientX clientY 相对浏览器窗口 pageX pageY 相对页面 <body> <div></div> <script> var divEle = document.querySelector('div') //divEle:事件源 //onclick:事件类型 // function: 事件处理函数 divEle.onclick = function(e){ e = e || window.event //获取事件对象 // var x = e.offsetX //X轴 // var y = e.offsetY //Y轴 var x = e.clientX var y = e.clientY console.log('x :',x, 'y :',y); console.log('pageX :',e.pageX, 'pageY :',e.pageY); } </script> </body>三、鼠标事件
常见鼠标事件 click:鼠标点击事件 dbclick:鼠标双击事件 contextmenu:鼠标右键单击事件 mousedown:鼠标右键按下 mouseup:鼠标左键抬起 mousemove:鼠标移动 mouseover:鼠标移入 mouseout:鼠标移出 mouseenter:鼠标移入 mouseleavr:鼠标移出四、表单事件
1.表单事件:表单提交时。默认执行表单提交事件,在跳转到action动作指定的URL页面 2.表单提交事件:submit,事件源是form表单 3.表单提交的作用: 表单验证:非空验证、密码强度验证等 4.阻止默认表单action动作:e.preventDefault() //给表单form绑定表单提交事件 formEle.onsubmit = function (e) { e = e || window.event //事件对象 e.preventDefault() //阻止表单默认action动作 var username = userNameInput.value var password = passwordInput.value if (username == '' || password == '') { alert('用户名或密码不能为空') }else{ //跳转提交页面 location.href = `https://www.baidu.com/?username=${username}&password=${password}` } }五、焦点事件
失去焦点:onblur 获取焦点:onfocus六、键盘事件
<body> <div> <h2>登录界面</h2> <button class="login-btn">登录</button> </div> <script> document.onkeyup = function(e){ e = e || window.event //事件对象 var keyCode = e.keyCode || e.which //兼容firfox2.0 // ctrl + enter 13 if(e.ctrlKey && keyCode == 13){ location.href = './main.html' } } </script> </body>
2021-12-09
一、绑定事件的方式
1.属性时间绑定
<button onclick="onClick()">点击</button> function onClick(){ alert('点击') }2.绑定事件
<button></button> var btn=document.querySelector('button') btn.onclick=(function(){ alert('点击') }) 事件绑定优缺点 优点:符合“行为、样式、结构”相分离,便于操作当事对象,方便读取事件对象 缺点:只能给一个元素注册一个事件,绑定一个事件,如果绑定两个,后一个会覆盖前一个 例:3.事件监听<div>按钮</div>var divEle = document.querySelector('div')divEle.onclick = function(){console.log('这是第一个事件绑定操作');}divEle.onclick = function(){console.log('这是第二个事件绑定操作');}
1.事件监听三要素:事件源、事件类型、处理函数 2.语法: 事件源.addEventListener(事件类型,function(){ //处理函数 }) 例: <button></button> var btn=document.querySelector('button') btn.addEventListener('click',function(){ //处理函数 }) 3.事件监听兼容性写法: addEventListener:非IE7,8使用 attachEvent:IE7,8使用 4.事件监听优点:事件监听给同一个元素绑定两个事件,后一个不会覆盖前一个,会按顺序输出 注:事件绑定需加on,监听事件不需要加on三、事件传播
1.事件传播的行为
事件冒泡:由内向外
事件捕获:有外向内
2.事件目标对象:target
兼容IE的写法:var target=e.target || e.srcElement
3.事件传播事件监听写法:事件源.addEvenListener(事件类型,function(){函数体},捕获true|冒泡false),addElevenListener的第三个参数,决定了是捕获还是冒泡
4.事件传播注意点:
只会传播同类事件
只会从点击元素开始按照html的结构逐层向上元素的事件会被触发
内部元素不管有没有该事件,只要上层元素有该事件,那么上层元素的事件就会被触发
5.
四、事件对象和事件目标对象的区别
事件对象:事件触发时自动创建,可以在事件处理函数中定义一个形参e来接收
事件目标对象:事件对象的一个属性target获取,表示当前点击的事件源
五、事件委托
1.事件委托:元素自身处理的事件,委托给他的父级元素处理
2.优点:
1.减少事件绑定的数量
2.对后来动态添加的元素依然有效
3.解决动态添加的元素节点无法绑定的事件问题
4.减少事件的冗余绑定,节约了事件资源
阻止默认行为:例如 form、a标签 e.preventDefault() //非IE使用 e.returnvalue=false //IE使用
六、自执行函数
1.语法
(function(){ //函数体 arguments:在函数内部自带的变量,表示所有实参的集合,是伪数组 })()
七、this关键字
1.this关键字:表示当前对象,根据当前使用场景决定
1.在事件处理函数里:this指向事件源 2.普通函数里:this指向window对象 3.定时器里:this指向window对象 4.自执行函数里:this指向window对象 5.简单对象:this指向调用方法的引用变量的对象2.强行改变this指向
1.call:附加在函数调用后面使用,可以忽略函数本身的this指向 语法:函数名.call(要改变的this指向,要给函数传递的参数) 例:fn.call(obj,10,20,30) 2.apply 语法:函数名.apply(this指向新对象,[参数1,参数2]) 3.bind:h和前面两个不一样,就是不会立即执行函数,而是返回一个已改变了this指向的函数,返回this指向的新函数 语法:var newFn=函数名.bind(this新指向) newFn(参数1,参数2)
2021-12-10
一、JavaScript新增特性1.const let 声明函数:不能重复声明同一变量,没有变量提升(预解析),必须先声明在使用,声明变量会被代码块限制作用范围,用{}括起来就是一个代码块
2.const:只能赋值一次,称为长常量
二、箭头函数
1.箭头函数:简化声明函数写法,赋值式函数定义
2.语法:(可写形参)=>{函数体执行代码}
注:箭头函数只能简写函数表达式,不能简写声明函数
3.特殊写法:
1.函数体执行代码只有一行时,大括号可以不写
2.函数体只有一行代码并且有返回值时,大括号和return可不写
3.形参只有一个时,括号可以不写
4.this关键字:箭头函数中this指向应用上下文
5.函数默认值
<script> const fn = (a = 10)=>{ // a = a || 10 console.log(a); } // fn(10) fn()6.解构赋值:快速获取
<script> const obj = { name:'jack', age:20 } // let name = obj.name // let age = obj.age let {name,age} = obj console.log('name ',name, ' age ',age);
7.解构数组
const arr = ['jack','rose','tom'] let [a,b,c] = arr console.log('a :',a , ' b :',b , ' c ',c);
8.展开运算符
<script> const arr = [1,2,3,4] // console.log(...arr); const arr1 = [5,6] // [1,2,3,4,5,6] const arr2 = [...arr,...arr1] console.log(arr2); const obj = { name:'jack', age:20 } const obj1 = { ...obj, gender:'男' } console.log(obj1); </script>