JavaScript高级编程--元素样式操作和事件

元素样式操作

在前面学习了如何获取元素之后,我们就能操作元素的样式了

 <style>
        .box {
            width: 200px;
            height: 200px;
            background-color:yello ;
        }
    </style>

<div class="box"></div>
let box = document.querySelector(".box")
box.style.backgroundColor="blue"

 不过,需要注意一下,像table的cellspacing,cellpadding等是属性,而不是样式

事件

事件,就是函数在某种状态下被调用.JS捕捉到的发生在网页上的行为,官方称为事件句柄,是交互体验的核心功能

事件的三要素:1 事件源2 事件类型3 事件处理程序

事件类型

鼠标事件

1、click、 mousedown、mousemove、mouseup、dblclick、 contextmenu、mouseover、mouseout、mouseenter(html5标准)、mouseleave(html5标准)

a) mousedown-->mouseup-->click
b) mousedown是鼠标按下一次就只触发一次;
c) mousemove与 mousedown无关,相互独立;
d) 补充:移动端没有 mousedown事件,对应的是 touchstart--touchmove--touchend

2、DOM3标准规定:click事件只能监听左键,mousedown和 mouseup来判断鼠标键,event.button来区分鼠标的按键,0/1/2

键盘事件

1、keydown、keyup、keypress

a) keydown-->keypress-->keyup
b) keydown在按键按下之后会一直不断被触发

2、keydown和 keypress的区别

a) keydown可以响应任意按键(除了Fn键),keypress只可以响应字符类键盘按键(event.charCode)
b)keypress返回 ASCII码,可以转换成相应字符(String.fromCharCode(event.charCode),区分大小写)

keydown常用于绑定操作类事件处理,keypress常用于绑定字符类事件处理

输入框操作事件

1、input、focus、blur、change

a) input监听 input框在聚焦状态下的文本变化,例:百度搜索
b) change监听 input框在失焦后的文本变化(与前一次失焦状态的文本对比变化)
c) focus和blur只在聚焦和失焦的一刻触发一次

其他事件

1、scrollscroll:常用于绑定在window对象上,滚动鼠标时触发window.οnscrοll=func

//wheel 它是鼠标的

2、loadload:等待网页资源下载完毕再执行

img.onload 图片节点加载完毕不会调用 要资源加载完毕就会调用

window.onload:等待页面所有资源下载完成才执行,包括图片资源的下载,所以它是最慢的​ 网页加载顺序:url-->下载页面-->domTree,cssTree并行-->渲染树renderTree-->绘制页面-->继续下载图片资源,下载完毕再放到页面上去onloaddomTree:domTree的形成,是先把元素翻译成的节点对象挂到 domTree上去,再把属性 img_src放到渲染树上去

事件绑定

1.行内绑定方式在标签行内 的事件值上写上标志"javaScript:后跟js代码"

<a href="javaScript:void(0)">点我</a>
<button onclick="javaScript:alert(666)">点我</button>

 2.元素属性绑定方式

ele.onxxx=function(event){}
//兼容性很好,但是一个元素的同一个时间上只能绑定一个处理程序

 3.同元素多处理程序绑定方式1

obj.addEventListener(type,fn,false)
//IE9以下不兼容,可以为一个事件绑定多个处理程序
//第三个参数表示是否捕获阶段触发,跟冒泡没关系(笔试陷阱题)

事件解绑

既然能绑定事件,当然也能解除绑定

1、ele.οnclick=false/''/null;

2、ele.removeEventListener(type,fn,false);

2中fn若绑定的是匿名函数,则永远无法解除 (可以用类似自调用函数的解决方法解决)

var dom=document.getElementById("content"),clickt=0;
dom.addEventListener("click",function(e){
clickt++;
alert('你摸了我'+clickt+'下了。最多摸2下哦');
if(clickt>=2){
dom.removeEventListener(e.type,arguments.callee,false);
console.log(this);
}
});

事件响应链

 

1.事件的三个阶段:先捕获,后目标,再冒泡,只能有一个阶段触发程序执行,比如捕获阶段触发了到了冒泡阶段就不再触发

事件经过所有元素都没有被处理,这个事件消失

事件传递的过程 只跟文档树的结构有关系 跟界面显示的层叠效果没有任何关系

事件冒泡:结构上(非视觉上)嵌套关系的元素,会存在事件冒泡的功能,即同一事件,自子元素冒泡向父元素。(自底向上)

事件捕获:结构上(非视觉上)嵌套关系的元素,会存在事件捕获的功能,即同一事件,自父元素捕获至子元素(事件源元素)。(自顶向下)

2.默认在冒泡的时候执行事件:onclick/attach和 addEventListener传false的时候

3.addEventListener绑定事件,如果把第三个参数设置为true,则在捕捉的时候执行事件

3.整个事件处理过程,会有个event事件对象在整个事件过程传播(W3C标准,ie8及其以下没有)

4.ie8以下不支持addEventListener

5.focus,blur,change,submit,reset,select等事件不冒泡

阻止冒泡和阻止系统默认事件

阻止冒泡

阻止事件冒泡:W3C标准 event.stopPropagation();但不支持 ie9以下版本

stopImmediatePropagation()支持stopPropagation的浏览器中也可以用stopImmediatePropagation()方法,这个不仅会阻止事件向祖元素的冒泡,也会阻止同一个节点上同一事件的其他的事件处理程序(优先级比它低的,同元素同事件多处理程序时)

        btn.addEventListener("click", (e) => {
            console.log("btn 被点击了", "=============")
            // e.stopPropagation()//阻止事件冒泡
            // e.stopImmediatePropagation()//不仅阻止事件冒泡 还阻止其他监听器的运行
        })
        btn.addEventListener("click", (e) => {
            console.log("btn 被点击了", "/")
        })

阻止系统默认事件

官网中的某些元素自带事件,如果我们再给他绑定一个这个事件,会先执行我们的监听器,再执行系统的功能

event.preventDefault();  能够阻止系统默认事件

页面渲染

 

1.页面呈现过程不同的浏览器略微会有些不同。但基本上都是类似的

①.浏览器把html代码解析成1个Dom树,html中的每个tag都是Dom树中的1个节点,根节点就是我们常用的document对象。dom树就是html结构,里面包含了所有的html tag,包括用JS添加的元素。

②浏览器把所有样式(主要包括css和浏览器自带的样式设置)解析成样式结构体,在解析的过程中会去掉浏览器不能识别的样式。

③dom tree和样式结构体结合后构建呈现树(render tree),render tree有点类似于dom tree,但有区别,render tree能识别样式,render tree中每个node都有自己的style,而且render tree不包含隐藏的节点(比如display:none的节点,还有head节点),因为这些节点不会用于呈现,而且不会影响呈现的,所以就不会包含到render tree中。但是visibility:hidden隐藏的元素还是会包含到render tree中的,因为visibility:hidden 会影响布局,会占有位置。

④一旦render tree构建完毕后,浏览器就根据render tree来绘制页面。

2.回流与重绘

① 当render tree中因为元素的数量,尺寸,布局,隐藏等改变而需要重新构建。这就称为回流或者回档(其实我觉得叫重新布局更简单明了些)。每个页面至少需要一次回流,就是在页面第一次加载的时候。

②当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘。

③(面试,选择题,问答题就答上面)从上面可以看出,回流必将引起重绘,而重绘不一定会引起回流。

3.常见的回流和重绘操作任何对render tree中元素的操作都会引起回流或者重绘

①添加、删除元素(回流+重绘)

② 隐藏元素,display:none(回流+重绘),visibility:hidden(只重绘,不回流)

③ 移动元素,比如改变top,left(jquery的animate方法就是,改变top,left不一定会影响回流),或者移动元素到另外1个父元素中。(重绘+回流)

④ 对style的操作(对不同的属性操作,影响不一样)

⑤ 还有一种是用户的操作,比如改变浏览器大小,改变浏览器的字体大小等(回流+重绘)

④重绘与回流操作的注意点:重绘与回流操作的次数越多,计算机的性能消耗越大,进行dom操作的时候就要考虑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值