【问题标题】:how to invoke a dynamically loaded javascript function如何调用动态加载的javascript函数
【发布时间】:2010-11-14 06:04:25
【问题描述】:

我正在实现一个基于 jquery 的 getscript 的按需脚本控制器,它看起来像这样:

function controller = function(){

   var script = function(){
      var scripts = {};
      return {
        load: function(jsurl){
          $.getScript(jsurl, null);
        },
        run: function(js){
          window[js].apply(this,null);
        }
      }
   };

  return {
    script: script()
  };

}

var ctlr = controller();

那么这里是一个远程脚本,其中包含一个要加载的函数——remote.js

function remotefunc(){
  alert( 'remotefunc invoked' );
}

在主脚本中,这是整个事情应该如何工作的:

ctlr.script.load( 'remote.js' ); // remote script successfully loaded
ctlr.script.run( 'remotefunc' ); // got an error, window['remotefunc'] undefined

但正如您所见,“remotefunc”是在全局“窗口”范围内定义的,因此窗口对象应该能够“看到”它。

我认为问题可能是“控制器”定义中的闭包,所以我直接 $.getScirpt 不使用“控制器”:

$.getScript( 'http://path/to/remote.js', function(){
  window['remotefunc'].apply( this, null );  // this worked
} );

奇怪。所以它是关于“控制器”的实现(我需要它)!有人可以帮我解决这个问题吗?如何修复“控制器”实现,以便

 window[js].apply(this,null);

真的可以吗?

谢谢。

【问题讨论】:

    标签: javascript jquery scope closures


    【解决方案1】:

    它告诉您 window['remotefunc'] 未定义的原因是因为在尝试调用其中定义的函数之前,您没有给它时间实际下载和执行远程脚本。

    远程脚本是异步加载的,这意味着脚本执行在等待响应时不会暂停。

    您将需要重新实现 getScript 方法以实现同步,或者以某种方式使您的类解决该函数在任何确定的时间内都不可用的事实。

    编辑:刚刚找到另一个可能的解决方案,请尝试在您的请求之前调用它

    $.ajaxSetup({async: false});
    

    这将使 getScript 方法同步

    【讨论】:

    • 我不会让方法同步。异步执行的全部意义在于执行不会阻塞网络延迟。
    • @Kane:谢谢!将您的代码放在 $.getScript 之前,问题仍然存在
    【解决方案2】:

    使用getSript 之类的内容时,请务必记住它是异步获取。意思是,浏览器会触发请求,并且在发生这种情况时,该行之后的代码会不间断地执行。

    jQuery提供了一个回调函数参数来获取脚本,允许你在异步获取完成后做一些事情。

    试试这个:

     var script = function(){
          var scripts = {};
          return {
               load: function(jsurl, callback){
                    $.getScript(jsurl, callback);
               },
               run: function(js){
                    window[js].apply(this,null);
               }
         }
     };
    

    那么,在使用的时候:

     ctlr.load( 'remote.js', function(){
          // remote script successfully loaded
          ctlr.run( 'remotefunc' ); 
     }); 
    

    【讨论】:

      【解决方案3】:

      这可能是时间问题吗?

      在您的工作示例中,您在回调中调用该函数,jQuery 在加载脚本之前不会调用该函数。在您的非工作示例中,您在异步加载脚本的getScript 之后立即调用该函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 2011-04-15
        • 1970-01-01
        相关资源
        最近更新 更多