了解 JS 的加载顺序和方式,实现 Ready 方法

boyanx1个月前技术教程9

页面加载 JS 顺序或方式不同,可能会导致功能失效、错误的产生或加载解析时间过长,拖慢整个页面展示。

了解 JS 的加载顺序

了解页面元素的加载顺序,找到 JS 执行失败原因。有时明明没有问的代码,可就获取不到元素值或信息,这可能是JS执行时间过早或过晚,而导致的 JS 执行失败。我们来看一幅图,了解defer、async属性对JS下载、执行顺序的影响

  1. 默认情况下,浏览器解析到JS文件就会立即下载文件,并执行文件,JS提前执行,获取不到页面元素,并导致页面解析中断,拖慢整个页面的加载。
  2. 添加async属性后,就会异步下载JS文件并执行,执行时间不可控,JS执行时间过早或过晚,而导致的 JS 执行错误或失败。
  3. 添加defer属性后,就会异步下载JS文件,等页面解析完成后再执行JS

Ready方法的实现

很多时候我们不把JS放在head中,而把JS放到body的最后面也就很好解释了?

  • 首先,JS的下载和执行会中断页面的解析,拖慢整个页面展示,
  • 然后,放在head中,页面元素还没有加载,JS方法就无法获取或处理页面上的元素,这一点很容易忽视,
  • 但是,我们还有ready方法。

jQuery中的ready方法会在页面解析后运行,语法如下:

//语法 1
$(document).ready(function)
//语法 2
$().ready(function)
//语法 3
$(function)

自定义方法,通过监听DOMContentLoaded实现ready方法

/**
 * 页面解析后执行 fn
 * https://ichochy.com
 * /
function ready(fn) {
    if (window.addEventListener) {
        window.addEventListener('DOMContentLoaded', function () {
            //注销时间,避免重复触发
            document.removeEventListener('DOMContentLoaded', arguments.callee, false);
            fn(); //运行函数
        }, false);
    } else if (document.attachEvent) { //IE浏览器
        document.attachEvent('onreadystatechange', function () {
            if (document.readyState == 'complete') {
                document.detachEvent('onreadystatechange', arguments.callee);
                fn(); //函数运行
            }
        });
    }
}

当然还有我的onload方法,可以在页面完成所有加载后再执行

//window 的 onload
window.onload = function(){
    //load https://ichochy.com
    //some things ……
}
//body 的 onload
<body onload="load()">

总结

可以看到,JS的执行顺序决定着程序是否正常工作。加载过早,可能无法获取到页面元素,而太晚,页面元素无法交互。对于执行的顺序,要以当前的程序功能而定。

联系方式

网站:https://ichochy.com/

源文:
https://ichochy.com/posts/20200807/

相关文章

jquery easyUI 日期格式化,DateBox只显示年

蕃薯耀 2016年6月8日 17:13:32 星期三http://fanshuyao.iteye.com/一、问题描述jquery easyui 本身不支持只显示年或只显示月份二、解决方案:1、增加格...

学习下ECharts 异步加载数据(echarts加载大量数据)

ECharts 通常数据设置在 setOption 中,如果我们需要异步加载数据,可以配合 jQuery等工具,在异步获取数据后通过 setOption 填入数据和配置项就行。ECharts 通常数据...

python爬取双色球20年来的历史开奖数据

心血来潮,打算把双色球历史开奖数据喂给大模型,让大模型替我预测一下每期双色球的开奖结果。所以第一步,就是搞定训练的数据源。百度一下,输入双色球开奖结果,看到了中彩网,直接F12打开调试模式get请求,...

jQuery中模拟用户操作(jquery模拟键盘输入)

有时为了节省不想手动操作网页,但又想看到用户操作时的效果,可以用到jQuery提供的trigger方法。见下图代码在不点击按钮时仍然想弹出this.value我们只需要在后面加上.trigger("事...

蓝色时间轴个人博客网页模板代码(网页制作蓝色的代码)

看雪时间轴个人博客模板,女生唯美简洁个人博客静态页面模板,蓝色时间轴个人网页模板,下雪空间个人模板代码1、html页面代码<!doctype html> <html> <...

java学习路线 新手必备 没有学不会的知识

怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业要学到的一些东西: 首先要明白Java体系设计到得三个方面:J2SE,J2EE,J2ME(KJAVA)。J2S...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。