在Web前端开辟中,常常须要用ajax从背景猎取动态数据,因而<script></script>不能写死,而要动态加载js。
题目形貌:练习时期在做一个需求的过程当中遇到须要从背景动态到场js的题目。
起首,我给出的处理方案是:
<script class="url1">
$.ajax({
type: "GET",
data: {captchaType:1},
url: "url_demo",
dataType: "jsonp",
jsonp: "callback",
success: function(json) {
if(json.code == 0){
url_1 = json.url;
$(".url1").attr("src",url_1);
}
},
error: function() {
}
});
</script>
个中向url_demo发送http请求,返回一个json串,个中包含我们想要的url,这里的url是一段js,猎取url后赋值给<script>的src属性。
这里存在的题目是:猎取到的url虽然胜利赋给了src属性,但js剧本并未将资本加载,致使失足。剖析了下,发明是因为只要在<script>…</script>内部嵌入了一段剧本今后,就不能修正其属性值了。因而不能采用上述要领来动态加载js。
处理方案可修正为:
<script class="url1"></script>
<script>
$.ajax({
type: "GET",
data: {captchaType:1},
url: "url_demo",
dataType: "jsonp",
jsonp: "callback",
success: function(json) {
if(json.code == 0){
url_1 = json.url;
$(".url1").attr("src",url_1);
}
},
error: function() {
}
});
</script>
也就是零丁拎一个<script></script>,内里不加任何js代码,然后用别的的<script></script>编写js剧本前一个<script></script>的src属性举行修正,到达页面动态到场js的请求。
厥后导师说上面的做法有点low,而且“极具创造力”(不过发明了一个题目然后处理了,照样不错滴),就要我去找loadjs的通例要领,这里借用一下玉伯seajs里的loadJs要领,进修一下大神的写法:
function loadJs(url , callback){
var node = document.createElement("script");
node[window.addEventListener ? "onload":"onreadystatechange"] = function(){
if(window.addEventListener || /loaded|complete/i.test(node.readyState)){
callback();
node.onreadystatechange = null;
}
}
node.onerror = function(){};
node.src = url;
var head = document.getElementsByTagName("head")[0];
head.insertBefore(node,head.firstChild);
}
用法以下:
$(function(){
$.ajax({
type: "GET",
data: {captchaType:1},
url: "demo_url",
dataType: "jsonp",
jsonp: "callback"
}).done(function(json){
if (json.code == 0) {
//参数url和回调函数
loadJs(json.url, fCb);
}
});
function fCb(){
//回调函数,第一次须要用到上述url对应js剧本的函数
init("container1", "point");
}
})
好啦,照样看的、学的太少了,今后要多看大牛的写法,只要看得多了,才不会一头钻进死胡同里。