延迟加载外部Javascript文件

延迟加载外部Javascript文件,javascript,metaprogramming,Javascript,Metaprogramming,我试图编写一个javascript类,根据需要加载脚本文件。我大部分时间都在工作。可以使用具有以下语法的库: var scriptResource = new ScriptResource('location/of/my/script.js'); scriptResource.call('methodName', arg1, arg2); 我想添加一些额外的语法糖,这样你就可以写了 var scriptResource = new ScriptResource('location/of/my/

我试图编写一个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);
我几乎可以肯定,这是不可能的,但可能有一个创造性的解决方案。我想需要的是某种方法调用事件。所以下面的方法可以奏效

ScriptResource = function(scriptLocation)
{
    this.onMethodCall = function(methodName)
    {
        this.call(arguments);
    }
}
这段代码显然非常不完整,但我希望它能让我了解我正在尝试做什么


这样的事情有可能吗

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

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);
    };
}
var方法=[“foo”、“bar”、“baz”];

对于(var i=0;i,Firefox中有一种非标准的方法,即noSuchMethod,可以满足您的需求
看看

所以你可以定义

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

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

var extObj = ScriptResource('location/of/my/script.js');  
extObj('methodname')(arg1,arg2);  
代码可能如下所示:

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

上面代码中的各种假设,我会让你自己弄清楚。最有趣的是,IMHO,在你最初的实现中,你如何让代理方法同步运行并返回一个值?好吧,你只能异步加载外部脚本并用“onload”处理它们回调。

我担心这不起作用。我需要调用任何方法。我做了一个大的编辑来显示我要使用的用法。我几乎认为我回答了错误的问题。你做了一些真正广泛的编辑。是的。很抱歉做了更改。我认为最好用更具体的术语来表达这个问题。我保存了编辑,因为你保存了你回答。谢谢你尝试一下。你不能写“ScriptResource=new function”。我们能看看你当前的
调用()的代码吗
implementation-如果我们不知道你的脚本是如何工作的,就很难建议其他解决方案…我将发布相同的答案:+1我刚刚设法让它工作。如果有一个完整的跨浏览器解决方案,那就太好了。真的不确定它是如何跨浏览器的-可能在其他基于mozilla的浏览器中工作吗?我继续我在我们的办公室里使用过它,这是所有其他人都知道的firefox?Christoph?@meouw:它根本不是跨浏览器的(只在Geckos中有效);这就是为什么我要求您当前实现call(),以便我们寻找解决方法……同步AJAX绝对是可能的。我每天都在使用它。本页解释了如何: