在DOM加载之前insertScript
起因
由于工作原因需要联调碧桂园的SDK 大概是以下代码,起初我是放在head中的,因为最初这样调试,包括线上环境都是OK的,可以获取到SDK的内容,换句话说js节点是可以插入到root内的,自从换了一套webpack4的构建、包括加快DNS速度、包括asyncScript标签之后,发现这个插入语句不起作用了,这个事情很神奇。
<script>
var agent = navigator.userAgent.toLowerCase();
//平台、设备和操作系统
var system ={
win : false,
mac : false,
xll : false
};
//检测平台
var p = navigator.platform;
system.win = p.indexOf("Win") == 0;
system.mac = p.indexOf("Mac") == 0;
system.x11 = (p == "X11") || (p.indexOf("Linux") == 0);
function appendScript (url) {
var script=document.createElement("script");
script.setAttribute("src", url);
var heads = document.getElementById("root");
heads.appendChild(script)
}
//跳转语句,如果是手机访问就自动跳转到caibaojian.com页面
if(system.win||system.mac||system.xll){
} else if (agent.match(/MicroMessenger/i) == "micromessenger") {
} else if (/iPad|iPhone|iPod/.test(navigator.userAgent)) {
console.log('iOS')
appendScript('https://biheopen.bgycc.com/jssdk.js')
appendScript('https://biheopen.bgycc.com/cordova-ios.js')
} else {
console.log('android')
appendScript('https://biheopen.bgycc.com/jssdk.js')
appendScript("https://biheopen.bgycc.com/cordova-android.js")
}
</script>
昨天下午发现的,直到今天早上我调了一下这个问题,总结一下。
这段语句不能写在</body>之前,因为webpack的原因main script也会在</body>之前插入,但是我们希望的是他在main script之前加载,但是这句话appendScript 会让浏览器异步加载script 内容,这样我们就不能保证是main script先加载还是jssdk先加载了。
解决办法
在head中另加一个script片段,把js放在DOMContentLoaded中做处理,这样的话它会在load main script之前去做load jssdk标签,并且是一个同步加载的过程
<script>
if ('addEventListener' in document) {
document.addEventListener('DOMContentLoaded', function() {
// 插入
......
}, false);
}
</script>
当然还有其他方式解决这个问题这里就不做深究。
在DOM加载之前insertScript的更多相关文章
- DOM加载过程中ready和load的区别
在浏览器地址栏输入URL地址,浏览器开始加载页面时,有以下几个过程 1.浏览器开始解析HTML文档 2. 浏览器遇到HTML文档中的<script>元素以及CSS样式文件,并且没有asyn ...
- jQuery实现DOM加载方法源码分析
传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... } 但 ...
- DOM加载:浏览器渲染和操作顺序(转载 学习中。。。)
DOM加载:浏览器渲染和操作顺序 1.HTML解析完毕 2.外部脚本和样式表加载完毕 3.脚本在文档内解析并执行 4.HTML DOM完全构造起来 5.图片和外部内容加载 6.网页完成加载 基于这个顺 ...
- jquery源码 DOM加载
jQuery版本:2.0.3 DOM加载有关的扩展 isReady:DOM是否加载完(内部使用) readyWait:等待多少文件的计数器(内部使用) holdReady():推迟DOM触发 read ...
- 【Dojo 1.x】笔记3 等待DOM加载完成
有的web页面总是得等DOM加载完成才能继续执行功能,例如,待页面DOM加载完成后,才能在DIV上进行渲染图形. Dojo提供了这个功能的模块,叫domReady,但是由于它很特殊,就在结尾加了个叹号 ...
- jQuery学习(监听DOM加载)
jQuery的extend方法 function njQuery() { } /* njQuery.extend = function (obj) { // 此时此刻的this就是njQuery这个类 ...
- js实现类型jq的dom加载完成
有时候我们只想在 dom 加载完成后运行 js ,而不是等所有图片加载完成.所以不需要 onload , onload 会加载图片等其他媒体.很消耗时间. 原:http://blog.csdn.net ...
- 原生JS实现AJAX、JSONP及DOM加载完成事件,并提供对应方法
JS原生AJAX ajax:一种请求数据的方式,不需要刷新整个页面: ajax的技术核心是 XMLHttpRequest 对象: ajax 请求过程:创建 XMLHttpRequest 对象.连接服务 ...
- 原生JS实现AJAX、JSONP及DOM加载完成事件
一.JS原生Ajax ajax:一种请求数据的方式,不需要刷新整个页面:ajax的技术核心是 XMLHttpRequest 对象:ajax 请求过程:创建 XMLHttpRequest 对象.连接服务 ...
随机推荐
- 这可能是最为详细的Docker入门吐血总结
这可能是最为详细的Docker入门吐血总结 https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...
- linux串口编程设置(转载)
(转载)在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串 ...
- SQL随记(一)
1.关于define表示定义 2.sql%rowcount用于记录修改的条数,必须放在一个CUD语句后面执行,无法在select中使用. 3.两种调用过程的关键字:exec和call 两者区别: (1 ...
- redis远程连接报错记录
错误如下 redis可视化工具连接测试 telnet ip 6379 修改关键参数如下 #开通外网访问 # bind 127.0.0.1 #以后台方式运行 daemonize no #取消保护模式,保 ...
- 时间序列函数resamlpe详解
resample与groupby的区别:resample:在给定的时间单位内重取样groupby:对给定的数据条目进行统计 函数原型:DataFrame.resample(rule, how=None ...
- 解压unzip的用法
1.把文件解压到当前目录下 [root@instance-q6z0ksfb xmerge_test]# unzip db1.zip 2.把文件解压到指定的目录下,需要用到-d参数. unzip -d ...
- SpringBoot实战——微信点餐系统
1.初始化项目 引入模块 <dependencies> <dependency> <groupId>org.springframework.boot</gro ...
- Django组件-分页器
Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views here ...
- 第一周——数据分析之表示 —— Numpy 数据存取与函数
数据的CSV文件的存取 CSV文件:CSV (Comma‐Separated Value, 逗号分隔值) CSV是一种常见的文件格式,用来存储批量数据 np.savetxt(frame, array, ...
- Gradle part1 HelloWorld
(https://spring.io/guides/gs/gradle/#scratch) ----gradle helloworld----- 1.下载后安装 Unzip the file to y ...