网页中的 JavaScript 脚本运行是需要通过事件去触发的。一般的做法就是在网页中,直接编写几个函数,有的在代码被加载的时候就被浏览器处理,或者使用类似下面的代码来触发实现函数的相关功能。...JavaScript 正确的使用方法应该是 脚本与 HTML 元素分离、当页面加载完成之后再去执行。本文就来讲解如何使用原生 JavaScript 来实现。...以前需要在 HTML 中加上一些触发事件来触发 JavaScript 的相关函数,而现在直接在 JavaScript 中对某个元素的使用监听器,监听这个元素的事件,如果这个元素被触发了某些事件,在监听器中又定义了这个事件对应的处理函数...window.onload 事件 onload 事件只有在整个页面已经完全载入的时候才会被触发,我们将 JavaScript 代码写进 onload 事件中,就可以保证在 HTML 元素被加载完成之后,...前面说过 window.onload 事件加载的缺陷是只能在页面中使用一次。而使用监听器的方法,就可以监听为 window 的 onload 事件分别加载多个函数了。
想要提高一个网页的加载速度是非常困难的,如果你的网站是在使用 JavaScript 渲染的内容,你必须要在网页的加载速度和网页的输入响应能力之间作出权衡: 一次性执行首屏需要执行的逻辑(负载性能好,输入响应能力差...例如,用户正在输入一些内容时, JavaScript 正在执行大量的逻辑,则在这些逻辑完成之前,浏览器都不能处理用户的输入事件。 现在的最佳实践是通过将复杂的逻辑拆分成更小块的任务执行来解决这种问题。...在页面加载期间,页面可以运行一些 JavaScript 逻辑,然后将控制权转交给浏览器,这时浏览器可以检测自己的事件队列,看看是不是需要响应用户输入,然后再继续运行 JavaScript ,这种方式虽然会有一些帮助...每次页面将控制权交还给浏览器时,浏览器都会花费一些时间来检查它的事件队列,处理完事件后再获取下一个 JavaScript 代码逻辑。当浏览器更快地响应事件时,页面的整体加载时间会变慢。...而且,用户输交互比较多的情况下,页面加载会非常慢。如果我们不那么频繁地进行上面的过程,那么浏览器响应用户事件所花费的时间就会更长。 ?
想要提高一个网页的加载速度是非常困难的,如果你的网站是在使用 JavaScript 渲染的内容,你必须要在网页的加载速度和网页的输入响应能力之间作出权衡: 一次性执行首屏需要执行的逻辑(负载性能好,...例如,用户正在输入一些内容时, JavaScript 正在执行大量的逻辑,则在这些逻辑完成之前,浏览器都不能处理用户的输入事件。 现在的最佳实践是通过将复杂的逻辑拆分成更小块的任务执行来解决这种问题。...在页面加载期间,页面可以运行一些 JavaScript 逻辑,然后将控制权转交给浏览器,这时浏览器可以检测自己的事件队列,看看是不是需要响应用户输入,然后再继续运行 JavaScript ,这种方式虽然会有一些帮助...每次页面将控制权交还给浏览器时,浏览器都会花费一些时间来检查它的事件队列,处理完事件后再获取下一个 JavaScript 代码逻辑。当浏览器更快地响应事件时,页面的整体加载时间会变慢。...而且,用户输交互比较多的情况下,页面加载会非常慢。如果我们不那么频繁地进行上面的过程,那么浏览器响应用户事件所花费的时间就会更长。
onload事件的触发,而现在很多页面的代码都在onload时还执行额外的渲染工作,所以还是会阻塞部分页面的初始化处理。...前者是在document已经解析完成,页面中的dom元素可用,但是页面中的图片,视频,音频等资源未加载完,作用同jQuery中的ready事件;后者的区别在于页面所有资源全部加载完毕。...他们将在onload事件之前完成。...三:延迟加载 有些JS代码在某些情况在需要使用,并不是页面初始化的时候就要用到。延迟加载就是为了解决这个问题。...JS延迟加载机制(LazyLoad):简单来说,就是在浏览器滚动到某个位置在触发相关的函数,实现页面元素的加载或者某些动作的执行。如何实现浏览器滚动位置的检测呢?
当window.onload事件触发时,页面上所有的DOM,样式表,脚本,图片,flash都已经加载完成了。...这通常是在用户查看或与页面交互之前执行所需任务的好时机,例如添加事件处理程序和初始化插件。当通过对此方法的连续调用添加多个函数时,它们在DOM按照添加顺序准备就绪时运行。...相反,DOMContentLoaded事件触发后添加的事件侦听器永远不会执行。 浏览器还在对象load上提供事件window。当此事件触发时,表示页面上的所有资源都已加载,包括图像。...注意,尽管DOM总是在页面完全加载之前就绪,但是在 .ready()处理程序期间执行的代码中附加加载事件侦听器通常不安全。...例如,可以在使用诸如$.getScript()的方法加载页面很久之后动态加载脚本。
标签的位置 按照惯例,所有的 都应该放入 中,但是这就意味着必须要等所有的 JavaScript 代码下载解析和执行完毕后才能开始呈现页面内容(浏览器在遇到 body 标签时...在现实中,延迟脚本不一定会按照顺序执行,也不一定会在 DOMContentLoaded 事件触发之前执行,因此最好只包含一个延迟脚本。...,因此,确保两者之间互不依赖非常重要,指定 async 属性的目的是不让页面等待两个脚本下载和执行,从而异步脚在页面其它内容。...因此,建议异步脚本不要在加载期间修改 DOM。 异步脚本一定会在页面 load 事件之前执行,但可能会在 DOMContentLoaded 事件触发之前或之后执行。...,首屏时间接近 1000ms,还是比较慢的。
您还可以使用此工具监视和挑选那些正在减慢或阻塞web页面快速加载的请求。当主事件被触发时,网络面板显示(DOMContentLoaded和load)。...DevTools标记报表中的主要生命周期事件,如DOMContentLoaded和page load。蓝色表示事件DOMContentLoaded被触发的时间;紫色线表示启动页面加载事件的时间。 ?...Waiting 是在接收到第一个字节之前,客户机等待的总时间。在其他性能分析工具如WebPageTest.org或Chrome的DevTools中,这被称为TTFB或时间到第一个字节。...等几秒钟,还要确保在分析期间与页面进行交互,然后停止记录 查找任何长时间运行的函数或事件,并关注FPS低的时间部分(放大)。...The JS Flame Chart Flame图显示了在分析期间JavaScript调用堆栈的Flame图。Flame图是由布伦丹·格雷格创建的一种性能可视化图。 ?
尽管浏览器通过不依赖JavaScript的控件(如复选框、单选按钮以及由CSS支持的控件)提供交互性,但是驱动交互性的「主要因素通常还是JavaScript」. ---- 2....脚本执行与启动过程中的长任务之间的关系 在页面生命周期中,当页面加载时,首先进行渲染,但是这里有一个很迷惑的点,仅仅因为页面已经渲染出来,不意味着页面已经完成加载。...在页面加载过程中,可能会延长输入延迟的一件事就是脚本执行。...大型DOM在以下两种情况下会引起问题: 在初始页面渲染期间,大型DOM需要大量工作来渲染页面的初始状态。...我们可以限制页面加载期间和响应用户交互期间的渲染工作量的一种方法是利用CSS的content-visibility属性,它实际上是在元素接近视口时延迟渲染它们。
当用户在浏览器中执行后退或前进操作时,浏览器可以从 bfcache 中快速加载页面,而不是重新请求服务器并重新渲染页面。这意味着用户可以瞬间回到之前访问的页面,无需等待页面重新加载。...缓存页面资源:除了保存页面的状态,浏览器还会将与页面相关的资源(如 JavaScript 文件、样式表、图像等)保存在内存中,以便在后续加载页面时可以快速访问这些资源,而无需重新请求服务器。...更新页面内容:如果页面在离开期间发生了变化,例如用户在其他标签页中进行了操作,浏览器会重新加载页面,并更新 bfcache 中的状态。这确保了页面的内容是最新的,以提供一致的用户体验。...) 具体流程如下: 随之而来的疑问: 1、我在离开页面时,页面 Javascript 任务没有完成,会如何处理?...2.IndexDB链接的页面 3.页面有正在进行的fetch或XMLHttpRequest的事件 如果你的页面正在使用这些 API 中的其中一个,最好总是在页面pagehide或freeze事件期间关闭连接并删除或断开观察者的连接
表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或 等待加载其他脚本。只对外部脚本文件有效。 defer:可选。表示脚本可以延迟到文档完全被解析和显示之后再执行。...这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在元素中设置defer 属性,相当于告诉浏览器立即下载,但延迟执行。 在以上代码中,第二个脚本文件可能会在第一个脚本文件之前执行。因此,确保两者之间互不依赖 非常重要。...指定 async 属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。 为此,建议异步脚本不要在加载期间修改 DOM。...异步脚本一定会在页面的 load 事件前执行,但可能会在 DOMContentLoaded 事件触发之前或之 后执行。
但是,响应能力对于整个页面生命周期的用户体验至关重要,因为用户在页面加载后大约 90% 的时间都花在页面上。 INP测量网页响应用户交互所花费的时间,从用户开始交互到在屏幕上绘制下一帧的那一刻。...在运行处理程序后,大量的事件处理JavaScript和其他渲染任务会导致INP不佳。 优化 FID 可以通过改进页面加载时的资源加载和优化 JavaScript 代码来优化。...在加载过程中,这可能是一个沉重的过程,这取决于JavaScript需要多长时间来加载和注水完成。它也可能导致页面看起来像是互动的,但其实不是。...缩减初始包的大小,以及在应用程序呈现任何东西之前必须加载的必要代码。 Hydration。岛屿式的Hydration,以限制应用程序中需要被唤醒的互动部分的数量。 减少CD的开销。...更好地支持加载指标:。例如,在SSR重新渲染期间,在routing期间,以及在懒加载操作中。 剖析工具。更好的开发工具来了解交互成本,特别是围绕特定交互的变化检测成本。
它结合了旧的时间线和JavaScript CPU Profiler,它仍然存在,但是隐藏在更多的工具中——在它将从未来版本的Chrome中移除之前。...对于加载时间性能,您需要使用第二个按钮或按CTRL+Shift+E,这将重新加载当前页面并启动新的记录。 对于配置文件的演示,您可以使用谷歌提供的jank示例。...它特别适合与显示加载请求的网络部分一起进行加载时间分析。 ? 当您在请求上移动鼠标时,它将显示特定请求的加载时间。 当您单击一个特定的请求时,所有其他子工具都会更新,以包含仅在请求期间发生的操作。...在您能够采取步骤优化代码之前,您需要获得关于您需要采取行动的确切位置的信息。为此,您可以在Performance选项卡下使用其他工具(调用Tree选项卡、自底向上选项卡和事件日志表格视图)。...The Call Tree 选项卡:在(选定的)分析期间,用它们的调用堆栈显示活动。 The Event Log 事件日志选项卡按执行事件的顺序、分析时间或选定时间显示事件。 ?
事件类型: DOM3级事件规定了以下几类事件;如下: UI事件: 当用户与页面上的元素交互时触发; load事件:当页面加载完后(包括所有图像,所有javascript文件,css文件等外部资源),就会触发...,就会弹出图片的url地址了; 如果在创建新的img元素时,可以为其指定一个事件处理程序,以便图像加载完成后给出提示,此时,最重要的是在指定src属性之前先指定事件;如下代码所示: EventUtil.addHandler...,会弹出图片地址了; 同样的功能,我们可以使用DOM0级的Image对象来实现,在DOM出现之前,开发人员经常使用Image对象在客户端预加载图像,如下代码: EventUtil.addHandler(...,但是IE8及以下不支持,在IE9+,Firefox,Opera,chrome及Safari3+都支持,以便开发开发人员确定动态加载的javascript文件是否加载完毕;比如我们动态创建script标签后...也都实现了这个事件,当用户通过鼠标滚轮与页面交互,在垂直方向上滚动页面时(无论向上还是向下),就会触发mousewheel事件,这个事件可以在任何元素上触发,最终会冒泡到document(IE8)或window
写在html内还是独立成外部js文件: javascript代码是放置在html文件中还是放置在独立的js文件中坚持的原则是:不同html文件共用的js脚本单独放在js文件中,不共用的放在各自的html...对于那些需要很多JavaScript 代码的页面来说,这无疑会导致浏览器在呈现页面时出现明显的延迟,而延迟期间的浏览器窗口中将是一片空白。...3.script标签内Javascript脚本在页面加载时会执行吗? 会执行。在html页面内定义的Javascript脚本和由src属性指定的外部脚本,都被执行。...; 用浏览器打开html文件会,依次弹出:“页面已加载1!”,“已加载3!”,“页面已加载5!”和”页面已加载2”。...即body的onload事件在整个html文件加载完成时才会被触发。 **注意:**Javascript的具名函数(也就是具有名字的函数)在页面加载时是不会被执行的,必须显示调用才会被执行。
……如果加载失败怎么办?例如,这里没有这样的脚本(error 404)或者服务器宕机(不可用)。 script.onerror 发生在脚本加载期间的 error 会被 error 事件跟踪到。...注意:onload/onerror 事件仅跟踪加载本身 在脚本处理和执行期间可能发生的 error 超出了这些事件跟踪的范围。...它要等到获得 src (*) 后才开始加载。 对于 来说,iframe 加载完成时会触发 iframe.onload 事件,无论是成功加载还是出现 error。 这是出于历史原因。...总结 图片 ,外部样式,脚本和其他资源都提供了 load 和 error 事件以跟踪它们的加载: load 在成功加载时被触发。 error 在加载失败时被触发。...唯一的例外是 :出于历史原因,不管加载成功还是失败,即使页面没有被找到,它都会触发 load 事件。
Reader 引擎线程与模块分析首先是网页内容,加载完输入到HTML解释器,解释后构成DOM树,这期间如果遇到JavaScript代码就交给JavaScript引擎去处理,如果网页中包含CSS,就交给CSS...asyncasync 属性表示异步执行引入的 JavaScript,与 defer 的区别在于,如果已经加载好,就会开始执行,无论此刻是 HTML 解析阶段还是 DOMContentLoaded 触发(...需要注意的是,这种方式加载的 JavaScript 依然会阻塞 load 事件。...避免强制同步布局事件的发生将一帧画面渲染到屏幕上的处理顺序如下所示: 在JavaScript脚本运行的时候,它能获取到的元素样式属性值都是上一帧画面的,都是旧的值。...,它们会阻塞页面的滚动避免在输入事件处理函数中修改样式属性对输入事件处理函数去抖动,存储事件对象的值,然后在requestAnimationFrame 回调函数中修改样式属性具体参看《Debounce
然而,用了Ajax就无法保证用户在等待异步JavaScript和XML响应返回期间不会非常无聊。在很多应用程序中,用户能够一直等待取决于如何使用Ajax。...5.延迟加载组件 可以凑近看看页面并问自己:什么才是一开始渲染页面所必须的?其余内容都可以等会儿。 JavaScript是分隔onload事件之前和之后的一个理想选择。...条件性预加载——根据用户操作猜测用户将要跳转到哪里并据此预加载。在search.yahoo.com的输入框里键入内容后,可以看到那些额外组件是怎样请求加载的。 提前预加载——在推出新设计之前预加载。...可以通过在将要推出新设计之前预加载一些组件来减轻这种负面影响,老站可以利用浏览器空闲的时间来请求那些新站需要的图片和脚本。...放到外部文件中还是直接写在页面里?
在Javascript引擎运行脚本期间,GUI渲染线程都是处于挂起状态的,也就是说被冻结了.一个主线程(main thread)多个工作线程(work thread)一个合成器线程(compositor...初始化加载完成当导航提交完成后,渲染进程开始加载资源及渲染页面(详细内容下文介绍),当页面渲染完成后(页面及内部的iframe都触发了onload事件),会向浏览器进程发送IPC消息,告知浏览器进程,这个时候...再由JavaScript引擎执行。事件循环机制进与线程关系之前也写过《弄懂javascript的执行机制:事件轮询|微任务和宏任务》,但是还是没有从本质去阐述。...JavaScript事件队列等原因还是JavaScript线程与 定时触发器线程、事件触发线程、异步http请求线程等IO通信问题。...,在渲染之前所以它的响应速度相比setTimeout(setTimeout是task)会更快,因为无需等渲染也就是说,在某一个macrotask执行完后,就会将在它执行期间产生的所有microtask都执行完毕
一个非常常见的场景,通常在页面加载过程中我们的 Web 网页已经展示给用户足够的 UI 元素时,但存在页面交互逻辑的 JavaScript 脚本并为加载(执行完毕),此时页面虽然可以正常向用户展示内容但无法响应用户的交互式命令...当用户点击已展示的 UI 元素时页面并没有任何交互式反应(可能此时 JavaScript 文件还在下载阶段、又或者 JavaScript 在执行过程中主线程被阻塞),可交互时间 TTI 的初衷正是作为评估这部分从看到到可操作的指标而生...如果用户尝试在长时间的任务(long task)或渲染更新期间与页面互动,此时浏览器不得不等待主线程执行完成后才能对用户的命令作为响应,从而导致卡顿延迟的现象发生。...TTI 的误差 误差 TTI 的设计初衷源自于页面在主线程空闲之前并不会真正“加载”的想法,所以通过 Lighthouse 的 TTI 的评分开发者们可以直观的观察到页面具备“响应用户的输入”的标准耗时...如果在衡量 FID 期间用户并未进行任何页面操作或者页面元素并不具备任何事件(交互行为,比如 a、input 等具有交互性质的元素)FID 自然并不具备任何值。
领取专属 10元无门槛券
手把手带您无忧上云