      1 /**
      2  * Hilo
      3  * Copyright 2015 alibaba.com
      4  * Licensed under the MIT License
      5  */
      6
      7 /**
      8  * @private
      9  * @class javascript or JSONP loader
     10  * @module hilo/loader/ScriptLoader
     11  * @requires hilo/core/Class
     12  */
     13 var ScriptLoader = Class.create({
     14     load: function(data){
     15         var me = this, src = data.src, isJSONP = data.type == 'jsonp';
     16
     17         if(isJSONP){
     18             var callbackName = data.callbackName || 'callback';
     19             var callback = data.callback || 'jsonp' + (++ScriptLoader._count);
     20             var win = window;
     21
     22             if(!win[callback]){
     23                 win[callback] = function(result){
     24                     delete win[callback];
     25                 };
     26             }
     27
     28             src += (src.indexOf('?') == -1 ? '?' : '&') + callbackName + '=' + callback;
     29         }
     30
     31         if(data.noCache) src += (src.indexOf('?') == -1 ? '?' : '&') + 't=' + (+new Date());
     32
     33         var script = document.createElement('script');
     34         script.type = 'text/javascript';
     35         script.async = true;
     36         script.onload = me.onLoad.bind(me);
     37         script.onerror = me.onError.bind(me);
     38         script.src = src;
     39         if(data.id) script.id = data.id;
     40         document.getElementsByTagName('head')[0].appendChild(script);
     41     },
     42
     43     onLoad: function(e){
     44         var script = e.target;
     45         script.onload = script.onerror = null;
     46         return script;
     47     },
     48
     49     onError: function(e){
     50         var script = e.target;
     51         script.onload = script.onerror = null;
     52         return e;
     53     },
     54
     55     Statics: {
     56         _count: 0
     57     }
     58
     59 });