23、JS事件

JS事件

概念

1.何为事件

实现交互的核心功能点,事件是一个动作。

2.重要吗?—交互体验的核心功能

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	// onclick就是点击事件
	div.onclick = function () {  // 点击之后执行的函数
  		console.log('我被点击了');      
    }
</script>

事件处理函数

如何绑定事件处理函数

事件不绑定也有,绑定的只是事件处理函数。

1.ele.onxxx = function (event){}

ele.on+事件类型,这种绑定方式叫句柄

// 绑定对应事件的处理函数  就是点击了之后要干啥
div.onclick = function () {
    console.log('a');
}

兼容性很好,但是一个元素的同一个事件上只能绑定一个处理程序

// 绑定对应事件的处理函数  就是点击了之后要干啥
div.onclick = function () {
    console.log('a');
}
// 注意 一个对象的一个事件只能绑定一个事件处理函数 因为这么写会把上面的div.onclick事件覆盖
div.onclick = function () {
    console.log('b');
}

基本等同于写在HTML行间上

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.onclick = function () {}
</script>

// 基本等同于把div.onclick写在行间 注意不写function 直接写函数体的内容 然后是和style平级 不能写style内
<div style="width:100px;height:100px; background-color: red;" div.onclick = "console.log('a')">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	// div.onclick = function () {
	//	console.log('a')
	//}
</script>

2.obj.addEventListener(type,fn, false);

IE9以下不兼容,可以为一个事件绑定多个处理程序

div.addEventListener(事件类型, 处理函数,false);

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	// div.addEventListener(事件类型, 处理函数,false);
	div.addEventListener('click', function () {
        console.log('a');
    },false);
	// function test() {} 函数可以提到外面  然后在对应位置引用
	// div.addEventListener('click',test,false);
</script>

特点:可以给一个对象的一个事件绑定多个处理函数,会按照写的顺序先后执行。

<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	// 点击时打印a a  这是两个长得一样但是地址不一样的处理函数 哪怕都是打印a
	div.addEventListener('click', function () {
        console.log('a');
    },false);
	div.addEventListener('click', function () {
        console.log('a');
    },false);
</script>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	// 这样只会打印一个a  因为两个处理函数都指向test test是一个函数  指向地址相同 所以不能绑定同一个函数多次
	div.addEventListener('click',test,false);
	div.addEventListener('click',test,false);
	function test() {
        console.log('a');
    }
</script>

3.obj.attachEvent(‘on’+ type, fn);

IE独有,只能IE使用,一个事件同样可以绑定多个处理程序,IE没了,所以也不用看了。

div.attachEvent(事件类型, 处理函数);

基本和addEventListener一样,只是少了false,唯一不一样的是这是IE独用的

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	// div.attachEvent(事件类型, 处理函数);
	div.attachEvent('click', function () {
        console.log('a');
    });
</script>

小练习

<ul>
	<li>a</li>
     <li>a</li>
     <li>a</li>
     <li>a</li>
</ul>

使用原生js,addEventListener,给每个1i元素绑定一个click事件输出他们的顺序

<body>
    <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
    </ul>
	<script type="text/javascript">
        var liCol = document.getElementsByTagName( 'li');
        var len = liCol.length;
        // 绑定事件出现在循环里要考虑是否形成闭包
        for(var i =0; i < len; i ++) {function(i) {
                liCol[i].addEventListener('click',function(){
				console.log(i);  // 这样写只会返回4  因为for循环结束之后才执行函数打印的i 所以要用立即执行函数
             }, false);
           }(i))
        }
    </script> 

事件处理程序的运行环境

1.ele.onxxx = function (event){}

程序this指向是dom元素本身

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.onclick = function () {
        console.log(this) // this指向元素本身
    }
</script>

点击之后打印的是div这个元素本身

image-20221015110556340

2.obj.addEventListener(type, fn, false);

程序this指向是dom元素本身

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.addEventListener = ('click' , function () {
        console.log(this);  // this指向元素本身
    }, false);
</script>

3.obj.attachEvent(‘on’+ type, fn);

程序this指向window

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.attachEvent = ('click' , function () {
        console.log(this);  // this指向window
    });
</script>

// 让this指向元素本身的办法
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.attachEvent = ('click' , function () {
        handle.call(div);  // 函数里面执行另外一个函数 执行的时候传div
    });
	function handle() {
        console.log(this);
    }
</script>

封装兼容性的addEvent(elem, type, handle);方法

<div style="width:100px;height:100px; background-color: red;">
</div>
// 参数: 元素 事件类型 处理函数
function addEvent(elem, type, handle) { 
    if(elem.addEventListener) {  // 如果元素能用这个方法
        // 使用addEventListener绑定事件处理函数
        elem. addEventListener(type,handle,false);
    }else if(elem.attachEvent) { // 如果能用这个方法
        // 使用attachEvent绑定事件处理函数
        elem.attachEvent( 'on' + type,function() {
       		handle.call(elem) ;
    })
    }else{  // 上面的都不能用就用0n + type的方法(兼容性好)
   		elem [ 'on' + type] = handle;|
    }
}

解除事件处理程序

ele.onclick = false/‘’/null;

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.onclick = function () {
        console.log('a');
    }
	div.click = null;  // 解除绑定事件处理函数
	// 下面这两个也可以
     div.click = '';
     div.click = false;
</script>

ele.removeEventListener(type, fn, false);

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.addEventListener('click',test,false);
	// 用removeEventListener清除函数绑定就需要把函数写在外面,不然找不到函数
	function test() {
        console.log('a');
    }
	div.removeEventListener('click',test,false);
</script>

ele.detachEvent(‘on’+ type, fn);

<div style="width:100px;height:100px; background-color: red;">
</div>
<script type="text/javascript">
	var div = document.getElementsByTagName('div')[0];
	div.addEventListener('click',test);
	// 用detachEvent清除函数绑定也需要把函数写在外面
	function test() {
        console.log('a');
    }
	div.detachEvent('click',test);
</script>

注:若绑定匿名函数,则无法解除

// 这就是为什么上面需要把函数写在外面的原因  可以试试函数写在括号里面看看  加上函数名看看能不能找到

事件处理模型

事件冒泡、捕获

一个对象的一个事件类型只能遵循一种事件处理模型。也就是要么冒泡,要么捕获,不能同时存在冒泡和捕获。

事件冒泡:

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

结构上嵌套的同一事件会像水泡一样一层一层的往上冒

.wrapper{
    width : 300px;
    height: 300px;
    background-color: red ;
}
.content{
    width : 200px;
    height : 200px;
    background-color: green;
}
.box{
    width: 100px;
    height:100px;
    background-color: orange;
}
<div class="wrapper">
    <div class="content">
    	<div class="box">
        </div>
    </div>
</div>
<script type="text/javascript">
    var wrapper = document.getElementsByClassName ('wrapper')[0];
    var content = document.getElementsByClassName('content')[0];
    var box = document.getElementsByClassName('box')[0];
	wrapper.addEventListener('click', function () {
        console.log('wrapper');
    }, false);
	content.addEventListener('click', function () {
        console.log('content');
	}, false);
	box.addEventListener('click', function () {
        console.log('box');
    }, false);
</script>

注意顺序是由内到外:点击时会发现点击红色部分只打印wrapper 点击绿色部分打印content和wrapper 点击box时打印box 和content 和 wrapper

image-20221015153117020

注意:加上margin-left依旧是结构上嵌套关系 所以还是会有冒泡

image-20221015153533999

事件捕获:

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

IE没有捕获事件 只有谷歌有

.wrapper{
    width : 300px;
    height: 300px;
    background-color: red ;
}
.content{
    width : 200px;
    height : 200px;
    background-color: green;
}
.box{
    width: 100px;
    height:100px;
    background-color: orange;
}
<div class="wrapper">
    <div class="content">
    	<div class="box">
        </div>
    </div>
</div>
<script type="text/javascript">
    var wrapper = document.getElementsByClassName ('wrapper')[0];
    var content = document.getElementsByClassName('content')[0];
    var box = document.getElementsByClassName('box')[0];
	wrapper.addEventListener('click', function () {
        console.log('wrapper');
    },true); // false改为true就是捕获处理模型
	content.addEventListener('click', function () {
        console.log('content');
	}, true); // false改为true就是捕获处理模型
	box.addEventListener('click', function () {
        console.log('box');
    }, true); // false改为true就是捕获处理模型
</script>

注意顺序是由外到内:捕获和冒泡没啥不一样 只是顺序不一样 捕获是自顶向下 点第一个wrapper打印wrapper 点第二个content打印wrapper content(先打印外层) 点击box时打印wrapper和content和box

!!!被点击的元素叫事件执行 其他元素才叫事件捕获 比如点击box box是事件执行 另外两个元素叫事件捕获!!!

image-20221015154306442

触发顺序,先捕获,后冒泡

<div class="wrapper">
    <div class="content">
    	<div class="box">
        </div>
    </div>
</div>
<script type="text/javascript">
    var wrapper = document.getElementsByClassName ('wrapper')[0];
    var content = document.getElementsByClassName('content')[0];
    var box = document.getElementsByClassName('box')[0];
	// 捕获处理模型
	wrapper.addEventListener('click', function () {
        console.log('wrapper');
    },true);
	content.addEventListener('click', function () {
        console.log('content');
	}, true);
	box.addEventListener('click', function () {
        console.log('box');
    }, true);
	// 冒泡处理模型
	wrapper.addEventListener('click', function () {
        console.log('wrapperBubble');
     },false);
	content.addEventListener('click', function () {
        console.log('contentBubble');
	}, false);
	box.addEventListener('click', function () {
        console.log('boxBubble');
    }, false);
</script>

会发现既有捕获又有冒泡的时候 会优先打印外层的元素 也就是会先捕获后冒泡

image-20221015155352703

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

取消冒泡和阻止默认事件

取消冒泡

.wrapper{
    width : 300px;
    height: 300px;
    background-color: red ;
}
.content{
    width : 200px;
    height : 200px;
    background-color: green;
}
.box{
    width: 100px;
    height:100px;
    background-color: orange;
}
<div class="wrapper"></div>
<script type="text/javascript">
    document.onclick = function (){
        console.log('你闲的呀');  // 文档是全局的 所有的元素都是document的子元素  点哪儿都会打印
    }
    var div = document.getElementsByTagName('div')[0];
    div.onclick = function () {
        // 点击之后变绿色 但是由于document是全局的 所以div是document嵌套的元素  根据事件冒泡 也会打印document的内容你闲的呀 这样不好  所以要取消某些部分的事件冒泡
        this.style.background = "green";
    }
</script>

本W3C标准 event.stopPropagation();但不支持ie9以下版本

<div class="wrapper"></div>
<script type="text/javascript">
    document.onclick = function (){
        console.log('你闲的呀');
    }
    var div = document.getElementsByTagName('div')[0];
	// 系统会把事件发生时的数据打包成数据对象传到参数e中
    div.onclick = function (e) { 
        e.stopPropagation(); // 取消冒泡的方法
    }
</script>

IE独有event.cancelBubble = true;

<div class="wrapper"></div>
<script type="text/javascript">
    document.onclick = function (){
        console.log('你闲的呀');
    }
    var div = document.getElementsByTagName('div')[0];
	// 系统会把事件发生时的数据打包成数据对象传到参数e中
    div.onclick = function (e) { 
        e.cancelBubble = true; // 取消冒泡的方法
    }
</script>

封装取消冒泡的函数stopBubble(event)

<div class="wrapper"></div>
<script type="text/javascript">
    document.onclick = function (){
        console.log('你闲的呀');
    }
    var div = document.getElementsByTagName('div')[0];
    div.onclick = function (e) { 
        stopBubble(e); // 把e传进来就好了
    }
</script>

function stopBubble(event) {
    if(event.stopPropagation) {
        event.stopPropagation();
    }else {
        e.cancelBubble = true;
    }
}

阻止默认事件:

默认事件—表单提交,a标签跳转,右键菜单等

a标签

// void(false) 阻止默认事件(a标签的点击跳转等事件
// 小知识:a标签点击跳转后会跳转到页面顶部的位置
<a href="javascript:void(false)" >demo</a>
// 这样写也行
<a href="javascript:;" >demo</a>
//alert弹窗
<a href="javascript:lalert('a')">demo</a> 

右击菜单的默认事件阻止

// 右键出菜单事件  右击时触发这个事件
<div class="wrapper"></div>
<script type="text/javascript">
    document.oncontextmenu = function ( ) {
		console.log ('a');
	}
</script>

image-20221015164409247

1.return false;以对象属性的方式注册的事件才生效

注意 这是句柄方式的阻止默认事件 也只有句柄方式on+type,fn绑定的事件才能用

<div class="wrapper"></div>
<script type="text/javascript">
    document.oncontextmenu = function ( ) {
		console.log ('a');
    	 return false; // 兼容性很好  取消右键菜单事件
	}
</script>

右击就没有菜单了 只打印了a

image-20221015164641449

2.event.preventDefault(); W3C标注,IE9以下不兼容

// 非句柄方式绑定的事件(句柄也能用)
<div class="wrapper"></div>
<script type="text/javascript">
    document.oncontextmenu = function (e) {
		console.log ('a');
    	 e.preventDefault();
	}
</script>

只出a不出右击菜单

3.event.returnValue = false;兼容IE

<script type="text/javascript">
    document.oncontextmenu = function (e) {
        console.log ('a');
        e.returnValue = false;
    }
</script>

封装阻止默认事件的函数cancelHandler(event);

<script type="text/javascript">
    document.oncontextmenu = function (e) {
        cancelHandler(e);
    }
</script>
function cancelHandler(event) {
    if(e.preventDefault) {
        e.preventDefault();
    }else(e.returnValue) {
        e.returnValue = false;
    }
}

事件对象

event || window.event用于IE

事件源对象:

event.target火狐只有这个

event.srcElement IE只有这个

这俩chrome都有

所以写的时候考虑火狐和IE 需要兼容两者

.wrapper{
    width : 300px;
    height: 300px;
    background-color: red ;
}
.content{
    width : 200px;
    height : 200px;
    background-color: green;
}
.box{
    width: 100px;
    height:100px;
    background-color: orange;
}
<div class="wrapper" style="width:100px;height:100px; background-color: red;">
	<div class="box" style="width:50px;height:50px; background-color: green"></div>
</div>
<script type="text/javascript">
    var wrapper = document.getElementsByClassName('wrapper')[0];
    var box = document.getElementsByClassName('box')[0];
    wrapper.onclick = function (e) {
   		var event = e || window.event;
         console.log(event);
	}
</script>

返回的对象中可以查看到事件源对象(被点击的那个)

image-20221015171807714

兼容性写法

<script type="text/javascript">
    var wrapper = document.getElementsByClassName('wrapper')[0];
    var box = document.getElementsByClassName('box')[0];
    wrapper.onclick = function (e) {
   		var event = e || window.event;
         var target = event.target || event.srcElement;
         console.log(target);
	}
</script>

打印的就是点击的事件源对象

事件委托

利用事件冒泡,和事件源对象进行处理

事件委托优点︰

1.性能不需要循环所有的元素一个个绑定事件

2.灵活当有新的子元素时不需要重新绑定事件

<!--点击元素输出对应的数据源对象-->
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
</ul>
<script type="text/javascript">
    var ul = document.getElementsByTagName('ul')[0];
	// 根据冒泡 点击子元素同时会触发父级的事件处理函数 然后打印事件源对象(点到哪个哪个就是事件源对象)的内容
	ul.onclick = function (e) {
        var event = e || window.event;
        var target = event.target || event.srcElement;
         // 点击时打印数据源对象(被点击的li)的内容
        console.log(target.innerText);
	}
</script>

事件分类

鼠标事件

1.click点击、mousedown按下、mousemove移动、mouseup、 contextmenu、mouseover、mouseout、mouseenter、mouseleave

click和mousedown和mouseup同时存在时 按down up click的顺序

// click = mousedown + mouseup;

<div style="width: 100px; height: 100px; background-color: red ; position:absolute;left:0;top:0;">
</div>
<script type="text/javascript">
    // 点击时触发
    document.onclick = function () {
    console.log('鼠标click了');
    }
    // 鼠标按下时触发
    document.onmousedown = function () {
        console.log('鼠标mousedown了');
    }
    // 鼠标移动时触发
    document.onmousemove = function () {
        console.log('鼠标mousemove了');
    }
    // 鼠标按下之后放开的时候触发
    document.onmouseup = function () {
        console.log('鼠标mouseup了');
    }
    // 鼠标右击时触发
    document.oncontextmenu = function () {
        console.log('鼠标contextmenu了');
    }
    // 鼠标移入页面区域时触发  移出后再次移入会再次触发  和onmouseenter功能一样 但是onmouseover会冒泡
    document.onmouseover = function () {
        console.log('鼠标mouseover了');
    }
    // 鼠标移出页面区域时触发  移入后再次移出会再次触发  和onmouseleave功能一样 但是onmouseover会冒泡
    document.onmouseout = function () {
        console.log('鼠标mouseout了');
    }
    // 鼠标移入页面区域时触发  移出后再次移入会再次触发
    document.onmouseenter = function () {
        console.log('鼠标mouseenter了');
    }
    // 鼠标移出页面区域时触发  移入后再次移出会再次触发
    document.onmouseleave = function () {
        console.log('鼠标mouseleave了');
    }
</script>

2.用button来区分鼠标的按键,0/1/2,通过mousedown和mouseup来判断。

// mousedown和mouseup都可以结合button判断鼠标的按键
<script type="text/javascript">
    document.onmousedown = function (e) {
   		if(e.button == 2) {
            console.log('right');
        }else if (e.button == 0) {
            console.log('left');
        }
	}
</script>

左键是0 右键是2 中间滚动轮是1

下图的buttons:1是说明第一个button 0是代表按的左键

image-20221015204541733

第二个button 2代表按的是右键

image-20221015204750005

3.DOM3标准规定:click事件只能监听左键,只能通过mousedown和mouseup来判断鼠标键

事件练习

演示demo—拖拽

应用mousedown、mouseup、mousemove

<div style="width: 100px; height: 100px; background-color: red ; position:absolute;left:0;top:0;">
</div>
<script type="text/javascript">
    var div = document.getElementsByTagName('div')[0];
    var disX, disY;  // 鼠标当前的点(鼠标在的点)设置成left和top
    div.onmousedown = function (e) {
         // 减去鼠标点击的位置
        disX = e.pageX - parseInt(div.style.left);
        disY = e.pageY - parseInt(div.style.top);
        document.onmousemove = function (e) {
            // windoe.event是全局的  event是局部的
            var event = e || window.event;
            div.style.left = e.pageX + "px";
            div.style.top = e.pageY + "px";
        }
        document.onmouseup = function () {
            document.onmousemove = null;
        }
}
</script>

image-20221015201518139

如何区分拖拽和点击(应用)

// 通过判断时间、加锁的方式实现
<div style="width: 100px; height: 100px; background-color: red ; position:absolute;left:0;top:0;">
</div>
<script type="text/javascript">
    var firstTime = 0;
	var lastTime = 0;
	var key = false;
    document.onmousedown = function () {
    	firstTime = new Date().getTime();
	}
	document.onmouseup = function () {
    	lastTime = new Date().getTime();
        if(lastTime - firstTime < 300) {
            key = true;
        }
	}
	document.onclick = function () {
    	if(key) {
            console.log('click');
            key = false;
        }
	}
}
</script>

事件分类

键盘事件

keydown keyup keypress

// keydown和keypress都是鼠标按下时触发  keyup是松开鼠标时触发
<div style="width: 100px; height: 100px; background-color: red ; position:absolute;left:0;top:0;">
    </div>
<script type="text/javascript">
    document.onkeypress = function () {
    console.log('keypress');
    }
    document.onkeydown = function () {
        console.log('keydowm');
    }
    document.onkeyup = function () {
        console.log('keyup');
    }
</script>

执行顺序:keydown > keypress > keyup

image-20221015213513403

keydown和keypress的区别

keydown可以响应任意键盘按键,keypress只可以相应字符类键盘按键

按上下左右这种按键
keydown可以响应 但是keypress不行 keypress只能监测字符类按键 也就是有ASCII码的按键

keydown的缺点
keydown可以响应 但是keypress不行 keypress只能监测字符类按键 也就是有ASCII码的按键

字符类按键用keypress,操作类按键用keydown

keydown的charCode是0,which是键盘的键位。

image-20221015214643167

keydown的charCode是97,which是键盘的键位。

image-20221015214721852

keypress返回ASCII码,可以转换成相应字符

<div style="width:100px;height:100px;background-color:red; position:absolute;left:0;top:0;">
</div>
<script type="text/javascript">
    document.onkeypress = function (e) {
// String的fromCharCode方法可以直接把放入的Unicode转换成对应的字符(Unicode编码是万国码  包含了ASCII码)
   		console.log(String.fromCharCode(e.charCode));
	}
</script>

image-20221015220207703

文本操作事件

input,focus,blur,change

input

input {
        border: 1px solid #01f;
    }
// 输入什么就打印出什么 删除之后也会打印
<input type="text">
<script type="text/javascript">
    var input = document.getElementsByTagName("input")[0];
    input.oninput = function (e) {
        console.log(this.value);  // this代表input
    }
</script>

image-20221015220842899

change: 聚焦,内容发生改变(内容不变失去焦点也不会触发),失去焦点时打印


<script type="text/javascript">
    var input = document.getElementsByTagName("input")[0];
    input.onchange = function (e) {
        console.log(this.value);
    }
</script>

image-20221015221435907

onblur:失去焦点时

onfocus聚焦时

// 缺陷是输入请输入用户名时字体颜色会变黑(因为是输入的内容)
<input type="text" value="请输入用户名" style="color:#999" 
    onfocus="if(this.value=='请输入用户名')
    {this.value=' ';this.style.color='#424242'}" 
    onblur="if(this.value==' ' ){this.value='请输入用户名';
     this.style.color='#999'}">
    <script type="text/javascript">
        var input = document.getElementsByTagName("input")[0];
        input.onchange = function (e) {
            console.log(this.value);  // this代表input
        }
    </script>

窗体操作类(window上的事件)

scroll(获取滚动条当前位置)

li{$}*100
<script type="text/javascript">
        window.onscroll = function () {
            console.log(window.pageXoffset + " " + window.pageYoffset);
        }
</script>

onload

浏览器执行顺序
html和css是并行解析的
htmlhtml在解析的时候会形成一个叫domTree的东西
csscss在解析的时候会形成一个叫cssTree的东西
renderTree会标注结构的样式domTree和cssTree结合生成一颗渲染树renserTree

domTree

<div>
	<span></span>
	<strong></strong>
</div>

上面这个html结构形成的domTree,代码解析是只要认出来就把标签挂在domTree上,具体的内容先不管。比如有一个img标签有一张很大的图标,在识别了是img之后就会把img挂在domTree上,然后开启一个异步线程下载图片。

image-20221015224419996

<script type="text/javascript">
    // 这么写就需要所有的代码解析并且下载完成之后才会触发onload 所以效率很低  onload能提醒什么时刻是页面开始启动的时候
    window.onload = function () {
        var div = document.getElementsByTagName( 'div' )[0];
    	console.log(div);
        div.style.width= "100px";div.style.height = "100px;
        div.style.backgroundColor = "red";
	}
</script>
.pageYoffset);
        }
</script>

onload

浏览器执行顺序
html和css是并行解析的
htmlhtml在解析的时候会形成一个叫domTree的东西
csscss在解析的时候会形成一个叫cssTree的东西
renderTree会标注结构的样式domTree和cssTree结合生成一颗渲染树renserTree

domTree

<div>
	<span></span>
	<strong></strong>
</div>

上面这个html结构形成的domTree,代码解析是只要认出来就把标签挂在domTree上,具体的内容先不管。比如有一个img标签有一张很大的图标,在识别了是img之后就会把img挂在domTree上,然后开启一个异步线程下载图片。

[外链图片转存中…(img-ykKX5epi-1665845854203)]

<script type="text/javascript">
    // 这么写就需要所有的代码解析并且下载完成之后才会触发onload 所以效率很低  onload能提醒什么时刻是页面开始启动的时候
    window.onload = function () {
        var div = document.getElementsByTagName( 'div' )[0];
    	console.log(div);
        div.style.width= "100px";div.style.height = "100px;
        div.style.backgroundColor = "red";
	}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好学习_fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值