Delay callback until script is added to document?

后端 未结 4 2169
名媛妹妹
名媛妹妹 2021-01-05 00:08

How can I get the callback to not run until the script is actually appended to the document?

function addScript(filepath, callback){
    if (filepath) {
             


        
相关标签:
4条回答
  • 2021-01-05 00:27

    This tiny script / css loader will do the job https://github.com/rgrove/lazyload/

    LazyLoad.js('/foo.js', function () {
      alert('foo.js has been loaded');
    });
    
    0 讨论(0)
  • 2021-01-05 00:29

    what about:

    var myParticularCallback = function () {
        // do something neat ...
    }
    
    ..... your code  
    
    var fileref = document.createElement('script');
    fileref.setAttribute("type","text/javascript");
    
    fileref.onload = myParticularCallback;
    
    if (typeof fileref!="undefined")
        document.getElementsByTagName("head")[0].appendChild(fileref);
    
     // after all has set, laod the script and wait for onload event:
    fileref.setAttribute("src", filepath);
    
    0 讨论(0)
  • 2021-01-05 00:35

    In the ideal world, you could use the onload property of the <script /> tag;

    function addScript(filepath, callback){
        if (filepath) {
            var fileref = document.createElement('script');
    
            fileref.onload = callback;
    
            fileref.setAttribute("type","text/javascript");
            fileref.setAttribute("src", filepath);
    
            if (typeof fileref!="undefined")
                document.getElementsByTagName("head")[0].appendChild(fileref);
        }
    }
    

    However, this doesn't work in IE, so mega-h4x are required;

      function addScript(filepath, callback) {
          if (filepath) {
              var fileref = document.createElement('script');
              var done = false;
              var head = document.getElementsByTagName("head")[0];
    
              fileref.onload = fileref.onreadystatechange = function () {
                  if (!done && (!this.readyState || this.readyState === "loaded" || this.readyState === "complete")) {
                      done = true;
    
                      callback();
    
                      // Handle memory leak in IE
                      fileref.onload = fileref.onreadystatechange = null;
                      if (head && fileref.parentNode) {
                          head.removeChild(fileref);
                      }
                  }
              };
    
              fileref.setAttribute("type", "text/javascript");
              fileref.setAttribute("src", filepath);
    
              head.appendChild(fileref);
          }
      }
    

    FWIW, your if (typeof fileref != "undefined") was redundant, as it will always evaluate to true, so you can just do head.appendChild(fileref); directly, as in my example.

    0 讨论(0)
  • 2021-01-05 00:43

    Easiest way will be define some visible callback() function which will run in your dynamicly included script, at the end.

    0 讨论(0)
提交回复
热议问题