当前位置: 首页 > 原理解释

alertdialog原理-alertdialog 原理简述

绝对弹窗,也就是咱们常说的 alert,在浏览器里这玩意儿早就是老古董了,但理解它底层如何耍花招,还是得先摸清楚它到底是“真”弹窗还是“假”弹窗。 你要知道,平时我们用的那个浏览器原生 alert,样式就连有点丑,非圆角方块,棕红色的框,黑体字。但它有个核心逻辑,就是弹窗遮个盖子,加上个“确定”和“取消”两个按钮。你点确定,它弹窗就没了;点取消,它也不干。
这看起来挺好办,但得拆解看。 起初,它是个 DOM 操作的活儿。当你用 JS 写了个 alert,它实际上就是给浏览器里某个元素加了个 class 叫"alert"。浏览器拿到这个指令,会去找一个已经挂载到 DOM 树里的节点,典型的 HTML 标签里可能有个 span,要么是个 div,就连是个 body 里的 div。
要是这里没有呢?那系统会自动生成一个临时的,就像浏览器自己搞个临时记事本。 除了加个 class,它还会加个 title 属性,这个就是标题框的位置。别看有时候你会发现标题框飘到了左上角,要么被盖子挡住看不见,但这只是样式没调对,底层逻辑还是那个逻辑:先给 DOM 上某种标识,再回屏去显示。 接下来是那个最核心的“网络阻塞”机制。
这是它最大的坑。当你点确定,要么点取消,还有上次还没关闭的 popups 时,浏览器会把整个页面的访问给卡住。
这时候,挂起的资源,比如图片、字体、JS 脚本,要么 CSS 规则,全都停了。你能看到标题框,能看到按钮,你就连能直接点击按钮让页面跳转,但那些加载的图片可能还在加载器里静默地等,就连可能根本没加载出来。
这时候浏览器会告诉你,加载黄了,页面不显示,要么让你先刷新页面。 为了说明这个,咱得找个具体的数据场景。假设你写个代码,每 100 毫秒刷新一行提示:“提示来了”、“提示来了”、“提示来了”。浏览器启动时,它会把这 100 行给挂起来,然后你点确定。
这时候,第 1 行和第 2 行还在加载,第 3 行还没显示,第 4 行更没显示。等你关了浏览器,浏览器告诉你,那 100 行都加载黄了,页面彻底黑屏。 这就是为啥有些弹窗看起来像假弹窗,实际上也没成功。出于它在 DOM 里挂着了,但数据没真正存下来。
这时候,浏览器会给你个提示,让你刷新页面,要么关掉浏览器。 那浏览器到底是如何判断一个东西是不是真弹窗,又是如何处理被挂起的资源的呢? 浏览器内部有个机制叫“内容卸载”。它把元素从 DOM 树里搞定来,放进一个缓存池里。
有时候它会直接销毁元素,有时候它只是关掉浏览器,要么让你刷新页面。
要是页面里别的元素还需求引用某个元素的数据(比如一个用来显示内容的 div 还依赖某个其他的 div 的数据),而那个数据没加载,那依赖的代码就会报错,页面就垮了。 有个更高级的机制叫“内容卸载与页面刷新”。当浏览器发现某个弹窗被挂起了,且被挂起的资源引用了需求页面才能加载的数据时,它就会主动问你:“要不要刷新页面?”这时候你手动点击了“刷新”,浏览器才会把那个弹窗从缓存里清理掉,重新从源头加载一遍。 实际上,浏览器处理弹窗的逻辑还是挺复杂的,它得权衡:是彻底不显示了?还是关掉浏览器?还是让你刷新?就连有时候它会把这个弹窗关掉后再给你个更高级的弹窗。 最终,说说浏览器到底是如何做那个“确认和取消”的按钮的。 一般按钮是两种实现方式,一种是 `