Ich muss testen, ob der Wert eines Formulars onsubmit
eine Funktion ist. Das Format ist normalerweise onsubmit="return valid();"
. Gibt es eine Möglichkeit festzustellen, ob dies eine Funktion ist und ob sie aufrufbar ist? Die Verwendung von typeof gibt nur zurück, dass es sich um eine Zeichenfolge handelt, was mir nicht viel hilft.
EDIT : Natürlich verstehe ich, dass "return valid ();" ist eine Zeichenfolge. Ich habe replace
es auf "valid ();" und sogar auf "valid ()" reduziert. Ich möchte wissen, ob eine davon eine Funktion ist.
EDIT : Hier ist ein Code, der mein Problem erklären kann:
$("a.button").parents("form").submit(function() {
var submit_function = $("a.button").parents("form").attr("onsubmit");
if ( submit_function && typeof( submit_function.replace(/return /,"") ) == 'function' ) {
return eval(submit_function.replace(/return /,""));
} else {
alert("onSubmit is not a function.\n\nIs the script included?"); return false;
}
} );
EDIT 2 : Hier ist der neue Code. Es scheint, dass ich immer noch eine Auswertung verwenden muss, da der Aufruf von form.submit () keine vorhandenen Onsubmits auslöst.
var formObj = $("a.button").parents("form");
formObj.submit(function() {
if ( formObj[0].onsubmit && typeof( formObj.onsubmit ) == 'function' ) {
return eval(formObj.attr("onsubmit").replace(/return /,""));
} else {
alert("onSubmit is not a function.\n\nIs the script included?");
return false;
}
} );
Vorschläge, wie dies möglicherweise besser gemacht werden kann?
quelle
f
ist eine Formularinstanz. Sie übergeben es als Argument an die Funktion testOnsubmitAndSubmit. (Ich weiß, dass diese Frage ziemlich alt ist, aber vielleicht spart meine Antwort jemandem etwas Zeit :))Versuchen
quelle
Sie können den
typeof
Operator einfach zusammen mit einem ternären Operator verwenden:Wenn es sich um eine Funktion handelt, rufen wir sie auf und geben ihren Rückgabewert zurück, andernfalls geben Sie einfach zurück
true
Bearbeiten:
Ich bin mir nicht ganz sicher, was Sie wirklich tun möchten, aber ich werde versuchen zu erklären, was passieren könnte.
Wenn Sie Ihren
onsubmit
Code in Ihrem HTML-Code deklarieren , wird er in eine Funktion umgewandelt und kann daher von der JavaScript- "Welt" aufgerufen werden. Das bedeutet, dass diese beiden Methoden gleichwertig sind:Diese beiden sind beide Funktionen und beide können aufgerufen werden. Sie können alle mit dem
typeof
Operator testen, der das gleiche Ergebnis erzielen soll :"function"
.Wenn Sie der Eigenschaft "onsubmit" über JavaScript eine Zeichenfolge zuweisen, bleibt diese eine Zeichenfolge und kann daher nicht aufgerufen werden. Beachten Sie, dass, wenn Sie den
typeof
Operator dagegen anwenden , Sie"string"
stattdessen erhalten"function"
.Ich hoffe, dies könnte einige Dinge klarstellen. Wenn Sie jedoch wissen möchten, ob eine solche Eigenschaft (oder eine Kennung für die Angelegenheit) eine Funktion ist und aufgerufen werden kann, sollte der
typeof
Bediener den Trick ausführen. Obwohl ich nicht sicher bin, ob es über mehrere Frames hinweg richtig funktioniert.Prost
quelle
Welchen Browser verwenden Sie?
Dies gibt mir "
function
" in IE7 und FireFox.quelle
Verwenden einer stringbasierten Variablen als Beispiel und Verwenden
instanceof Function
Sie Sie registrieren die Funktion. Weisen Sie die Variable zu. Überprüfen Sie, ob die Variable der Name der Funktion ist. Führen Sie eine Vorverarbeitung durch. Weisen Sie die Funktion einer neuen Variablen zu. Dann Rufen Sie die Funktion auf.quelle
Stellen Sie sicher, dass Sie typeof für die eigentliche Funktion aufrufen, nicht für ein Zeichenfolgenliteral:
quelle
Sie können versuchen, diese Technik an Ihre Bedürfnisse anzupassen:
quelle
form.onsubmit ist immer eine Funktion, wenn es als Attribut von HTML das Formularelement definiert. Es handelt sich um eine anonyme Funktion, die an ein HTML-Element angehängt ist. Der Zeiger this ist an dieses FORM-Element gebunden, und es gibt einen Parameter mit dem Namen,
event
der Daten zum Submit-Ereignis enthält.Unter diesen Umständen verstehe ich nicht, wie Sie als Ergebnis einer Operation eine Zeichenfolge erhalten haben. Sie sollten mehr Details angeben, besser etwas Code.
Bearbeiten (als Antwort auf Ihre zweite Bearbeitung):
Ich glaube, dass der an das HTML-Attribut angehängte Handler unabhängig vom obigen Code ausgeführt wird. Außerdem könnten Sie versuchen, es irgendwie zu stoppen, aber es scheint, dass FF 3, IE 8, Chrome 2 und Opera 9 zuerst den HTML-Attribut-Handler und dann den angehängten ausführen (ich habe nicht mit jQuery getestet zwar, aber mit addEventListener und attachEvent). Also ... was versuchst du genau zu erreichen?
Ihr Code funktioniert übrigens nicht, weil Ihr regulärer Ausdruck die Zeichenfolge "valid ();" extrahiert, was definitiv keine Funktion ist.
quelle
Wenn es sich um eine Zeichenfolge handelt, können Sie davon ausgehen, dass sie immer die Form hat
Analysieren Sie den Funktionsnamen und prüfen Sie, ob diese Funktion mit definiert ist
quelle
Nun,
"return valid();"
ist eine Zeichenfolge, also ist das richtig.Wenn Sie überprüfen möchten, ob stattdessen eine Funktion angehängt ist, können Sie Folgendes versuchen:
quelle
Ich denke, die Quelle der Verwirrung ist die Unterscheidung zwischen dem Attribut eines Knotens und der entsprechenden Eigenschaft .
Sie verwenden:
Sie lesen direkt das
onsubmit
Attribut ‚s - Wert (das muss ein String sein). Stattdessen sollten Sie auf dieonsubmit
Eigenschaft des Knotens zugreifen :Hier ist ein kurzer Test:
Dies ergibt:
quelle
quelle
Sie können immer eine der typeOf-Funktionen in JavaScript-Blogs wie Chris Wests verwenden . Die Verwendung einer Definition wie der folgenden für die
typeOf()
Funktion würde funktionieren:Diese Funktion (die im globalen Namespace deklariert ist, kann folgendermaßen verwendet werden:
Wenn es sich um eine Funktion handelt, wird "Funktion" zurückgegeben. Wenn es sich um eine Zeichenfolge handelt, wird "Zeichenfolge" zurückgegeben. Andere mögliche Werte werden hier angezeigt .
quelle
quelle
Eine einfache Überprüfung wie diese zeigt an, ob sie vorhanden / definiert ist:
quelle