搜索
热搜: 活动 交友 discuz
查看: 4|回复: 2

马黑黑老师-JS:动态加载多个JS文件

[复制链接]
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 393 天

    连续签到: 5 天

    [LV.9]以坛为家II

    438

    主题

    1183

    回帖

    1万

    积分

    社区管理员

    积分
    12757

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理

    发表于 6 小时前 | 显示全部楼层 |阅读模式

    Web页加载外部 .js 资源本来很容易:

    方法一:<script src="JS文件地址"></script>
    方法二:import * from 'JS地址'; // ES6模块

    然而,一些场景并不支持上述方法或支持度不够理想。因此,动态加载JS文件成了解决问题的替代方法,本文在此前介绍的动态加载单个外部JS文件的基础上加以扩展,实现多个JS资源的动态加载。看代码和解释:

    function loadJs(url, callback) {
        var script = document.createElement('script');
        script.charset = 'utf-8';
        script.src = url;
        script.onload = function() {
            if (callback) callback();
        };
        document.head.appendChild(script);
    }
    

    loadJs() 函数并无太多区别,仅在 onload 事件中加了一个 if 条件语句,检测调用者是否提供传参(回调函数),若有,则执行它。这是关键语句,试看调用方法:

    loadJs('1.js', function() {
        loadJs('2.js', function() {
            loadJs('3.js', myFn);
        });
      });
    
    function myFn() {
        console.log('第三个JS文件加载完毕');
    }
    

    上面的调用 loadJs() 函数代码中,第一步是加载 1.js 文件,同时传入一个匿名函数 function(),该匿名函数实际上是继续调用 loadJs() 函数加载第二个JS文件即 2.js——如果第一个JS文件加载成功的话;第二步加载第二个JS文件,同样传入一个匿名函数,该匿名函数加载第三个JS文件;第三步,加载第三个JS文件 3.js,传入 myFn() 函数(函数没有形参时可以不要方括号 ())。myFn() 函数是JS文件都成功加载后的业务函数,这里 作为第三次调用外部JS文件后的回调函数,确保业务逻辑是在所有外部JS资源都成功加载后才开始投入工作进程——因为业务逻辑依赖第三方JS资源的支撑。

    loadJs() 函数没有做出错处理,个人觉得也没有必要,毕竟层层调用加载函数本身就不能出错,任意一层加载出了问题,核心业务逻辑都无从施展,所加入的出错处理机制顶多方便查找到底是哪一个JS文件未能成功加载,而这个功能,浏览器自身的出错警告已经够明确了。

    应用实例请查看 酬天问

  • TA的每日心情

    2026-4-14 18:03
  • 签到天数: 25 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    0

    主题

    0

    回帖

    2

    积分

    等待验证会员

    积分
    2
    发表于 3 小时前 | 显示全部楼层
    支持发布,内容超有质量
  • TA的每日心情

    2026-4-15 20:03
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    0

    主题

    0

    回帖

    5

    积分

    黑铁会员

    积分
    5
    发表于 27 分钟前 | 显示全部楼层
    感谢分享,收获满满感悟
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|小黑屋|纳兰音画网 ( 蜀ICP备2021011087号 )

    GMT+8, 2026-4-25 20:52 , Processed in 0.080780 second(s), 23 queries .

    Powered by Discuz! X3.5

    © 2001-2020 Comsenz Inc.

    快速回复 返回顶部 返回列表