加载脚本(如果尚未加载),然后使用它们

时间:2017-07-24 00:03:14

标签: javascript jquery onload

如果尚未加载,我想加载4个javascript库。然后,我想使用他们的功能。

我的问题是我得到了Uncaught ReferenceError: sbjs is not defined,脚本被加载但我实际上无法使用它们。

如果它们尚未加载,我可以将它添加到</body>标记上方的脚本,但我似乎无法让它们工作。

这是我的代码:

<script>
    window.onload = myapp_scripts;

    function myapp_scripts () {
      var myapp_script;

      if (!window.jQuery) {
        myapp_script = document.createElement('script');
        document.body.appendChild(myapp_script);
        myapp_script.src = 'http://myapp.dev/js/jquery.min.js';
        console.log('load jquery');
      }
      if (!window.Cookies) {
        myapp_script = document.createElement('script');
        document.body.appendChild(myapp_script);
        myapp_script.src = 'http://myapp.dev/js/cookie.min.js';
        console.log('load cookies');
      }
      if (typeof url == 'undefined') {
        myapp_script = document.createElement('script');
        document.body.appendChild(myapp_script);
        myapp_script.src = 'http://myapp.dev/js/url.min.js';
        console.log('load url');
      }
      if (typeof sbjs == 'undefined') {
        myapp_script = document.createElement('script');
        document.body.appendChild(myapp_script);
        myapp_script.src = 'http://myapp.dev/js/sourcebuster.min.js';
        console.log('load sbjs');
      }

      myapp_init();
    }

    function myapp_init () {
        sbjs.init();

        console.log(Cookies.get('source_id'));
        console.log(url('source_id'));
        console.log(sbjs.get.current);

        $('#myapp_form').submit(function (event) {
            event.preventDefault();
            console.log('form submitted');
        });
    }
</script>

我如何制作它以便我也可以使用动态加载的脚本?

1 个答案:

答案 0 :(得分:0)

我认为你的问题是因为myapp_init()是在加载脚本之前执行的 您需要管理脚本加载事件并在调用myapp_init()

之后

在每个if()条件中都有这样的内容:

var myapp_script;

var scripts_loaded = 0;

  if (!window.jQuery) {
    myapp_script = document.createElement('script');
    document.body.appendChild(myapp_script);
    myapp_script.src = 'http://myapp.dev/js/jquery.min.js';
    console.log('load jquery');

    myapp_script.onload = function(){
        scripts_loaded ++;
        if(scripts_loaded === 4){ //4 because in your example you have 4 scripts to load
           myapp_init();
        }  
    }

  }else{
     scripts_loaded ++;
  }
//...
//And so on with others if conditions

这不是一个优雅的解决方案,但只是一个想法:以某种方式检查所有脚本是否已加载,并在调用之后调用myapp_init();