Asynchronous Script Loading Callback

前端 未结 3 1222
醉话见心
醉话见心 2020-11-30 02:33

http://jsfiddle.net/JamesKyle/HQDu6/

I\'ve created a short function based on Mathias Bynens Optimization of the Google Analytics asynchr

3条回答
  •  一生所求
    2020-11-30 03:10

    A more recent snippet:

    async function loadAsync(src) {
        const script = document.createElement('script');
        script.src = src;
        return new Promise((resolve, reject) => {
            script.onreadystatechange = function () {
                if (script.readyState === 'loaded' || script.readyState === 'complete') {
                    script.onreadystatechange = null;
                    resolve(true);
                }
            };
            document.getElementsByTagName('head')[0].appendChild(script);
        });
    }
    

    utilisation

      loadAsync(`https://....js`).then(_ => {
        //  ... script loaded here
      })
    

    James Kyle's answer doesn't take IE9 into account. Here is a modified version of the code I found in the link proposed in the comments. Modify the var baseUrl so it can find the script accordingly.

    //for requiring a script loaded asynchronously.
    function loadAsync(src, callback, relative){
        var baseUrl = "/resources/script/";
        var script = document.createElement('script');
        if(relative === true){
            script.src = baseUrl + src;  
        }else{
            script.src = src; 
        }
    
        if(callback !== null){
            if (script.readyState) { // IE, incl. IE9
                script.onreadystatechange = function() {
                    if (script.readyState === "loaded" || script.readyState === "complete") {
                        script.onreadystatechange = null;
                        callback();
                    }
                };
            } else {
                script.onload = function() { // Other browsers
                    callback();
                };
            }
        }
        document.getElementsByTagName('head')[0].appendChild(script);
    }
    

    utilisation:

    loadAsync('https://www.gstatic.com/charts/loader.js' , function(){
        chart.loadCharts();
        });
    // OR relative path
    loadAsync('fastclick.js', null, true);
    

提交回复
热议问题