• 技术文章 >web前端 >js教程

    脚本加载后执行JS回调函数的方法

    php中世界最好的语言php中世界最好的语言2018-04-12 15:32:54原创982

    这次给大家带来脚本加载后执行JS回调函数的方法,脚本加载后执行JS回调函数的注意事项有哪些,下面就是实战案例,一起来看一下。

    项目中经常会遇到这样的问题:当某个 js 脚本加载完成后再执行相应任务,但很多朋友可能并不知道怎么判断我们要加载的 js 文件是否加载完成,如果没有加载完成我们就调用 js 文件里面的函数是不会成功的。本文主要讲解怎么在成功加载 js 文件后再执行相应回调任务。

    基本思路

    我们可以动态的创建 <script> 元素,然后通过更改它的 src 属性来加载脚本,但是怎么知道这个脚本文件加载完成了呢?因为有些函数需要在脚本加载完成才能调用。IE 浏览器中可以使用 <script> 元素的 onreadystatechange 来监控加载状态的改变,并通过判断它的 readyState 是 loaded 或 complete 来判断脚本是否加载完成。而非 IE 浏览器可以使用 onload 来直接判断脚本是否加载完成。

    动态脚本简单示例

    一个 简单 的实现过程如下:

    // IE下:
    var HEAD = document.getElementsByTagName('head')[0] || document.documentElement
    var src = 'http://xxxxxx.com'
    var script = document.createElement('script')
    script.setAttribute('type','text/javascript')
    script.onreadystatechange = function() {
     if(this.readyState === 'loaded' || this.readyState === 'complete') {
      console.log('加载成功!')
     }
    }
    script.setAttribute('src', src)
    HEAD.appendChild(script)
    // Chrome等现代浏览器:
    var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;
    var src = 'http://xxxxxx.com'
    var script = document.createElement('script')
    script.setAttribute('type','text/javascript')
    script.onload = function() {
     console.log('加载成功!')
    }
    script.setAttribute('src', src)
    HEAD.appendChild(script)

    原理很简单,根据这两个简单的原理,我们进行一些修改,我把改成了两个函数,分别是 串行加载 和 并行加载 。

    串行和并行动态脚本

    当传一个包含多个JS文件路径的数组时,串行加载函数从第一个脚本文件加载开始,每加载成功一个便开始加载下一个脚本文件,全部加载完成后执行回调函数。而并行加载是一开始便加载全部的脚本文件,也就是他们从同一点开始加载,当全部加载完成后,执行回调函数。

    /** 
     * 串行加载指定的脚本
     * 串行加载[异步]逐个加载,每个加载完成后加载下一个
     * 全部加载完成后执行回调
     * @param {Array|String} scripts 指定要加载的脚本
     * @param {Function} callback 成功后回调的函数
     * @return {Array} 所有生成的脚本元素对象数组
     */
    function seriesLoadScripts(scripts, callback) {
     if(typeof(scripts) !== 'object') {
      var scripts = [scripts];
     }
     var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;
     var s = [];
     var last = scripts.length - 1;
     //递归
     var recursiveLoad = function(i) {
      s[i] = document.createElement('script');
      s[i].setAttribute('type','text/javascript');
      // Attach handlers for all browsers
      // 异步
      s[i].onload = s[i].onreadystatechange = function() {
       if(!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {
        this.onload = this.onreadystatechange = null; 
        this.parentNode.removeChild(this);
        if(i !== last) {
         recursiveLoad(i + 1);
        } else if (typeof(callback) === 'function') {
         callback()
        };
       }
      }
      // 同步
      s[i].setAttribute('src', scripts[i]);
      HEAD.appendChild(s[i]);
     };
     recursiveLoad(0);
    }
    /**
     * 并行加载指定的脚本
     * 并行加载[同步]同时加载,不管上个是否加载完成,直接加载全部
     * 全部加载完成后执行回调
     * @param {Array|String} scripts 指定要加载的脚本
     * @param {Function} callback 成功后回调的函数
     * @return {Array} 所有生成的脚本元素对象数组
     */ 
    function parallelLoadScripts(scripts, callback) {
     if(typeof(scripts) !== 'object') {
      var scripts = [scripts];
     }
     var HEAD = document.getElementsByTagName('head')[0] || document.documentElement;
     var s = [];
     var loaded = 0;
     for(var i = 0; i < scripts.length; i++) {
      s[i] = document.createElement('script');
      s[i].setAttribute('type','text/javascript');
      // Attach handlers for all browsers
      // 异步
      s[i].onload = s[i].onreadystatechange = function() {
       if(!/*@cc_on!@*/0 || this.readyState === 'loaded' || this.readyState === 'complete') {
        loaded++;
        this.onload = this.onreadystatechange = null;
        this.parentNode.removeChild(this);
        if(loaded === scripts.length && typeof(callback) === 'function') callback();
       }
      };
      // 同步
      s[i].setAttribute('src',scripts[i]);
      HEAD.appendChild(s[i]);
     }
    }

    在这里是把 <script> 标签动态的插入到页面中的 <head> 标签内部,并且加载完成后标签元素会被自动移除。

    使用方法

    这里声明了一个数组变量,里面包含了两个远程的JS文件地址(当然 <script> 标签调用脚本是支持跨域的):

    var scripts = [ 
     "http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js",
     "http://wellstyled.com/files/jquery.debug/jquery.debug.js"
    ];
    // 这两个文件分别是 jQuery 1.4.的库文件和 jQuery Debug 插件
    // 然后你可以使用下面的方法调用并在成功后执行回调了。
    parallelLoadScripts(scripts, function() { 
     /*
     debug = new $.debug({ 
      posTo : { x:'right', y:'bottom' },
      width: '480px',
      height: '50%',
      itempider : '<hr>',
      listDOM : 'all'
     });
     */
     console.log('脚本加载完成啦');
    });

    相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

    推荐阅读:

    easyui日期时间框在IE中的兼容性如何处理

    readline怎样逐行读取并写入内容

    以上就是脚本加载后执行JS回调函数的方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:javascript 方法 函数
    上一篇:使用Node.js做出命令行工具 下一篇:vue全局注册和局部注册使用详解
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 浅显易懂的JavaScript引入• 聊聊Angular Route中怎么提前获取数据• node.js gm是什么• 简单了解JavaScript事件的冒泡、委派、绑定和传播• 详细介绍JavaScript中Promise的基本概念及使用方法
    1/1

    PHP中文网