场景:
页面需要展示当前位置,获取当前位置,要先加载js文件,获取定位服务,然后jsp页面执行初始化,把经纬度和addressname展示到页面,由于这里加载js文件是异步的,在文件没加载成功时,就执行了初始化,导致页面初始化的时候,参数值undefind。
原因:
最后找到原因是:jQuery.getScript是异步请求,在请求执行的时间内执行下面的方法,导致定位服务的js没有加载完成,定位失败,页面显示当前位置:undefined。
解决办法:
可以用定时器解决:1.setTimeout,让页面初始化的init方法延迟几秒钟执行,等定位服务的js加载完成后再执行(不太靠谱)
2.setInterval,让初始化方法,每秒钟执行一次,直到当前位置参数不为null,就停止(clearInterval())
代码:
<script>
//动态加载js文件,引入定位服务功能
$(function () {
jQuery.getScript("https://unibase.gov.cn/DTHybirdEngine/hybridapi.js").done(function () {
jQuery.getScript("${staticPath}/static/switchPlatform/getLocation-zjzw.js").done(function () {
}).fail(function () {
$.toast("引入定位功能失败", "cancel");
});
});
</script>
<script>
//地理位置
var longitude; //经度
var latitude; //纬度
var address; //位置
var myMap; //地图
var mapInited = false;
window.onload = function(){
//每秒钟执行一次,页面参数初始化
var clock = setInterval(function () {
setT();
initData();
initMyLocationAndMap();
//当经纬度有值,说明js已经加载,定位服务已经引入,此时停止这个定时器
if (longitude&&latitude){
window.clearInterval(clock);
}
},1000);
}
</script>
getScript方法补充:
概述
通过 HTTP GET 请求载入并执行一个 JavaScript 文件。
jQuery 1.2 版本之前,getScript 只能调用同域 JS 文件。 1.2中,您可以跨域调用 JavaScript 文件。注意:Safari 2 或更早的版本不能在全局作用域中同步执行脚本。如果通过 getScript 加入脚本,请加入延时函数。
参数
url,[callback]String,FunctionV1.0
url:待载入 JS 文件地址。
callback:成功载入后回调函数。
示例
描述:
载入 <a title="http://jquery.com/plugins/project/color" class="external text" href="http://jquery.com/plugins/project/color">jQuery 官方颜色动画插件</a> 成功后绑定颜色变化动画。
HTML 代码:
<button id="go">» Run</button>
<div class="block"></div>
jQuery 代码:
jQuery.getScript("http://dev.jquery.com/view/trunk/plugins/color/jquery.color.js", function(){
$("#go").click(function(){
$(".block").animate( { backgroundColor: 'pink' }, 1000)
.animate( { backgroundColor: 'blue' }, 1000);
});
});
描述:
加载并执行 test.js。
jQuery 代码:
$.getScript("test.js");
描述:
加载并执行 test.js ,成功后显示信息。
jQuery 代码:
$.getScript("test.js", function(){
alert("Script loaded and executed.");
}