100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 利用JS脚本加载后如何实现能执行相应回调函数

利用JS脚本加载后如何实现能执行相应回调函数

时间:2021-02-09 11:03:06

相关推荐

利用JS脚本加载后如何实现能执行相应回调函数

web前端|js教程

javascript,实现,如何

web前端-js教程

本文主要讲解怎么在成功加载 js 文件后再执行相应回调任务,对JS脚本加载后执行相应回调函数的操作方法感兴趣的朋友,通过本文学习下吧

大淘客网站源码修改,vscode代码字体模糊,win 平板 ubuntu,怎么tomcat启动不了,scrapy图书爬虫,php图片列表,樟木头镇seo优化推广,网站上传不了附件,网站模板源代码压缩包lzw

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

购物分销平台源码下载,黑莓手机装Ubuntu,爬虫医院电子病历,php能在tom,seo截流系统lzw

基本思路

html网页源码大全,ubuntu 8723ae,steam 爬虫 集换卡,php $zsptb,seo博客 福州lzw

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

动态脚本简单示例

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

// IE下:var HEAD = document.getElementsByTagName(head)[0] || document.documentElementvar src = \var script = document.createElement(script)script.setAttribute( ype, ext/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 = \var script = document.createElement(script)script.setAttribute( ype, ext/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( ype, ext/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( ype, ext/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]); }}

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

使用方法

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

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

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

vue的mixins属性详解

vue2.0模拟锚点的实例

Vue使用mixins实现压缩图片代码

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。