Loading scripts after page load?

后端 未结 7 1487
粉色の甜心
粉色の甜心 2020-11-27 15:16

I work with an advertising company, where we tag certain pages to track activity. A client of mine wants to fire off a javascript tag to track activity AFTER the page has fi

相关标签:
7条回答
  • 2020-11-27 15:28

    http://jsfiddle.net/c725wcn9/2/embedded

    You will need to inspect the DOM to check this works. Jquery is needed.

    $(document).ready(function(){
       var el = document.createElement('script');
       el.type = 'application/ld+json';
       el.text = JSON.stringify({ "@context": "http://schema.org",  "@type": "Recipe", "name": "My recipe name" });
    
       document.querySelector('head').appendChild(el);
    });
    
    0 讨论(0)
  • 2020-11-27 15:29

    So, there's no way that this works:

    window.onload = function(){
      <script language="JavaScript" src="http://jact.atdmt.com/jaction/JavaScriptTest"></script>
    };
    

    You can't freely drop HTML into the middle of javascript.


    If you have jQuery, you can just use:

    $.getScript("http://jact.atdmt.com/jaction/JavaScriptTest")
    

    whenever you want. If you want to make sure the document has finished loading, you can do this:

    $(document).ready(function() {
        $.getScript("http://jact.atdmt.com/jaction/JavaScriptTest");
    });
    

    In plain javascript, you can load a script dynamically at any time you want to like this:

    var tag = document.createElement("script");
    tag.src = "http://jact.atdmt.com/jaction/JavaScriptTest";
    document.getElementsByTagName("head")[0].appendChild(tag);
    
    0 讨论(0)
  • 2020-11-27 15:29

    Focusing on one of the accepted answer's jQuery solutions, $.getScript() is an .ajax() request in disguise. It allows to execute other function on success by adding a second parameter:

    $.getScript(url, function() {console.log('loaded script!')})
    

    Or on the request's handlers themselves, i.e. success (.done() - script was loaded) or failure (.fail()):

    $.getScript(
        "https://code.jquery.com/color/jquery.color.js",
        () => console.log('loaded script!')
      ).done((script,textStatus ) => {
        console.log( textStatus );
        $(".block").animate({backgroundColor: "green"}, 1000);
      }).fail(( jqxhr, settings, exception ) => {
        console.log(exception + ': ' + jqxhr.status);
      }
    );
    .block {background-color: blue;width: 50vw;height: 50vh;margin: 1rem;}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="block"></div>

    0 讨论(0)
  • 2020-11-27 15:36

    For a Progressive Web App I wrote a script to easily load javascript files async on demand. Scripts are only loaded once. So you can call loadScript as often as you want for the same file. It wouldn't be loaded twice. This script requires JQuery to work.

    For example:

    loadScript("js/myscript.js").then(function(){
        // Do whatever you want to do after script load
    });
    

    or when used in an async function:

    await loadScript("js/myscript.js");
    // Do whatever you want to do after script load
    

    In your case you may execute this after document ready:

    $(document).ready(async function() {
        await loadScript("js/myscript.js");
        // Do whatever you want to do after script is ready
    });
    

    Function for loadScript:

    function loadScript(src) {
      return new Promise(function (resolve, reject) {
        if ($("script[src='" + src + "']").length === 0) {
            var script = document.createElement('script');
            script.onload = function () {
                resolve();
            };
            script.onerror = function () {
                reject();
            };
            script.src = src;
            document.body.appendChild(script);
        } else {
            resolve();
        }
    });
    }
    

    Benefit of this way:

    • It uses browser cache
    • You can load the script file when a user performs an action which needs the script instead loading it always.
    0 讨论(0)
  • 2020-11-27 15:38

    The second approach is right to execute JavaScript code after the page has finished loading - but you don't actually execute JavaScript code there, you inserted plain HTML.
    The first thing works, but loads the JavaScript immediately and clears the page (so your tag will be there - but nothing else).
    (Plus: language="javascript" has been deprecated for years, use type="text/javascript" instead!)

    To get that working, you have to use the DOM manipulating methods included in JavaScript. Basically you'll need something like this:

    var scriptElement=document.createElement('script');
    scriptElement.type = 'text/javascript';
    scriptElement.src = filename;
    document.head.appendChild(scriptElement);
    
    0 讨论(0)
  • 2020-11-27 15:44

    Here is a code I am using and which is working for me.

    window.onload = function(){
        setTimeout(function(){
            var scriptElement=document.createElement('script');
            scriptElement.type = 'text/javascript';
            scriptElement.src = "vendor/js/jquery.min.js";
            document.head.appendChild(scriptElement);
    
            setTimeout(function() {
                var scriptElement1=document.createElement('script');
                scriptElement1.type = 'text/javascript';
                scriptElement1.src = "gallery/js/lc_lightbox.lite.min.js";
                document.head.appendChild(scriptElement1);
            }, 100);
            setTimeout(function() {
                $(document).ready(function(e){
                    lc_lightbox('.elem', {
                        wrap_class: 'lcl_fade_oc',
                        gallery : true, 
                        thumb_attr: 'data-lcl-thumb', 
                        slideshow_time  : 3000,
                        skin: 'minimal',
                        radius: 0,
                        padding : 0,
                        border_w: 0,
                    }); 
                });
            }, 200);
    
        }, 150);
    };
    
    0 讨论(0)
提交回复
热议问题