对于HTML页面中CSS, JS, HTML的加载与执行过程的简单分析

最近在研究HTML页面中JavaScript的执行顺序问题。在JavaScript中,定义一个方法或者函数有很多方式,最常见的有2中,function语句式与函数直接量方式。

对于function语句式,解释器会优先解释。即加载了这个js文件后,会扫描一下所有的js代码,然后把该优先执行的东西先执行了,然后再从上到下按顺序执行。所以,定义的代码可以在执行的代码后边。就跟C#中的方法定义一样。解释器已经记住了这个方法,知道在内存中的哪里,用的时候直接去取就行了。

C#语言是,对象中的属性与方法具有优先的解释权,先放到内存中,之后哪里都可以用,所以没有先后顺序。这也是对象定义的时候,字段中不能有任何计算的原因。因为字段在优先解释的时候,只是为这个对象开辟内存空间,然后把值放入到内存空间。一个字段肯定不会用到另外的一个字段,因为字段定义的时候,是没有计算的。如果用到了另外一个字段,那肯定是有计算了,就报错了。

但是函数直接量方式,地位跟一般的普通变量一样,没有优先解释权。是在正常的从上到下运行过程中,遇到了才在内存中分配地址。遇到之前,解释器里根本没这个东西,不知道是什么。所以下边的这个代码就会出错。

接下来我们来看一个例子,一段代码。

<html>
<head>
<script>
test();
 
 
</script>
</head>
<body>
 
<div>HelloWorld</div>
//HHHHHHHHHHHHHHHH
 
</body>
<script>
functiontest()
{
alert('a');
}
</script>
</html>

这段代码在页面中运行的时候是报错的。不是说function语句式定义的函数,在前边调用也可以吗?但是注意,调用与定义要在同一个script代码块中。在这个例子中,在不同的script语句块中,所有报错了。但是如果前边定义,后边调用,就可以。

现在来分析一下所有的这些CSS,HTML,JS文件的执行顺序。接下来仅仅是我自己的一些观点。

当浏览器向服务器发起一次请求之后,xxx.com,服务器会向浏览器返回字符串,即HTML代码。接下来的执行情况是这样的。浏览器会一点点的从头接收这些字符串,然后从<html>节点开始分析,从上到下,遇到<script>节点就开始执行JS代码,在此同时,也会一点点的加载HTML控件。(分析与执行JS代码与加载HTML控件是两个同时进行的线程)所以现在document.getElementById这个方法如果获取页面尾部的控件,很有可能为空,因为这时候还没有加载到。而且,在此同时,浏览器也在加载外部CSS文件,并且应用到相应的控件上。

在更新页面内容HTML组件的,叫做UI Upate线程。

我的理解是,这些都是在同时进行的,但是加载HTML控件稍微快一些,CSS稍微慢一些,这就是为什么一个CSS复杂的页面,刚刚load的时候是布局混乱的,过一会就好了。因为那时候CSS还没有加载完全。

在加载HTML的同时,如果css没有加载下来,那么HTML标签中的class就不会起作用。如果CSS很大,那么一时半会不会加载下来,就会看到没有任何格式化的HTML文字。这时候就显示出inline html的好处了,在加载HTML的时候能够立即显示。当然这只是一个方面,也会造成的后果是HTML页面的加载慢,导致长时间白屏。

JS与CSS相互之间的影响也是有可能存在的。

JS 有可能会修改 DOM.典型的,可能会有 document.write. 这意味着,在当前 JS 加载和执行完成前,后续所有资源的下载有可能是没必要的。这是 JS阻塞后续资源下载的根本原因。

JS的执行有可能依赖最新样式。比如,可能会有 var width = $('#id').width(). 这意味着,JS 代码在执行前,浏览器必须保证在此 JS之前的所有 css(无论外链还是内嵌)都已下载和解析完成。这是 CSS 阻塞后续 JS 执行的根本原因。 

JS 和 CSS 的位置对其他资源加载顺序的影响 | 岁月如歌

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 是一个非常适合构建微服务应用程序的 Java 框架,它为我们提供了诸如自动配置、自动装配等功能,使得开发者可以更加专注于业务代码的编写而不必花费大量时间和精力在繁琐的配置上。在 Spring Boot ,我们可以使用 Thymeleaf 模板引擎来渲染我们的 HTML 页面,而且还可以方便地引入 CSS 文件和 JS 文件,使得我们的页面更加美观并增强用户交互体验。 但是有些开发者在使用 Spring Boot 访问 templates 下的 HTML 页面时,可能遇到 CSSJS 失效的情况,这是为什么呢? 首先,我们需要明确 Thymeleaf 模板引擎将我们的 HTML 页面解析成可执行的 Java 代码,然后通过执行这段代码来生成最终的 HTML 页面,所以我们需要在头部添加以下代码来引入 CSSJS 文件: <!-- 引入 CSS 文件 --> <link rel="stylesheet" th:href="@{/css/style.css}"/> <!-- 引入 JS 文件 --> <script th:src="@{/js/main.js}"></script> 其,@{} 的 “/” 表示根目录,th:href 和 th:src 是 Thymeleaf 的语法,表示将表达式的值填入到 href 和 src 。 如果我们直接通过浏览器打开 HTML 页面CSSJS 是可以正常加载的,但是如果将 HTML 页面放在 Spring Boot 项目作为一个模板来使用,我们需要将其放入到 templates 目录下,并且使用 Thymeleaf 模板引擎来进行渲染,因此我们需要按照以下方法来引入 CSSJS: <!-- 引入 CSS 文件 --> <link rel="stylesheet" th:href="@{css/style.css}"/> <!-- 引入 JS 文件 --> <script th:src="@{js/main.js}"></script> 注意,这里的表达式的 “/” 是不需要的,直接使用文件夹名和文件名即可。如果还是发现 CSSJS 失效,可以开启浏览器的开发者工具,查看控制台的错误信息,通常是 URL 地址不正确或者文件路径不正确的问题。此外,还要确保文件路径的大小写和文件名的大小写完全一致,否则也可能出现 CSSJS 失效的情况。 综上所述,Spring Boot 访问 templates 下的 HTML 页面时,CSSJS 失效通常是因为路径不正确或者大小写不一致导致的,我们只需要按照正确的方法来正确引入 CSS 文件和 JS 文件即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值