Tester si la valeur est une fonction
J'ai besoin de tester si la valeur d'un formulaire onsubmit
est une fonction. Le format est généralement onsubmit="return valid();"
. Est-il un moyen de savoir si c'est une fonction, et si c'est appelable? À l'aide typeof renvoie simplement que c'est une chaîne, ce qui ne m'aide pas beaucoup.
MODIFIER: bien sûr, je comprends que "la de retour valide();" est une chaîne de caractères. J'ai replace
d à "en cours de validité();", et même "en cours de validité()". Je veux savoir si l'une de celles-ci est une fonction.
MODIFIER: Voici un 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 j'ai encore à l'utilisation d'un eval, parce que l'appel de la forme.submit() n'a pas d'incendie existant onsubmits.
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;
}
} );
Éventuellement des Suggestions sur la façon de faire mieux?
Vous devez vous connecter pour publier un commentaire.
EDIT : paramètre manquant f en fonction testOnsubmitAndSubmit
Ci-dessus devrait fonctionner indépendamment de savoir si vous affectez la
onsubmit
attribut HTML ou l'affecter en JavaScript:f
est une instance du formulaire. Vous passer à la testOnsubmitAndSubmit fonction comme argument. (Je sais que cette question est assez vieux, mais peut-être que ma réponse va sauver quelqu'un certain temps 🙂 )Essayer
Vous pouvez simplement utiliser le
typeof
opérateur avec un opérateur ternaire pour faire court:Si c'est une fonction que nous avons appel et retour de la valeur de retour, sinon il suffit de retourner
true
Edit:
Je ne suis pas tout à fait sûr de ce que vous voulez vraiment faire, mais je vais essayer d'expliquer ce qui se passe.
Lorsque vous déclarez votre
onsubmit
code dans votre code html, il est transformé en une fonction et donc de son "callable" JavaScript "monde". Cela signifie que ces deux méthodes sont équivalentes:Ces deux sera à la fois les fonctions et les deux seront disponibles. Vous pouvez tester l'un de ceux à l'aide de la
typeof
opérateur qui devraient production au même résultat:"function"
.Maintenant, si vous affectez une chaîne à la "onsubmit" propriété grâce à JavaScript, il restera une chaîne, donc pas remboursables. Notez que si vous appliquez le
typeof
opérateur contre elle, vous obtiendrez"string"
au lieu de"function"
.J'espère que cela clarifie un peu les choses. Et puis, si vous voulez savoir si un tel bien (ou tout autre identifiant de la question) est une fonction et exigible, le
typeof
opérateur devrait faire l'affaire. Bien que je ne suis pas sûr si cela fonctionne correctement sur plusieurs images.Acclamations
Quel navigateur utilisez-vous?
Cela me donne "
function
" dans IE7 et FireFox.Assurez-vous que vous appelez typeof sur la fonction réelle, pas une chaîne de caractères littérale:
à l'aide d'une chaîne de caractères en fonction de la variable à titre d'exemple et en faisant usage
instanceof Function
Vous vous inscrivez à la fonction..affecter la variable...vérifier que la variable est le nom de la fonction...ne pré-traiter... affectation de la fonction à de nouveaux var...puis d'appeler la fonction.
Vous pouvez essayer de modifier cette technique pour répondre à vos besoins:
forme.onsubmit sera toujours une fonction lorsqu'il est défini comme un attribut HTML de l'élément de formulaire. C'est une sorte de fonction anonyme attaché à un élément HTML, qui a la ce pointeur lié à cet élément de FORMULAIRE et dispose également d'un paramètre nommé
event
qui contiennent des données sur l'événement submit.Dans ces conditions, je ne comprends pas comment vous avez obtenu une chaîne de caractères comme un résultat d'une typeof opération. Vous devriez donner plus de détails, mieux un peu de code.
Modifier (comme réponse à votre deuxième édition):
Je crois que le gestionnaire attaché à l'attribut HTML exécutera quel que soit le code ci-dessus. De plus, vous pourriez essayer de l'arrêter en quelque sorte, mais, il semble que 3 FF, IE 8, Chrome 2 et Opera 9 sont en cours d'exécution l'attribut HTML gestionnaire en premier lieu, et ensuite celui attaché (je n'ai pas testé avec jQuery, mais avec la méthode addEventListener et attachEvent). Alors... ce que vous voulez accomplir exactement?
Par ailleurs, votre code ne fonctionne pas parce que votre expression régulière extrait de la chaîne "valide();", qui n'est certainement pas une fonction.
Si c'est une chaîne, on pourrait supposer /j'espère que c'est toujours de la forme
analyser pour le nom de la fonction, et ensuite voir si cette fonction est définie à l'aide de
Bien,
"return valid();"
est une chaîne de caractères, donc c'est correct.Si vous voulez vérifier si il a une fonction attachée au lieu de cela, vous pourriez essayer ceci:
Je pense que la source de la confusion est la distinction entre un nœud attribut et le correspondant propriété.
Vous utilisez:
Vous êtes une lecture directe de la
onsubmit
attribut's de la valeur (qui doit être une chaîne de caractères). Au lieu de cela, vous devez accéder à laonsubmit
propriété de noeud:Voici un test rapide:
Cela donne:
Vous pouvez toujours utiliser l'une des typeOf des fonctions en JavaScript, blogs,Chris West. À l'aide d'une définition telles que les suivantes pour la
typeOf()
fonction de travail:Cette fonction (ce qui est déclaré dans l'espace de noms global, peut être utilisée comme ceci:
Si c'est une fonction, "Fonction" sera retourné. Si c'est une chaîne, la Chaîne "string" sera retourné. Les autres valeurs possibles sont indiquées ici.
Une vérification simple comme cela vous permettra de savoir si il existe définies: