2009-01-09 10 views
2

J'essaie d'écrire une classe javascript qui charge les fichiers de script quand ils sont nécessaires. J'ai la plupart de ce travail. Il est possible d'utiliser la bibliothèque avec la syntaxe suivante:Chargement de fichiers Javascript externes par chargement

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

Je voudrais ajouter un peu de sucre syntaxique supplémentaire pour que vous puissiez écrire

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

Je suis presque certain que ce nest pas possible, mais il peut être une solution inventive. Je suppose que ce qu'il doit y avoir est une sorte d'événement methodCall. SO suivantes pourrait travailler

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

Ce code est évidemment très incomplète mais j'espère que cela donne une idée de ce que je suis en train de faire

Est-ce quelque chose comme ça, même à distance possible?

+0

Vous ne pouvez pas écrire "ScriptResource = nouvelle fonction". –

+0

Pouvons-nous voir le code de votre implémentation 'call()' actuelle - il est difficile de suggérer des solutions alternatives si nous ne savons pas comment fonctionne votre script ... – Christoph

Répondre

0

Si l'ensemble des noms de méthode est limitée, alors vous pouvez générer ces méthodes:

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

modifier: Publié cette réponse avant la question a été modifiée de façon spectaculaire.

+0

Je suis affreux que ça ne fonctionne pas. Je dois appeler n'importe quelle méthode. J'ai fait un gros montage pour montrer l'utilisation que je suis après. –

+0

J'ai presque pensé que j'avais répondu à la mauvaise question. Vous avez apporté des modifications vraiment importantes. –

+0

Oui. Désolé pour le changement. J'ai pensé qu'il était préférable de présenter la question plus concrètement. J'ai sauvé l'édition en tant que votre sauvé vous répondez. Merci d'avoir essayé. –

3

Il existe une méthode non standard, __noSuchMethod__ dans Firefox qui fait ce que vous cherchez
un coup d'oeil à
https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/noSuchMethod

pour que vous puissiez définir

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

J'allais poster la même réponse: +1 – Christoph

+0

J'ai réussi à faire fonctionner ça. Ce serait bien s'il y avait une solution de navigateur complet. –

+0

Vous ne savez vraiment pas à quel point il s'agit d'un navigateur - cela peut fonctionner dans d'autres navigateurs basés sur mozilla? Je l'ai seulement utilisé dans notre bureau qui est tout firefox Quelqu'un d'autre sait? Christoph? – meouw

0

Une solution intermédiaire pourrait avoir une syntaxe telle que:

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

le code pourrait ressembler à ceci:

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

Toutes sortes d'hypothèses dans le code ci-dessus, je vous laisse comprendre par vous-même. Le plus intéressant, à mon humble avis, est - dans votre implémentation d'origine - comment obtenez-vous la méthode proxyied pour s'exécuter de manière synchrone et retourner une valeur? AFAIK vous ne pouvez charger que des scripts externes de manière asynchrone et les gérer avec un rappel "onload".

+0

AJAX synchrone est définitivement possible. Je l'utilise tous les jours. Cette page explique comment: http://www.hunlock.com/blogs/Snippets:_Synchronous_AJAX –

Questions connexes