Dynamically load a JavaScript file

后端 未结 28 3002
说谎
说谎 2020-11-22 06:56

How can you reliably and dynamically load a JavaScript file? This will can be used to implement a module or component that when \'initialized\' the component will dynamical

相关标签:
28条回答
  • 2020-11-22 07:35

    another awesome answer

    $.getScript("my_lovely_script.js", function(){
    
    
       alert("Script loaded and executed.");
      // here you can use anything you defined in the loaded script
    
     });
    

    https://stackoverflow.com/a/950146/671046

    0 讨论(0)
  • 2020-11-22 07:36

    Here is some example code I've found... does anyone have a better way?

      function include(url)
      {
        var s = document.createElement("script");
        s.setAttribute("type", "text/javascript");
        s.setAttribute("src", url);
        var nodes = document.getElementsByTagName("*");
        var node = nodes[nodes.length -1].parentNode;
        node.appendChild(s);
      }
    
    0 讨论(0)
  • 2020-11-22 07:36

    With Promises you can simplify it like this. Loader function:

      const loadCDN = src =>
        new Promise((resolve, reject) => {
          if (document.querySelector(`head > script[src="${src}"]`) !== null) return resolve()
          const script = document.createElement("script")
          script.src = src
          script.async = true
          document.head.appendChild(script)
          script.onload = resolve
          script.onerror = reject
        })
    

    Usage (async/await):

    await loadCDN("https://.../script.js")
    

    Usage (Promise):

    loadCDN("https://.../script.js").then(res => {}).catch(err => {})
    

    NOTE: there was one similar solution but it doesn't check if the script is already loaded and loads the script each time. This one checks src property.

    0 讨论(0)
  • 2020-11-22 07:39

    does anyone have a better way?

    I think just adding the script to the body would be easier then adding it to the last node on the page. How about this:

    function include(url) {
      var s = document.createElement("script");
      s.setAttribute("type", "text/javascript");
      s.setAttribute("src", url);
      document.body.appendChild(s);
    }
    
    0 讨论(0)
  • 2020-11-22 07:39

    Just found out about a great feature in YUI 3 (at the time of writing available in preview release). You can easily insert dependencies to YUI libraries and to "external" modules (what you are looking for) without too much code: YUI Loader.

    It also answers your second question regarding the function being called as soon as the external module is loaded.

    Example:

    YUI({
        modules: {
            'simple': {
                fullpath: "http://example.com/public/js/simple.js"
            },
            'complicated': {
                fullpath: "http://example.com/public/js/complicated.js"
                requires: ['simple']  // <-- dependency to 'simple' module
            }
        },
        timeout: 10000
    }).use('complicated', function(Y, result) {
        // called as soon as 'complicated' is loaded
        if (!result.success) {
            // loading failed, or timeout
            handleError(result.msg);
        } else {
            // call a function that needs 'complicated'
            doSomethingComplicated(...);
        }
    });
    

    Worked perfectly for me and has the advantage of managing dependencies. Refer to the YUI documentation for an example with YUI 2 calendar.

    0 讨论(0)
  • 2020-11-22 07:40

    The technique we use at work is to request the javascript file using an AJAX request and then eval() the return. If you're using the prototype library, they support this functionality in their Ajax.Request call.

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