博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于动态加载外部js的执行顺序
阅读量:6892 次
发布时间:2019-06-27

本文共 2134 字,大约阅读时间需要 7 分钟。

项目开发中提出了一个新的需求。

因为版本更新带来的html、js等的更新,但客户浏览器或多或少都会存在缓存问题。

这就需要根据版本信息去动态加载外部js。

但html中内置的一些javascript代码需要调用动态加载js中的参数和方法。

就导致了加载外部js必须阻塞内置的一些javascript代码。

利用document.createElement方法去创建scrip节点,但不能阻塞内置的javascript代码。

在W3help里找到了解决方法。

这里只截取解决方法的代码,还有很多测试加载顺序的代码就不贴出来了。可以参考

function loadJS(url, success) {
var domScript = document.createElement('script'); domScript.src = url; success = success || function(){}; domScript.onload = domScript.onreadystatechange = function() {
if (!this.readyState || 'loaded' === this.readyState || 'complete' === this.readyState) {
success(); this.onload = this.onreadystatechange = null; this.parentNode.removeChild(this); } } document.getElementsByTagName('head')[0].appendChild(domScript); } //执行加载外部 JS 文件,从a.js开始执行加载。 loadJS('a.js',function (){
loadJS('b.js',function (){
loadJS('c.js',function (){
alert('ok'); }); }); });

通过进一步了解onload和onreadystatechange,发现IE9/10同时支持script元素的onload和onreadystatechange事件。

所以上面的代码在IE9/10中会执行两次if中的代码。

替换方法就是写成

 

function loadJS(url, success) {
var domScript = document.createElement('script'); domScript.src = url; success = success || function(){}; //domScript.onload = domScript.onreadystatechange = function() {
if(navigator.userAgent.indexOf("MSIE")>0){
domScript.onreadystatechange = function(){
if('loaded' === this.readyState || 'complete' === this.readyState){
success(); this.onload = this.onreadystatechange = null; this.parentNode.removeChild(this); } } }else{
domScript.onload = function(){
success(); this.onload = this.onreadystatechange = null; this.parentNode.removeChild(this); } } document.getElementsByTagName('head')[0].appendChild(domScript); } //执行加载外部 JS 文件,从a.js开始执行加载。 loadJS('a.js',function (){
loadJS('b.js',function (){
loadJS('c.js',function (){
alert('ok'); }); }); });

转载于:https://www.cnblogs.com/connie1120/archive/2012/03/19/2406274.html

你可能感兴趣的文章
定义中国网络安全市场战略高度,绿盟科技为“互联网+”保驾护航
查看>>
python 自定义 包 模块 打包 安装
查看>>
ubuntu桌面的标题栏和启动栏消失问题[亲测可用]
查看>>
Cloud technology in today's job market
查看>>
3月31日云栖精选夜读:数据科学咨询:想要转型毫无头绪?看了本文你不慌
查看>>
程序猿日记S01E03
查看>>
如何解决域名解析不生效问题?
查看>>
Android开发者指南(9) —— ProGuard
查看>>
MySQL · 答疑解惑 · 物理备份死锁分析
查看>>
字符串指针修改问题
查看>>
JavaScript权威设计--跨域,XMLHttpRequest(简要学习笔记十九)
查看>>
跨入流式计算时代,用不着洪荒之力——在阿里云容器服务上一键部署JStorm
查看>>
通过JCONSOLE监控TOMCAT的JVM使用情况
查看>>
jquery editable plugin--点击编辑文字插件
查看>>
[Java] TreeMap、HashMap、LindedHashMap的区别
查看>>
javascript 常用自定义方法
查看>>
MariaDB · 新特性 · 窗口函数
查看>>
thinkphp 3.2分布式数据库读写分离扩展阅读
查看>>
iOS流布局UICollectionView系列二——UICollectionView的代理方法
查看>>
mac 配置jdk1.8(小白教程)
查看>>