Frage

Ich brauche zu testen, ob der Wert des onsubmit des Formulars eine Funktion ist. Das Format wird in der Regel onsubmit="return valid();". Gibt es eine Möglichkeit zu sagen, ob dies eine Funktion ist, und wenn es aufrufbar? Mit typeof nur zurück, dass es ein String ist, was mir nicht viel helfen.

Bearbeiten : Natürlich verstehe ich, dass "Rückkehr gültig ();" ist eine Zeichenfolge. Ich habe es zu replaced down "gültig ();", und sogar "gültig ()". Ich möchte wissen, wenn eine der beiden eine Funktion ist.

Bearbeiten : Hier ist ein Code, der mein Problem erklären helfen können:

$("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 noch ein eval verwenden, da Aufruf form.submit () onsubmits nicht vorhandenen abfeuert.

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 auf möglicherweise, wie dies besser machen?

War es hilfreich?

Lösung

  

Ich ersetzt eine Submit-Button mit einem   Anker-Link. seit Aufruf   form.submit () wird nicht aktiviert   onsubmit ist, bin ich es zu finden, und   eval () ing es selbst. Aber ich möchte   überprüfen, ob die Funktion vorhanden ist, bevor   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 Funktion testOnsubmitAndSubmit

Die oben sollte unabhängig davon arbeiten, ob Sie das onsubmit HTML-Attribut zuweisen oder sie in JavaScript zuweisen:

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

Andere Tipps

Versuchen

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

Sie können einfach den typeof Operator zusammen mit einem ternären Operator kurz:

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

Wenn es eine Funktion, die wir nennen es und senden es Rückgabewert ist, sonst nur true zurückkehren

Edit:

Ich bin mir nicht ganz sicher, was Sie wirklich tun wollen, aber ich werde versuchen zu erklären, was passiert sein könnte.

Wenn Sie Ihren onsubmit Code in Ihrem HTML erklären, wird es in eine Funktion eingeschaltet und damit seine aufrufbar aus der JavaScript „Welt“. Das bedeutet, dass diese beiden Methoden sind äquivalent:

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

werden diese beiden beide Funktionen sein und beide werden aufrufbar. Sie können alle diejenigen, testen Sie die typeof Operator die das gleiche Ergebnis Yeld sollte. "function"

Nun, wenn Sie einen String an die „onsubmit“ Eigenschaft via JavaScript zuweisen, wird es eine Zeichenfolge, bleibt daher nicht aufrufbar. Beachten Sie, dass, wenn Sie die typeof Betreiber gegen sie anwenden, Sie "string" statt "function" erhalten werden.

Ich hoffe, dies könnte ein paar Dinge zu klären. Dann wieder, wenn Sie, wenn diese Immobilie erfahren möchten (oder eine Kennung für die Sache) ist eine Funktion und aufrufbar, sollte der typeof Operator den Trick. Obwohl ich nicht sicher bin, ob es richtig über mehrere Frames funktioniert.

Prost

Welche Browser Sie verwenden?

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

Das gibt mir "function" in IE7 und FireFox.

Stellen Sie sicher, typeof auf die eigentliche Funktion aufrufen, kein Stringliteral:

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

typeof "x"; // returns "string"

typeof x; // returns "function"

mit einer String-basierten Variable als Beispiel und Verwendung instanceof Function machen Sie registrieren die function..assign die Variable ... überprüfen die Variable der Name Funktion ist ... tun Vorprozess ... ordnen Sie die Funktion, um neue var ... dann die Funktion aufrufen.

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

Sie können versuchen, zu modifizieren diese Technik an Ihre Bedürfnisse anpassen:

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

form.onsubmit wird immer eine Funktion sein, wenn als Attribut von HTML das Formularelement definiert. Es ist eine Art von anonymer Funktion zu einem HTML-Elemente angebracht, das die hat dieses Zeiger auf das FORM-Element gebunden und auch einen Parameter namens event hat, welche Daten über das einreichen Ereignis enthalten wird.

Unter diesen Umständen ich verstehe nicht, wie man einen String als Ergebnis einer typeof Operation bekam. Sie sollten mehr Details geben, einige Code verbessern.

Bearbeiten (als Antwort auf Ihre zweite edit):

Ich glaube, dass der Handler an das HTML-Attribut gebunden, unabhängig von dem obigen Code ausgeführt wird. Weiter mehr, Sie könnten versuchen, es irgendwie zu stoppen, aber es scheint, dass FF 3, IE 8, Chrome 2 und Opera 9 den HTML-Attribut-Handler in erster Linie ausgeführt werden und die dann einen aufgesetzten (ich habe mit jQuery nicht getestet obwohl, aber mit addEventListener und attachEvent). Also ... was sind Sie hier genau zu erreichen versuchen?

Durch die Art und Weise, Ihr Code funktioniert nicht, weil Ihr regulärer Ausdruck wird die Zeichenfolge extrahiert „valid ();“., Die definitiv keine Funktion

Wenn es ein String ist, könnte man annehmen / hoffe, es ist immer von der Form

return SomeFunction(arguments);

analysiert für die Funktionsnamen, und dann sehen, ob die Funktion definiert wird mit

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

Nun, "return valid();" ist ein String, so das ist richtig.

Wenn Sie überprüfen wollen, ob es eine Funktion hat, stattdessen angebracht, Sie könnten versuchen, diese:

formId.onsubmit = function (){ /* */ }

if(typeof formId.onsubmit == "function"){
  alert("it's a function!");
}

Ich denke, die Quelle der Verwirrung ist die Unterscheidung zwischen den Knoten Attribute und der entsprechende Eigenschaft .

Sie verwenden:

$("a.button").parents("form").attr("onsubmit")

Sie sind direkt mit dem onsubmit Attribut Lesen 's-Wert (die muss sein ein String). Stattdessen sollten Sie die onsubmit Zugriff auf Eigenschaft des Knotens:

$("a.button").parents("form").prop("onsubmit")

Hier ist ein kurzer Test:

<form id="form1" action="foo1.htm" onsubmit="return valid()"></form>
<script>
window.onload = function () {
    var form1 = document.getElementById("form1");

    function log(s) {
        document.write("<div>" + s + "</div>");
    }

    function info(v) {
        return "(" + typeof v + ") " + v;
    }

    log("form1 onsubmit property: " + info(form1.onsubmit));
    log("form1 onsubmit attribute: " + info(form1.getAttribute("onsubmit")));
};
</script> 

Dies ergibt:

form1 onsubmit property: (function) function onsubmit(event) { return valid(); }
form1 onsubmit attribute: (string) return valid()
  if ( window.onsubmit ) {
     //
  } else {
     alert("Function does not exist.");
  }

Sie können jederzeit eine der typeOf Funktionen auf JavaScript Blogs verwenden wie Chris West . Unter Verwendung einer Definition wie die folgenden für die typeOf() Funktion funktionieren würde:

function typeOf(o){return {}.toString.call(o).slice(8,-1)}

Diese Funktion (die im globalen Namensraum deklariert wird, kann wie folgt verwendet werden:

alert("onsubmit is a " + typeOf(elem.onsubmit));

Wenn es sich um eine Funktion, „Funktion“ wird zurückgegeben. Wenn es sich um eine Zeichenfolge, „String“ wird zurückgegeben. Andere mögliche Werte sind hier gezeigt.

// This should be a function, because in certain JavaScript engines (V8, for
// example, try block kills many optimizations).
function isFunction(func) {
    // For some reason, function constructor doesn't accept anonymous functions.
    // Also, this check finds callable objects that aren't function (such as,
    // regular expressions in old WebKit versions), as according to EcmaScript
    // specification, any callable object should have typeof set to function.
    if (typeof func === 'function')
        return true

    // If the function isn't a string, it's probably good idea to return false,
    // as eval cannot process values that aren't strings.
    if (typeof func !== 'string')
        return false

    // So, the value is a string. Try creating a function, in order to detect
    // syntax error.
    try {
        // Create a function with string func, in order to detect whatever it's
        // an actual function. Unlike examples with eval, it should be actually
        // safe to use with any string (provided you don't call returned value).
        Function(func)
        return true
    }
    catch (e) {
        // While usually only SyntaxError could be thrown (unless somebody
        // modified definition of something used in this function, like
        // SyntaxError or Function, it's better to prepare for unexpected.
        if (!(e instanceof SyntaxError)) {
            throw e
        }

        return false
    }
}

Eine einfache Prüfung wie diese werden Sie wissen lassen, wenn es vorhanden ist / definiert:

if (this.onsubmit)
{
  // do stuff;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top