动态加载js

在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");
        }
})

好啦,照样看的、学的太少了,今后要多看大牛的写法,只要看得多了,才不会一头钻进死胡同里。

    原文作者:juno
    原文地址: https://segmentfault.com/a/1190000006752529
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞