2009-06-11 4 views
1

Ich habe die folgende Situation in JavaScript:Wie kann ich eine anonyme Funktion (in String gespeichert) mit einem Argument in JavaScript aufrufen?

<a onclick="handleClick(this, {onSuccess : 'function() { alert(\'test\') }'});">Click</a> 

Die handleClick Funktion empfängt das zweite Argument als Objekt mit einer onSuccess Eigenschaft, um die Funktionsdefinition enthält ...

Wie rufe ich die Funktion onSuccess (die als String gespeichert ist) -und- otherObject an diese Funktion übergeben? (jQuery Lösung auch gut ...)?

Das ist, was ich bisher ...

habe versucht, diese
function handleClick(element, options, otherObject) { 
    options.onSuccess = 'function() {alert(\'test\')}'; 

    options.onSuccess(otherObject); //DOES NOT WORK 
    eval(options.onSuccess)(otherObject); //DOES NOT WORK 
} 

Antwort

6

Sie haben nicht wirklich das tun müssen, um. Übergeben Sie die Funktion als String, ich meine. JavaScript-Funktionen sind erstklassige Objekte und kann um direkt übergeben werden:

<a onclick="handleClick(this, {onSuccess : function(obj) { alert(obj) }}, 'test');"> 
    Click 
</a> 

...

function handleClick(element, options, otherObject) { 
    options.onSuccess(otherObject); // works... 
} 

Aber wenn Sie wirklich wollen es auf deine Weise zu tun, dann wird cloudhead's solution gerade tun fein.

+0

bah ... und hier war ich gerade dabei, meine Ausführungen zum Umfang von eval zu schreiben. +1 für die Beantwortung der eigentlichen Frage. – Jimmy

+0

Ja, ich habe das getan, aber das bedeutet, dass ich den json_encode in PHP nicht mehr benutzen kann ... das kapselt alles in Strings ein. – Ropstah

+2

@roppah: nicht sicher, warum du Funktionsdefinitionen über JSON übergeben willst. .. Wenn Sie diese Funktionen nicht direkt serverseitig erzeugen, sollten Sie in Erwägung ziehen, eine Bibliothek von Funktionen zusammenzustellen und sie dann im JSON * zu benennen. Sie können dann die gewünschte Funktion nachschlagen, ohne sich um eval() zu kümmern. – Shog9

1

Versuchen:

options.onSuccess = eval('function() {alert(\'test\')}'); 
options.onSuccess(otherObject); 
+0

Ist das nicht das gleiche wie: eval ('function() {alert (\' test \ ')} ') (AnderesObjekt); – Ropstah

+0

Wie Itay bemerkt, sollten Sie den Parameter auf eval ('(' + options.onSuccess + ')') in Klammern setzen - andernfalls wird FF ersticken. Entschuldigung, vergaß das ... – Shog9

0

Es funktionierte nur auf meiner FF, wenn ich ein assignmnet in ein Dummy-Variable hinzugefügt:

options.onSuccess = 'dummyVariable = function(x) {alert("x=" + x);}'; 
f = eval(options.onSuccess); 
f(5); 
+0

Heh, guter Fang. Anstatt die DummyVariable einzuführen, können Sie den Wert einfach in Klammern einschließen. – Shog9

Verwandte Themen