Javascript异步加载js文件并实例化对象

时间:2015-05-06 04:10:31

标签: javascript html5 iframe asynchronous

我正在尝试从另一个javascript文件追加一个脚本,我已经关注非阻塞异步脚本加载http://calendar.perfplanet.com/2012/the-non-blocking-script-loader-pattern我已经能够加载外部脚本但是我无法实例化一个对象第二个js文件,这里是代码:

    (function(url, callback){
       var dom,doc,where,iframe = document.createElement('iframe');
       iframe.src = "javascript:false";
       iframe.id = 'iframeTest';
       (iframe.frameElement || iframe).style.cssText = "border: 0px; z-       index: 50; position: fixed; height: 290px; width: 225px; right: 0px; bottom: 0px;";
       where = document.getElementsByTagName('script');
       where = where[where.length - 1];
       where.parentNode.insertBefore(iframe, where);
       try { 
         doc = iframe.contentWindow.document;
        } catch(e) {
           dom = document.domain;
           iframe.src="javascript:var d=document.open();d.domain='"+dom+"';void(0);";
           doc = iframe.contentWindow.document;
        }
        doc.open()._l = function() {
            var head =                  document.getElementById('iframeTest').contentWindow.document.getElementsByTagName('head')[0];
            var script = document.createElement('script');
            script.type = 'text/javascript';
            script.src = url;
            script.onload = callback;
            head.appendChild(script);           
        }
        doc.write('<body onload="document._l();">');
        doc.close();
     })
     ('http://localhost/js/chat.js', function() { var cb  = new Chatbox('6'); cb.init();} ); 

在我试图加载的chat.js文件中:

      function Chatbox(orgId)
      {
         this.orgId = orgId;
      }
      Chatbox.prototype.constructor = Chatbox;

      Chatbox.prototype.init = function() {
          this.getStatus();
      };
      .....................................

当我尝试加载页面时,我最终收到错误消息“未捕获的ReferenceError:Chatbox未定义&#39;”。我知道这里有类似的问题但是找不到在第二个文件中实例化对象的解决方案,尽管如果它不是异步的话它可以工作。希望我很清楚,任何帮助都将受到高度赞赏。在此先感谢!

1 个答案:

答案 0 :(得分:1)

只要在同一个域上,您就可以访问iframe的对象。否则你不能。

document.getElementById('youriframe').contentWindow.cb 

您将如何访问它。您始终可以在iframe中运行代码。您可以将其附加到当前窗口并访问它