Frage Testen, ob der Wert eine Funktion ist


Ich muss testen, ob der Wert eines Formulars ist onsubmit ist eine Funktion. Das Format ist typisch onsubmit="return valid();". Gibt es eine Möglichkeit zu sagen, ob dies eine Funktion ist und ob sie abrufbar ist? Die Verwendung von typeof gibt nur zurück, dass es eine Zeichenfolge ist, was mir nicht viel hilft.

BEARBEITEN: Natürlich verstehe ich, dass "wieder gültig ();" ist eine Zeichenfolge. Ich habe replaced es hinunter zu "valid ();" und sogar "valid ()". Ich möchte wissen, ob beides eine Funktion ist.

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

BEARBEITEN 2: Hier ist der neue Code. Es scheint, dass ich immer noch eine Eval verwenden muss, da das Aufrufen von form.submit () keine bestehenden Vorfälle 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 zu möglicherweise, wie man das besser macht?


76
2018-04-28 14:44


Ursprung


Antworten:


Ich ersetze einen Absenden-Button mit einem   Ankerverbindung. Seit dem Anruf   form.submit () wird nicht aktiviert   onsubmit's, ich finde es, und   Eval () es selbst. Aber ich würde gerne   Überprüfen Sie, ob die Funktion bereits existiert   nur eval () ing was da ist. - gms8994

<script type="text/javascript">
function onsubmitHandler() {
    alert('running onsubmit handler');
    return true;
}
function testOnsubmitAndSubmit(f) {
    if (typeof f.onsubmit === 'function') {
        // onsubmit is executable, test the return value
        if (f.onsubmit()) {
            // onsubmit returns true, submit the form
            f.submit();
        }
    }
}
</script>

<form name="theForm" onsubmit="return onsubmitHandler();">
<a href="#" onclick="
    testOnsubmitAndSubmit(document.forms['theForm']);
    return false;
"></a>
</form>

EDIT: fehlende Parameter f in der Funktion testOnsubmitAndSubmit

Das obige sollte funktionieren, unabhängig davon, ob Sie das zuweisen onsubmit HTML-Attribut oder weisen Sie es in JavaScript zu:

document.forms['theForm'].onsubmit = onsubmitHandler;

74
2018-04-28 18:48



Versuchen

if (this.onsubmit instanceof Function) {
    // do stuff;
}

47
2018-04-28 14:50



Du könntest einfach das benutzen typeof Operator zusammen mit einem ternären Operator kurz:

onsubmit="return typeof valid =='function' ? valid() : true;"

Wenn es sich um eine Funktion handelt, rufen wir sie auf und geben ihren Rückgabewert zurück, andernfalls kehren wir einfach zurück true

Bearbeiten:

Ich bin mir nicht ganz sicher, was du wirklich machen willst, aber ich werde versuchen zu erklären, was passieren könnte.

Wenn Sie Ihre onsubmit code innerhalb ihres html, wird sie in eine funktion umgewandelt und somit von der JavaScript "world" abrufbar. Das bedeutet, dass diese beiden Methoden gleichwertig sind:

HTML: <form onsubmit="return valid();" />
JavaScript: myForm.onsubmit = function() { return valid(); };

Diese beiden werden beide Funktionen sein und beide werden aufrufbar sein. Sie können jeden von denen, die das verwenden, testen typeof Betreiber, der das gleiche Ergebnis erzielen soll: "function".

Wenn Sie jetzt der Eigenschaft "onsubmit" über JavaScript eine Zeichenfolge zuweisen, bleibt diese Zeichenfolge erhalten und kann daher nicht aufgerufen werden. Beachten Sie, dass wenn Sie das anwenden typeof Betreiber dagegen, du wirst es bekommen "string" Anstatt von "function".

Ich hoffe, das könnte ein paar Dinge klären. Wenn Sie wiederum wissen möchten, ob eine solche Eigenschaft (oder ein beliebiger Bezeichner) eine Funktion ist und aufrufbar ist, wird die typeof Betreiber sollte den Trick machen. Obwohl ich nicht sicher bin, ob es über mehrere Frames hinweg richtig funktioniert.

Prost


12
2018-04-28 15:17



Welchen Browser benutzen Sie?

alert(typeof document.getElementById('myform').onsubmit);

Das gibt mir "function"in IE7 und FireFox.


5
2018-04-28 14:49



Stellen Sie sicher, dass Sie typeof für die tatsächliche Funktion und nicht für ein Zeichenfolgenliteral aufrufen:

function x() { 
    console.log("hi"); 
}

typeof "x"; // returns "string"

typeof x; // returns "function"

3
2018-04-28 14:48



Verwenden einer String-basierten Variablen als Beispiel und Verwendung instanceof Function  Sie registrieren die Funktion..zuweisen Sie die Variable ... überprüfen Sie die Variable ist der Name der Funktion ... do pre-process ... zuweisen Sie die Funktion zu neuen var ... dann rufen Sie die Funktion.

function callMe(){
   alert('You rang?');
}

var value = 'callMe';

if (window[value] instanceof Function) { 
    // do pre-process stuff
    // FYI the function has not actually been called yet
    console.log('callable function');
    //now call function
   var fn = window[value];
   fn();
}

3
2018-04-28 14:49



Sie können versuchen, zu ändern diese Technik um Ihren Bedürfnissen zu entsprechen:

 function isFunction() {
   var functionName = window.prompt('Function name: ');
   var isDefined = eval('(typeof ' + functionName + '==\'function\');');
   if (isDefined)
     eval(functionName + '();');
   else
     alert('Function ' + functionName + ' does not exist');
 }
 function anotherFunction() {
   alert('message from another function.');
 }

3
2018-04-28 17:32



form.onsubmit wird immer eine Funktion sein, wenn sie als ein Attribut von HTML definiert ist. Es ist eine Art anonyme Funktion, die an ein HTML-Element angehängt ist, das die Dies Zeiger an dieses FORM-Element gebunden und hat auch einen Parameter namens event welches Daten über das Submit-Ereignis enthält.

Unter diesen Umständen verstehe ich nicht, wie Sie eine Zeichenfolge als Folge einer Operation erhalten. Sie sollten mehr Details, besser etwas Code geben.

Bearbeiten (als Antwort auf Ihre zweite Bearbeitung):

Ich glaube, der mit dem HTML-Attribut verbundene Handler wird ungeachtet des obigen Codes ausgeführt. 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 ausführen und dann den einen (ich habe nicht mit jQuery getestet) obwohl, aber mit addEventListener und attachEvent). Also ... was versuchst du genau zu erreichen?

Übrigens funktioniert Ihr Code nicht, weil Ihr regulärer Ausdruck die Zeichenfolge "valid ();" extrahiert, was definitiv keine Funktion ist.


2
2018-04-28 14:52



Wenn es eine Zeichenfolge ist, könnte man davon ausgehen, dass es immer von der Form ist

return SomeFunction(arguments);

Für den Funktionsnamen analysieren und dann sehen, ob diese Funktion mit definiert ist

if (window[functionName]) { 
    // do stuff
}

2
2018-04-28 14:50