结合浏览器线程和js事件循环浅谈input输入

当我们在input输入内容时,键盘的按键被按下时发生了什么?

1.准备

我们讨论这个问题前先关注如下几个问题:
a: 浏览器内核中有哪些线程?它们的作用分别是什么?
b: 从手指按下到抬起,input输入内容的操作是从哪一步触发的,换句话说,从哪一步开始内容就被输入了?
c: input内显示的value是浏览器内核中哪一个线程更新或者说显示上去的?

a. 浏览器内核中有哪些线程?它们的作用分别是什么?

图形用户界面GUI渲染线程
负责渲染界面,包括解析HTML、CSS、构建DOM树、渲染树、布局与绘制等;
当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行;
与JS线程互斥(不能同时执行)

JS引擎线程
简单来说,负责执行JS;
与GUI线程互斥(不能同时执行)

事件触发线程
听起来像JS控制的,但是其实归属于浏览器,而不是JS引擎;
用来监听/触发事件、将对应的任务(事件callback)添加到事件队列

定时触发器线程
setInterval与setTimeout所在线程;
定时和计时器并不是由JS引擎计时的,因为JS引擎是单线程的,如果JS引擎处于堵塞状态,那会影响到计时的准确;
当计时完成被触发,事件会被添加到事件队列,等待JS引擎空闲了执行;
注意:W3C的HTML标准中规定,setTimeout中低与4ms的时间间隔算为4ms

异步HTTP请求线程
在XMLHttpRequest在连接后新启动的一个线程;
线程如果检测到请求的状态变更,如果设置有回调函数,该线程会把回调函数添加到事件队列,同理,等待JS引擎空闲了执行;

b: 从手指按下到抬起,input输入内容的操作是从哪一步触发的,换句话说,从哪一步开始内容就被输入了?

code-1

<body>
	<input id="my-input" />
</body>

有这样一段HTML代码,正常输入或者手指常按输入就会发现,手指按下时内容就被输入到了#my-input中

c: input内显示的value是浏览器内核中哪一个线程更新或者说显示上去的?

code-2

<body>
	<input id="my-input" />
	<button id="kill-btn"></button>
	<script>
		var killBtn = document.getElementById('kill-btn');
		killBtn.addEventListener('click', function 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值