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

boyanx8个月前技术教程25

页面加载 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/

相关文章

酷炫时间罗盘(时间罗盘是什么)

感觉很新奇的时间罗盘程序,显示非常酷炫,如下图:源代码如下罗盘.html <!doctype html> <html> <head> <meta charse...

Datetimepicker.js用法(datetimepicker属性)

$('.form_date').datetimepicker({//初始化 language: 'zh-CN', //weekStart: 1,...

vue中监听滚动事件:方法简单留着备用

看似简单的功能事件,难道了不少朋友,不是功能有多难,而是对原理不了解浪费不少时间;简单明了收藏备用,或推荐给初学的朋友,赠人玫瑰手留余香;在mounted中监听滚动元素的ID;‘scroll’监听事件...

用了都说好的5款免费开源的JavaScript图表库

Planetary.js是一个JavaScript图表库,用于构建交互式地球仪。它使用 D3 和 TopoJSON 解析并显示地理数据。 Planetary.js使用基于建筑的构架插件,也就是说默认的...

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

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

“我干的真是一份工吗?”做软件工程师有多疯:React+运维+管理=1个人干……

【CSDN 编者按】在技术行业狂奔的今天,软件工程师似乎成了“全能超人”的代名词——既要深挖技术栈,又要横跨前后端,甚至被迫接管运维、管理、产品等角色。对于开发者而言,“全栈”已不再是能力标签,而几乎...

发表评论    

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