【问题标题】:Lazy Load External Javascript Files延迟加载外部 Javascript 文件
【发布时间】:2010-09-30 11:13:34
【问题描述】:

我正在尝试编写一个 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);
    }
}

这段代码显然很不完整,但我希望它能让我了解我想要做什么

这样的事情还有可能吗?

【问题讨论】:

  • 你不能写“ScriptResource = new function”。
  • 我们能否查看您当前的 call() 实现的代码 - 如果我们不知道您的脚本是如何工作的,我们很难建议替代解决方案...

标签: javascript metaprogramming


【解决方案1】:

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
  • 我刚刚设法让它工作。如果有一个完整的跨浏览器解决方案就好了。
  • 真的不确定它是如何跨浏览器的 - 可以在其他基于 mozilla 的浏览器中工作吗?我只在我们的办公室用过它,都是firefox 其他人知道吗?克里斯托弗?
  • @meouw:它根本不是跨浏览器(仅适用于 Geckos);这就是为什么我要求您提供当前的 call() 实现,以便我们寻找解决方法...
【解决方案2】:

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

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);
    };
}

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

【讨论】:

  • 我担心这行不通。我需要调用任何方法。我做了一个很大的编辑来展示我所追求的用法。
  • 我差点以为我回答错了问题。您进行了一些真正广泛的编辑。
  • 是的。很抱歉的改变。我认为最好以更具体的方式提出这个问题。我将编辑保存为您保存的答案。感谢您尝试一下。
【解决方案3】:

中间解决方案可能是使用如下语法:

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”回调处理它们。

【讨论】:

猜你喜欢
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多