延迟加载外部Javascript文件

时间:2009-01-09 10:21:07

标签: javascript metaprogramming

我正在尝试编写一个javascript类,在需要时加载脚本文件。我有大部分工作。可以使用具有以下语法的库:

var scriptResource = new ScriptResource('location/of/my/script.js');
scriptResource.call('methodName', arg1, arg2);

我想添加一些额外的语法糖,以便你可以写

var scriptResource = new ScriptResource('location/of/my/script.js');
scriptResource.methodName(arg1, arg2);

我几乎可以肯定这是不可能的,但可能有创造性的解决方案。我想有什么需要的是某种methodCall事件。以下可能有效

ScriptResource = function(scriptLocation)
{
    this.onMethodCall = function(methodName)
    {
        this.call(arguments);
    }
}

这段代码显然非常不完整,但我希望它能让我知道我想要做什么

这样的东西是否可能远程?

3 个答案:

答案 0 :(得分:3)

Firefox中有一种非标准方法,__ noSuchMethod__可以满足您的需求 看看 https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/noSuchMethod

所以你可以定义

obj.__noSuchMethod__ = function( id, args ) {
    this[id].apply( this, args );
}

答案 1 :(得分:0)

如果方法名称集有限,那么您可以生成这些方法:

var methods = ["foo", "bar", "baz"];
for (var i=0; i<methods.length; i++) {
    var method_name = methods[i];
    WildCardMethodHandler[method_name] = function () {
        this.handleAllMethods(method_name);
    };
}

编辑:在问题发生重大变化之前发布此答案。

答案 2 :(得分:0)

中间解决方案可能是具有以下语法:

var extObj = ScriptResource('location/of/my/script.js');  
extObj('methodname')(arg1,arg2);  

代码可能如下所示:

function ScriptResource(file) {
  return function(method) {
    loadExternalScript(file);
    return window[method];
  }
}

上面代码中的各种假设,我让你自己弄清楚。最有趣的是,恕我直言 - 在您的原始实现中 - 如何让代理方法同步运行并返回值? AFAIK只能异步加载外部脚本并使用“onload”回调处理它们。