常用的语义化标签:
视频播放:
背景:Chrome浏览器中发起资源请求的有6个线程;但是只有1个线程负责渲染页面——称为UI主线程——浏览器中所有的代码只能由一个线程来执行。问题:若浏览器加载了一个很耗时的JS文件(可能影响DOM树结构),浏览器必须等待该文件执行完成才会继续执行后续的代码(HTML/CSS/JS等)——如果一个JS文件要执行10s(可能有很深的循环/递归等科学计算/解密),会发生什么?——执行耗时JS任务过程中,会暂停页面中一切内容的渲染以及事件的处理。解决方案:H5新特性——WebWorkerWorker的本质:就是一个执行指定任务的独立线程;且该线程可以与UI主线程进行消息数据传递。使用方法:HTML文件中:varw=newWorker('js/x.js')w.postMessage('发送给Worker线程的消息');w.onmessage=function(e){e.data;//来自Worker线程的消息}JS文件中:onmessage=function(e){vardata=e.data;//接收UI线程的消息//执行耗时任务....postMessage(result);//给UI线程发送消息}注意:Worker任务不允许直接操作DOM树,也不允许使用任何的BOM对象!需要的数据只能由UI主线程来传递,处理的结果也必须交由UI线程来显示。
方法1:F12F1设置禁用JS
方法2:F12元素事件帧监听删除复制事件
方法3:找到HTML中存放内容的段落,找到父级,添加一个id或者class,然后在控制台打印console.log(document.getElementById('自建ID').innerText)
优先级:!important>行内样式>内链样式>外部引入(!important可直接添加在css样式中)后代选择器>子类选择器;为同种选择器时,哪个的描述多哪个优先级高。id相当于身份证号;class相当于小名。
.main{height:calc(100%-121px);}注意减号两边需要有空格!!!
break语句“跳出”循环。直接跳出不再执行后边的循环continue语句“跳过”循环中的一个迭代。后边的循环继续执行
方法对数组的每个元素执行一次给定的函数。
只传入一个函数作为参数
letarr=['a','b','c','d']arr.forEach(myfun);functionmyfun(item,index){console.log(item,index)}//'a'0//'b'1//'c'2//'d'3
varobj={name:'lishuo',age:22}console.log(Object.entries(obj))//['name','lishuo']//['age',22]//返回为数组varobj={name:'lishuo',age:22}for(const[key,value]ofObject.entries(obj)){console.log(`${key}:${value}`);}//name:lishuo//age:22//返回为字符串
varconstantize=(obj)=>{Object.freeze(obj);//冻结对象Object.keys(obj).forEach((key,i)=>{//冻结对象内的属性if(typeofobj[key]==='object'){constantize(obj[key]);}});};
在开发过程中,部分代码会被重复使用,函数可把代码封装起来重复使用函数语法:function函数名(形参){代码段}调用:函数名(实参)如果实参个数多于形参,形参将按照顺序依次接收实参,剩余的值不被接收如果实参个数少于形参,形参将按照顺序依次接收实参,多于的形参接收不到实参,默认值为undefined//函数中的return语句的两个作用:1.函数中通过return关键字指定返回值2.结束当前函数,不在继续向下执行代码//注意:return后的语句不再执行3.如果没有指定返回值,则函数默认返回值为undefinedarguments对象//函数中的arguments对象:(它的行为就像数组)当不确定有多少个参数传递的时候,可以用arguments来获取,在js中,arguments实际上它是当前函数的一个内置对象,所有的函数都有一个内置的arguments对象,arguments对象中储存了传递的所有实参//(当实参是否大于形参,实参都会储存在arguments中)//arguments对象特点:1.arguments的展示形式是一个伪数组,具有数组的特点,但是不可以使用数组的方法,因此可以进行遍历2.伪数组的特点(数组的特点)具有length属性按照索引方式存储数据不具有数组的push,pop等方法
计时器为window对象下的
vara=1varfn=nullvarfn=setInterval(function(){//执行方法console.log(10)a++if(a==10){clearInterval(fn)}},1000)//间隔1s//计时器中重复操作不能调用函数,写函数变量名(变量内存中储存着函数操作)//计时器创建前先初始化计时器例:left.onclick=zd//不能写=函数名()函数变量名内就存储着函数内容varx=0functionzd(){x++if(x==img_.length){x=0}img.src=img_[x]//console.log(x)}setInterval(zd,1000)//计时器重复操作写函数变量名
它可以用来调用所有者对象作为参数的方法。
通过call(),您能够使用属于另一个对象的方法
call(obj,参数列表)call方法传入两个参数,第一个为对象(必写)。若没有对象传入,写法为call(null,参数列表)
varperson={fullName:function(){returnthis.firstName+""+this.lastName;}}varperson1={firstName:"Bill",lastName:"Gates"}varperson2={firstName:"Steve",lastName:"Jobs"}varx=person.fullName.call(person2);//调用fullName,传入的参数为person2console.log(x);//SteveJobs
apply()方法与call()方法非常相似
同样必须传入两个参数apply(obj,参数数组)若只传数组,则写法为:apply(null,array)
不同之处是:call()方法分别接受参数。apply()方法接受数组形式的参数。如果要使用数组而不是参数列表,则apply()方法非常方便
varperson={fullName:function(){returnthis.firstName+""+this.lastName;}}varperson1={firstName:"Bill",lastName:"Gates"}varx=person.fullName.apply(person1);console.log(x);//BillGates//apply()方法接受数组中的参数varperson={fullName:function(city,country){returnthis.firstName+""+this.lastName+","+city+","+country;}}varperson1={firstName:"Bill",lastName:"Gates"}varx=person.fullName.apply(person1,["Seatle","USA"]);//apply()用数组传递参数console.log(x);//BillGates,Seatle,USA//call()方法不用数组传递参数varperson={fullName:function(city,country){returnthis.firstName+""+this.lastName+","+city+","+country;}}varperson1={firstName:"Bill",lastName:"Gates"}varperson2={firstName:"Steve",lastName:"Jobs"}varx=person.fullName.call(person1,"Seatle","USA");//call()不用数组传递参数console.log(x);//BillGates,Seatle,USA
如何获取我们的节点
//.cheildren获取子元素集合只能识别元素
//找节点也可以通过父节点里面的标签方法、.children方法、.parentNode方法(.document只用写一次)
一般的,节点至少拥有nodeType(节点类型),nodeName(节点明称),和nodeValue(节点值)这三个基本属性
元素节点nodeType为1
属性节点nodeType为2
文本节点nodeType为3,文字,空格,换行等
获取子节点:节点.childNodes(标准)一般不使用(兼容性问题)
返回指定节点的子节点的集合,该节点位及时更新的集合(包括注释,文本,元素都会返回)
返回节点下所有子元素节点,其他不返回(只返回元素)
动态添加节点:
父级节点.appendChild('子节点')添加在父节点列表末尾
vara=document.createElement('div')a.innerHTML='haizi5'a.className='ppp'//添加属性还是用JS原本添加属性的方法father.appendChild(a)
父节点.insertBefore(子节点)添加在父节点列表任意位置(括号内添加两个参数)(添加节点名,添加在哪个子元素节点前)
varfather=document.getElementsByClassName('father')[0]//获取父元素vara=document.createElement('div')//动态创建子元素a.innerHTML='haizi5'father.insertBefore(a,father.children[2])//将子元素插入在父元素中,插入位置为第3个子元素前
给页面动态添加一个元素话需要3步奏
1.创建一个节点
2.找到父级节点
3.将元素插入父级节点
删除节点:
node.removeChild(节点)删除选中节点
父节点名.removeChild(要删除的子节点名)
//获取://没加Element获取的子节点都包含注释节点等.childNodes(数组)//获取子元素(所有元素,包括文本节点和注释节点).parentNode//获取父元素.chlidren(数组)//获取子元素(返回数组,只返回标签节点)(常用).firstElementChild//获取子元素第一个标签节点.firstChild//获取第一个节点(包括注释节点).lastElementChild//获取最后一个标签节点.nextElementSibling//获取当前标签节点的下一个兄弟标签节点.previousElementSibling//获取当前标签节点的上一个兄弟标签节点
input框获取其中内容不能用innerHTML和innerText只能用value
onmousecover
onmouseenter
如何设置自定义属性:
1.直接在标签中设置:例:
2.在JS中设置:例:节点名.setAttribute('属性名',属性值)//注意区分对象的添加属性和自定义属性
3.在JS中设置:节点名.dataset.属性名=属性值(这种设置方法为默认在属性名前添加data-)可能存在兼容性问题
用自定义方法设置标签自带的属性名,可以覆盖原本的属性
调用自定义属性:1.节点名.getAttribute('自定义属性名')
2.当自定义属性符合H5命名规范后,可以用节点名.dataset.自定义属性名(不用加data-)来获取例:现有自定义属性data-index='5'
调用:节点名.dataset,index
BOM就是浏览器窗口对象模型,顶点对象就是window,Bom包含了Dom
为了解决单线程的这个问题,利用多核CPU的计算能力,HTML5提出WebWorker标准,允许JavaScript脚本创建多个线程。于是,JS中出现了同步和异步
同步任务:同步任务都在主线程上执行,形成一个执行栈异步任务:js的异步任务事通过回调函数实现的。一般而言,异步任务有以下三种类型:
①普通事件:如click,resize等
②资源加载:如load,error等
③定时器:包括setInterval,setTimeout等
执行顺序:①先执行执行栈中的同步任务②异步任务(回调函数)放入任务队列中③一旦执行栈中的所有同步任务执行完毕,系统就会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。④由于主线程不断的重复获得任务,执行任务,再获取任务,再执行,所以这种机制被称为“事件循环”(eventloop)。
举例:
节点.offsetParent//返回作为该元素带有定位的父级元素,如果父级元素都没有定位则返回body节点.offsetTop//返回元素相对带有定位父元素上方的偏移节点.offsetLeft//返回元素相对带有定位父元素左边框的偏移节点.offsetWidth//返回自身包括padding、边框、内容区的宽度,返回数值不带单位节点.offsetHeight//返回自身包括padding、边框、内容区的高度,返回数值不带单位
offset与style的区别offsetstyleoffset可以得到任意样式表中的样式值style只能得到行内样式表中的样式值(通过CSS写的样式获取不到)offset系列获取的数值没有单位style获取的是带有单位的字符串offsetWidth包含padding+border+widthstyle.width获得不包含padding和borderoffsetWidth等属性是只读属性,只能获取不能赋值style.width可读写所以,offset用来获取,style用来更改值
滚动条在滚动时会触发onscroll事件浏览器的高(或宽)度不足以显示整个页面时,会自动出现滚动条。当滚动条向下滚动时,页面上面被隐藏掉的高度,我们就称为页面被卷去的头部页面被卷去的头部:可以通过window.pageYOffset获得如果是被卷去的左侧window.pageXOffset例:点击按钮回到页面顶端
document.addEventListener('scroll',function(){//bt为回到顶端的按钮创建scroll事件if(window.pageYOffset>=500){//如果页面被卷去500(px)bt.style.display='block'//显示bt按钮setTimeout(function(){bt.style.opacity='1'//利用异步使得按钮有渐显效果},0);}else{bt.style.opacity='0'//如果页面没有被卷去500(px)setTimeout(function(){bt.style.display='none'//隐藏按钮},0);}})bt.onclick=function(){//给按钮创建单击事件varitem=setInterval(function(){//创建计时器每10ms滚动距离-50使得页面有逐渐上滚的效果if(window.pageYOffset>0){varY=window.pageYOffsetY-=50window.scroll(0,Y)//X轴为0Y轴实时变化}else{clearInterval(item)//当被卷去距离为0时关闭计时器}},10)}
functiongetScroll(){//解决兼容性问题return{left:window.pageXOffset||document.documentElement.scrollLeft||document.body.scrollLeft||0,top:window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0};}调用时getScroll()
在普通函数中this指向了widow对象
Functionxx(){console.Log(this)}xx()调用后的这里的this指向widowcall、apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向
call()方法和apply()方法作用:改变函数的this指向相同点:这两个方法的作用是一样的不同点:接收参数的方式不同(根据接收参数情况使用两种方法)
call()方法第一个参数和apply()方法的一样,但是传递给函数的参数必须列举出来。
apply()方法接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
bind()方法接收的参数与call一样但是调用方式不一样
//方法使用方式:函数.call(设置指向的对象,参数1,参数2...)//call方法内第一个参数为this的指向方向,后面为函数需要传入的参数(用逗号隔开)函数.apply(设置指向的对象,[参数1,参数2...])//apply方法第一个参数为this指向的方向,后面函数需要传入的参数以数组的形式写函数.bind(设置指向的对象,参数1,参数2...)()//注意:
bind方法是ES5新增的一个方法,传参和call方法一致。与call、apply方法的区别是,call和apply方法会对目标函数进行自动执行,会返回一个新的函数。call和apply无法在事件绑定函数中使用。而bind弥补了这个缺陷,在实现改变函数this的同时又不会自动执行目标函数,因此可以完美的解决上述问题
节点.cloneNode()
//值为空或false为浅拷贝只复制节点本身,不复制节点内的子节点
//值为true为深拷贝复制节点以及节点内的所有子节点
给元素添加事件,称为注册事件或者绑定事件,注册事件有两种方式:传统方式和方法监听注册方式两种传统绑定事件方式:
1.