104 votes

Tester si la valeur est une fonction

J'ai besoin de tester si la valeur de la rubrique onsubmit est une fonction. Le format est typiquement onsubmit="return valid();" . Existe-t-il un moyen de savoir s'il s'agit d'une fonction et si elle peut être appelée ? L'utilisation de typeof ne fait que renvoyer qu'il s'agit d'une chaîne de caractères, ce qui ne m'aide pas beaucoup.

EDITAR : Bien sûr, je comprends que "return valid() ;" est une chaîne de caractères. J'ai replace Je n'ai plus que "valid() ;", et même "valid()". Je veux savoir si l'un ou l'autre est une fonction.

EDITAR : Voici un peu de code, qui peut aider à expliquer mon problème :

$("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 : Voici le nouveau code. Il semble que je doive encore utiliser un eval, parce que l'appel à form.submit() ne déclenche pas les onsubmits existants.

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

Des suggestions sur la manière de mieux faire ?

101voto

Grant Wagner Points 14085

I lien d'ancrage. Comme l'appel à form.submit() n'active pas onsubmit's, je le trouve, et et je l'évalue moi-même. Mais j'aimerais vérifier si la fonction existe avant de avant d'évaluer ce qu'il y a déjà. - 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 : paramètre f manquant dans la fonction testOnsubmitAndSubmit

La procédure décrite ci-dessus devrait fonctionner indépendamment du fait que vous attribuiez ou non l'attribut onsubmit ou l'assigner en JavaScript :

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

1 votes

D'où vient le mot f dans f.onsubmit ?

0 votes

f est une instance de formulaire. Vous la transmettez à la fonction testOnsubmitAndSubmit en tant qu'argument. (Je sais que cette question est assez ancienne, mais peut-être que ma réponse fera gagner du temps à quelqu'un :) )

73voto

artemb Points 3303

Pruebe

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

7 votes

Ce n'est qu'un exemple. Vous pouvez le modifier en button.onsubmit instanceof Function

14voto

Pablo Cabrera Points 3245

Vous pouvez simplement utiliser la fonction typeof ainsi qu'un opérateur ternaire :

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

S'il s'agit d'une fonction, nous l'appelons et renvoyons sa valeur de retour, sinon nous renvoyons simplement true

Editer :

Je ne sais pas exactement ce que vous voulez faire, mais je vais essayer d'expliquer ce qui se passe.

Lorsque vous déclarez votre onsubmit dans votre code html, il est transformé en fonction et peut donc être appelé depuis le "monde" JavaScript. Cela signifie que ces deux méthodes sont équivalentes :

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

Ces deux fonctions seront toutes deux appelables. Vous pouvez tester n'importe laquelle d'entre elles à l'aide de la fonction typeof qui devrait donner le même résultat : "function" .

Maintenant, si vous assignez une chaîne à la propriété "onsubmit" via JavaScript, elle restera une chaîne et ne pourra donc pas être appelée. Remarquez que si vous appliquez la méthode typeof opérateur contre lui, vous obtiendrez "string" au lieu de "function" .

J'espère que cela permettra de clarifier certaines choses. Par ailleurs, si vous voulez savoir si telle propriété (ou tout identifiant d'ailleurs) est une fonction et peut être appelée, la fonction typeof devrait faire l'affaire. Cependant, je ne suis pas sûr qu'il fonctionne correctement sur plusieurs images.

Saludos

0 votes

Je dois cependant tester ceci en dehors de l'onsubmit.

5voto

Greg Points 132247

Quel navigateur utilisez-vous ?

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

Cela me donne " function "dans IE7 et FireFox.

0 votes

Même si votre onsubmit est "return valid() ;"?

1 votes

Oui - n'oubliez pas que vous ne pouvez pas avoir de "return" en dehors d'une fonction.

0 votes

Form.onsubmit sera toujours une fonction tant qu'il est défini comme un attribut HTML. Voir ma réponse.

3voto

matt b Points 73770

Assurez-vous que vous appelez typeof sur la fonction réelle, et non sur une chaîne littérale :

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

typeof "x"; // returns "string"

typeof x; // returns "function"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X