【问题标题】:Form validation based on attribute type using jquery使用jquery基于属性类型的表单验证
【发布时间】:2018-05-31 09:23:01
【问题描述】:

我正在处理表单验证我想一次验证基于 attr(type) 的字段,所有文本字段都应该被验证。像这样,我要验证

例子

 if($(myForm + " input").attr("type") == "email") {
// Validate Email Here
 }

我的代码工作正常,但是如果我再添加一个额外的字段,我将无法进行多重验证。谁能帮助我如何进行验证,如上所述 任何帮助将不胜感激

var Validator = function(form) {
    
    this.form = $(form);
    
    var Elements = {
        name: {
            selector: $('input[type=text]'),
            reg: /^[a-zA-Z]{2,20}$/
        },

        email: {
            selector: $('input[type=email]'),
            reg: /^[a-z-0-9_+.-]+\@([a-z0-9-]+\.)+[a-z0-9]{2,7}$/i
        },

        message: {
            selector: $('textarea'),
            reg: /^\s+$/
        }
    };

    var handleError = function(element, message) {
        element.addClass('input-error');
        var $err_msg = element.parent('div');
        var error = $('<div class="error"></div>').text(message);
        error.appendTo($err_msg);
        element.keyup(function() {
            $(error).fadeOut(1000, function() {
                element.removeClass('input-error');
            });
        });

    };

    this.validate = function() {

        this.form.submit(function(e) {

            for (var i in Elements) {

                var type = i;
                var validation = Elements[i];

                switch (type) {

                case 'name':
                    if (!validation.reg.test(validation.selector.val())) {
                        handleError(validation.selector, 'Not a valid name.');
                    }
                    break;
                case 'email':
                    if (!validation.reg.test(validation.selector.val())) {
                        handleError(validation.selector, 'Not a valid e-mail address.');
                    }
                    break;
                case 'message':
                    if (validation.reg.test(validation.selector.val()) || validation.selector.val() == '') {
                        handleError(validation.selector, 'Message field cannot be empty.');
                    }
                    break;
                default:
                    break;


                }

            }

            e.preventDefault();
        });

    };
};

var validator = new Validator('#test');
validator.validate();
body {
    background: #fff;
    color: #333;
    font: 76% Verdana, sans-serif;
}

form {
    margin: 1em 0 0 2em;
    width: 90%;
}

fieldset {
    margin: 0;
    border: 1px solid #ccc;
    padding-bottom: 1em;
}

legend {
    font-weight: bold;
    text-transform: uppercase;
}


label {
    float: left;
    width: 5em;
    padding-right: 2em;
    font-weight: bold;
}
div {
	margin-bottom: 30px;
}
input {
    font: 1em Verdana, sans-serif;
}

fieldset ul li input {
    float: left;
    width: 120px;
    border: 1px solid #ccc;
}

textarea {
    width: 300px;
    height: 200px;
    border: 1px solid #ccc;
    font: 1em Verdana, sans-serif;
}

form p {
    margin: 0;
    padding: 0.4em 0 0 7em;
}

form p input {
    background: #666;
    color: #fff;
    font-weight: bold;
}


div.error {
    clear: left;
    margin-left: 5.3em;
    color: red;
    padding-right: 1.3em;
    height: 100%;
    padding-bottom: 0.3em;
    line-height: 1.3;
}

.input-error {
    background: #ff9;
    border: 1px solid red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="#" method="post" id="test">

<fieldset>

<legend>Contact information</legend>


<div>
    <label for="name">Name:</label>
    <input type="text" name="name" id="name" />
</div>
	
<!--<div>
    <label for="lastname">LastName:</label>
    <input type="text" name="lastname" />
</div>-->

<div>
    <label for="email">Email:</label>
    <input type="email" name="email" id="email" />
    
</div>

<div>
    <label for="message">Message:</label>
    <textarea id="message" name="message" cols="30" rows="15"></textarea>
</div>

<p><input type="submit" name="send" id="send" value="Send" /></p>

</fieldset>


</form>

【问题讨论】:

  • 您不应该循环遍历表单字段而不是验证器吗?按照您现在的方式,您只能拥有与 Elements 对象中的元素一样多的字段(当前为 3 个)。您应该改为遍历表单字段并将它们中的每一个传递给验证器(可能需要稍微重写)。
  • @cjs1978 谢谢你能帮我怎么做我是 jquery 的新手。实际上,我尝试了很多方法但没有运气。如果您需要完全更改代码也没有问题,但条件将是我上面提到的。
  • 您可以使用类似 $("form#test input").each(function(field){/* 在这里验证“field”的值 - 您可以使用 $ (field).attr("type") 获取类型,$(field).val() 获取值等 */})
  • @cjs1978 我在问题中尝试了上述条件,但无法实现。你能重写我上面的代码吗?
  • 不,我不能(现在没有时间)。但从概念上讲,您应该想象您的表单可能有 100 个字段(原则上它们可以是同一类型(即所有“名称”字段)或混合类型)。然后,遍历字段,并为每个字段检查字段的类型,选择正确的验证方法(基于类型),并相应地验证字段的值。您可能需要稍微重构一下现有代码。

标签: javascript jquery html validation


【解决方案1】:

编辑:工作小提琴,https://jsfiddle.net/oL4dr0fa/5/ - 并且还在提交处理程序中添加了一些简单的功能,以便在没有错误的情况下实际提交表单。

这里是 JS 部分,re。我上面的cmets:

    var Validator = function(formObject) {
    this.form = $(formObject);

    var Elements = {
        name: {
            reg: /^[a-zA-Z]{2,20}$/,
            error: "Not a valid name.",
        },

        email: {
            reg: /^[a-z-0-9_+.-]+\@([a-z0-9-]+\.)+[a-z0-9]{2,7}$/i,
            error: "Not a valid e-mail address.",
        },

        message: {
            reg: /^(?!\s*$).+/,
            error: "Message field cannot be empty.",
        },
    };

    var handleError = function(element, message) {
        element.addClass('input-error');
        var $err_msg = element.parent('div');
        var error = $('<div class="error"></div>').text(message);
        error.appendTo($err_msg);
        element.keyup(function() {
            $(error).fadeOut(1000, function() {
                element.removeClass('input-error');
            });
        });

    };

    this.validate = function() {
            var errorCount = 0;
        this.form.find("input, textarea").each(function(index, field){
            var type = $(field).data("validation");
            var validation = Elements[type];
            if (validation){
                if (!validation.reg.test($(field).val())){
                        errorCount++;
                    handleError($(field), validation.error);
                }            
            }
        })
            return errorCount == 0;
    };
};

$(function(){
    $("form#test").on("submit", function(event){
        //event.preventDefault();
        return new Validator(this).validate(); // "this" here refers to the form

    })
})

这是编辑后的带有数据属性的 HTML:

    <form action="#" method="post" id="test">

<fieldset>

<legend>Contact information</legend>


<div>
    <label for="name">Firstname:</label>
    <input type="text" name="firstname" id="firstname" data-validation="name" />
</div>


<div>
    <label for="lastname">Lastname:</label>
    <input type="text" name="lastname" id="lastname" data-validation="name" />
</div>

<div>
    <label for="email">Email:</label>
    <input type="email" name="email" id="email" data-validation="email"/>

</div>

<div>
    <label for="message">Message:</label>
    <textarea id="message" name="message" cols="30" rows="15" data-validation="message"></textarea>
</div>

<p><input type="submit" name="send" id="send" value="Send" /></p>

</fieldset>


</form>

【讨论】:

  • 这段代码和我之前的代码一样。仅验证一个文本字段而不是全部。
  • 已编辑,请再试一次
  • 第二个输入字段没有被验证。即使它是空的。
  • 这里有。还有第三个,第四个等等。你有缓存JS吗?
  • 是的,我做了,但它不工作看看jsfiddle.net/mohamm_98666/docnwwgc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
相关资源
最近更新 更多