文章目录[隐藏]
最近在使用input时,发现了一个问题,就是number的字体是在中间的,我们首先输入中文,就会导致字体变成左边的了。
在Chromium的issues里也没人提,使用各种办法都没用(别试了)。此处作者想到用宏任务(严谨来说叫做时间任务队列)解决:
var ni = document.querySelector(".number");
ni.addEventListener('keypress',()=>{
ni.value = "0";
setTimeout(()=>{
ni.value = ""
},0)
})
原理:
在浏览器中,这是一个bug,所以不是我们可以去从根本上解决的。
在HTMLOpenSyntax概念中,就是如果更改了一个元素的内容,会导致元素的内容修改,因为元素的内容原本是个HTMLElement,我们给追加的内容会被理解为一个Element,会导致重新渲染dom树。(作者也不知道是不是真的)
也就是说,我们更改ni.value,就会导致元素更改,会重置状态,也就变成正常了的。但是我们设置了ni.value=0,那么会导致内容变成0。
为了解决,我们可以创建一个宏任务,要求立刻将ni.value。为什么要创建宏任务?因为浏览器的渲染本身就是宏任务,使用setTimeout,会将内容创建在宏任务队列中,在一次渲染结束后,再更改内容。
用浏览器渲染本身就是宏任务这一特点,我们可以写出很多效果,例如防止卡顿之类的,在这些面上,我们就可以不用去写微任务了,直接写宏任务。
没有回复内容