web-dev-qa-db-fra.com

TypeError: pattern.test n'est pas une fonction

J'écris un formulaire d'inscription avec une tonne de javascript inclus. Lors de l'écriture des fonctions de base pour vérifier le format de certaines chaînes, je suis tombé sur ce problème (j'ai essayé de le résoudre moi-même mais pas de chance là-bas). Dans cette version simplifiée, j'ai trois fonctions: l'une pour vérifier le format du numéro de téléphone, la seconde pour vérifier le format de l'e-mail et la troisième pour combiner ces deux fonctions pour le rendre plus clair. Voici le code:

<html>
<head>
    <meta charset="utf-8">
    <script>
        function filterPhone(phone){
            var pattern = "/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/";
            return pattern.test(phone);
        }

        function filterEmail(email) {
            var regex = /^([a-zA-Z0-9_.+-])+\@(([a-zA-Z0-9-])+\.)+([a-zA-Z0-9]{2,4})+$/;
            return regex.test(email);
        }

        function checkForm(){
            var puh = document.getElementById("puh").value;
        var email = document.getElementById("email").value;
            if(filterPhone(puh) && filterEmail(email)){
                alert("It works");
                return true;
            } else {
                alert("Check the format!");
                return false;
            }
        }
    </script>
</head>
<body>
<form method="post" action="" name="regForm" onsubmit="return checkForm()">
    <input type="text" name="puh" id="puh" placeholder="Phonenumber"><br>
    <input type="text" name="email" id="email" placeholder="Email address"><br>
    <input type="submit" value="Check!">
</form>
</body>
</html>

Si je n'utilise que la fonction filterEmail, cela fonctionne bien, mais lorsque je les utilise tous les deux (ou même seulement le filterPhone!), Cela me donne une erreur: "TypeError: pattern.test n'est pas une fonction" (" pattern "se référant au nom de variable de la première fonction (filterPhone) appelé pattern). J'ai essayé d'utiliser exec () au lieu de test () et de changer le modèle d'expression régulière, aucun n'a fonctionné. C'est assez bizarre car la syntaxe semble correcte. Pourquoi pourrait être la raison?

22
elgis

Votre pattern doit être littéral RegEx (des guillemets autour qui ne devraient pas être là) comme ceci

var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/;

Sinon, vous devez utiliser RegExp objet, avec un échappement approprié pour \, comme ça

var pattern = new RegExp("^(()?\\d{3}())?(-|\\s)?\\d{3}(-|\\s)?\\d{4}$");
42
thefourtheye

Votre modèle contient une chaîne, et non une expression régulière.

Faites-le var pattern = /^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/; (sans guillemets)

13
Gaurang Tandon