2009-06-09 13 views
65

Ich arbeite an der dynamischen Erstellung von Javascript, das in eine Webseite eingefügt wird, während es erstellt wird.Wie rufe ich eine dynamisch benannte Methode in Javascript auf?

Das Javascript wird verwendet, um ein Listenfeld basierend auf der Auswahl in einer anderen Listbox zu füllen. Wenn die Auswahl einer Listbox geändert wird, ruft sie einen Methodennamen basierend auf dem ausgewählten Wert der Listbox auf.

Zum Beispiel:

Listbox1 enthält:

Farben
Formen

Wenn 'Farben' ausgewählt wird, dann wird es eine "populate_Colours" Methode aufrufen, die einen anderen listbox auffüllt.
Um meine Frage zu klären: Wie mache ich das "populate_Colours" Aufruf in Javascript?

+0

I‘ Ich empfehle dagegen, lokale Zweigstellen in einer einzigen "Populate" -Methode zu haben. Es würde es testbarer machen und weniger "hacky" aussehen –

+0

siehe meine Antwort hier. [Anruf mit Namen in Javascript] (https://Stackoverflow.com/a/46090820/7771019) –

Antwort

142

Angenommen, die 'populate_Colours'-Methode befindet sich im globalen Namespace, können Sie den folgenden Code verwenden, der beide nutzt, dass auf alle Objekteigenschaften zugegriffen werden kann, als wäre das Objekt ein assoziatives Array und alle globalen Objekte tatsächlich Eigenschaften des Hostobjekts window.

+6

Danke für die Antwort. Das 'Fenster'-Bit hat mich wirklich geworfen, bis ich es gegooglet habe und festgestellt habe, dass globale Objekte Teil des Fensterobjekts sind. Jetzt macht es Sinn! Vielen Dank. FYI fand ich eine gute Seite über sie hier http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx –

+0

Froh, dass es geholfen! Sie sollten diese Antwort akzeptieren, wenn es für Sie funktioniert – Triptych

+0

Ich habe etwas ähnliches getan, außer dass die Funktionen, die ich anvisierte, im jQuery "fn" -Namespace waren. Zum Beispiel '$ .fn [Methode_Präfix + Methodenname] (arg1, arg2);' – codecraig

27

Wie Triptych darauf hinweist, können Sie jede globale Bereichsfunktion aufrufen, indem Sie sie im Inhalt des Hostobjekts finden.

Eine sauberere Methode, die viel weniger den globalen Namensraum verschmutzt, ist explizit die Funktionen in ein Array wie so direkt gestellt:

var dyn_functions = []; 
dyn_functions['populate_Colours'] = function (arg1, arg2) { 
       // function body 
      }; 
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
       // function body 
      }; 
// calling one of the functions 
var result = dyn_functions['populate_Shapes'](1, 2); 
// this works as well due to the similarity between arrays and objects 
var result2 = dyn_functions.populate_Shapes(1, 2); 

Dieses Array eine Eigenschaft eines Objekts anders als die global sein könnte Host-Objekt bedeutet auch, dass Sie effektiv Ihren eigenen Namespace erstellen können, wie es viele JS-Bibliotheken wie jQuery tun. Dies ist nützlich, um Konflikte zu reduzieren, wenn Sie mehrere separate Utility-Bibliotheken auf derselben Seite hinzufügen und (wenn es andere Teile Ihres Designs erlauben) die Wiederverwendung des Codes auf anderen Seiten erleichtern.

Sie auch ein Objekt wie so verwenden könnte, die Sie Reiniger finden könnte:

var dyn_functions = {}; 
dyn_functions.populate_Colours = function (arg1, arg2) { 
       // function body 
      }; 
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
       // function body 
      }; 
// calling one of the functions 
var result = dyn_functions.populate_Shapes(1, 2); 
// this works as well due to the similarity between arrays and objects 
var result2 = dyn_functions['populate_Shapes'](1, 2); 

Beachten Sie, dass ein Array mit einem oder einem Objekt, Sie entweder Verfahren zum Einstellen oder den Zugriff auf die Funktionen nutzen können, und können natürlich speichern Sie dort auch andere Objekte. Sie können weiterhin die Syntax der beiden Verfahren für contant reduzieren, die mit JS wörtliche Notation wie so nicht, dass synamic ist:

var dyn_functions = { 
      populate_Colours:function (arg1, arg2) { 
       // function body 
      }; 
     , populate_Shapes:function (arg1, arg2) { 
       // function body 
      }; 
}; 

Edit: der für größere Blöcke von Funktionalität natürlich Sie oben auf die sehr häufig erweitern "Modulmuster" ist eine beliebte Methode, um Code-Features in einer organisierten Weise zu kapseln.

+0

Das ist eine nette Art, es sauber zu halten. Wie würde ich die Methode nennen? Würde das Fenster [dyn_functions ['populate_Colours'] (arg1, arg2) funktionieren? –

+0

Eine eigene Frage beantworten - Ich habe gerade das Fenster [dyn_functions ['populate_Colours'] (arg1, arg2)] getestet; und es funktioniert tatsächlich. –

+1

Sie würden kein Fenster brauchen – epascarello

1

Hallo dies versuchen,

var callback_function = new Function(functionName); 
callback_function(); 

wird es die Parameter selbst behandeln.

+0

Uncaught Referenzfehler - functionName ist nicht definiert – brianlmerritt

+0

@brianlmerritt Sie müssen den Wert für 'functionName' definieren ... der Antworter hat die Annahme gemacht, dass Sie das bereits definiert haben. – GoldBishop

7

können Sie es wie folgt tun:

function MyClass() { 
    this.abc = function() { 
     alert("abc"); 
    } 
} 

var myObject = new MyClass(); 
myObject["abc"](); 
1

für eine einfache JavaScript-Funktion, wir

var function_name='additionFunction'; 
var argMap={"name":"yogesh"}; 
var argArray=[{"name":"yogesh"}]; 

window[function_name](argMap); 

oder

window[function_name](argArray); 

oder

window[function_name](argMap,argArray); 
bedienen-kann

vorausgesetzt, so genannte Funktion existiert und hat solche Parameter in der tatsächlichen Implementierung.

-1

Versuchen mit diesem:

var fn_name = "Colours", 
fn = eval("populate_"+fn_name); 
fn(args1,argsN); 
+0

Welche Auswirkungen hat die Verwendung dieses Musters? Ich habe gelesen, dass die "eval" -Funktion einige seltsame Nebenwirkungen hat, die mit ihrer Verwendung zusammenhängen. Ich versuche generell, mich davon fern zu halten, es sei denn, es ist ein letzter Ausweg. – GoldBishop

3

Ich würde empfehlen, NICHTglobal/window/eval für diesen Zweck zu verwenden.
Stattdessen tun es auf diese Weise:

alle Methoden als Eigenschaften von Handler definieren:

var Handler={}; 

Handler.application_run = function (name) { 
console.log(name) 
} 

Jetzt ist es nennen wie diese

var somefunc = "application_run"; 
Handler[somefunc]('jerry'); 

Ausgang: Jerry

Verwandte Themen