Jquery validate总是返回true

时间:2016-06-20 06:10:46

标签: jquery jquery-validate jquery-steps

我有一个jquery步骤向导,里面有两个表格。当传递到下一步时,我尝试使用valid()方法验证第一个表单,但jquery validate总是返回true。

这是小提琴:

https://jsfiddle.net/2uyp1g25/

map
$(document).ready(function(){
   var formBasico = $("#basico").show();
    formBasico.validate({
        ignore: ":disabled,:hidden",
        rules: {
            'nombre-temp': {
                required: true,
                range: [1, 50]
            },
            'descripcion-temp': {
                required: true,
                range: [1, 50]
            },
            'min-cli': {
                required: true,
                number: true
            },
            'max-cli': {
                required: true,
                number: true
            },
            'cantidad-celdas': {
                required: true,
                number: true
            }
        }
    });

   $('#pasosTemplate').steps({
        headerTag: "h3",
        bodyTag: "section",
        transitionEffect: "slideLeft",
        autoFocus: true,
        labels: {
            cancel: "Cancelar",
            current: "paso actual:",
            pagination: "Paginación",
            finish: "Guardar Template",
            next: "Siguiente",
            previous: "Anterior",
            loading: "Cargando ..."
        },
        onStepChanging: function (event, currentIndex, newIndex) {
            if (currentIndex < newIndex) {
                alert(formBasico.valid());
                return formBasico.valid();
            }
            return true;
        },
        onFinished: function (event, currentIndex) {
         alert('fin');
        }
    });
});
/*
    Common
*/

.wizard,
.tabcontrol
{
    display: block;
    width: 100%;
    overflow: hidden;
}

.wizard a,
.tabcontrol a
{
    outline: 0;
}

.wizard ul,
.tabcontrol ul
{
    list-style: none !important;
    padding: 0;
    margin: 0;
}

.wizard ul > li,
.tabcontrol ul > li
{
    display: block;
    padding: 0;
}

/* Accessibility */
.wizard > .steps .current-info,
.tabcontrol > .steps .current-info
{
    position: absolute;
    left: -999em;
}

.wizard > .content > .title,
.tabcontrol > .content > .title
{
    position: absolute;
    left: -999em;
}



/*
    Wizard
*/

.wizard > .steps
{
    position: relative;
    display: block;
    width: 100%;
}

.wizard.vertical > .steps
{
    display: inline;
    float: left;
    width: 30%;
}

.wizard > .steps .number
{
    font-size: 1.429em;
}

.wizard > .steps > ul > li
{
    width: 25%;
}

.wizard > .steps > ul > li,
.wizard > .actions > ul > li
{
    float: left;
}

.wizard.vertical > .steps > ul > li
{
    float: none;
    width: 100%;
}

.wizard > .steps a,
.wizard > .steps a:hover,
.wizard > .steps a:active
{
    display: block;
    width: auto;
    margin: 0 0.5em 0.5em;
    padding: 1em 1em;
    text-decoration: none;

    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}

.wizard > .steps .disabled a,
.wizard > .steps .disabled a:hover,
.wizard > .steps .disabled a:active
{
    background: #eee;
    color: #aaa;
    cursor: default;
}

.wizard > .steps .current a,
.wizard > .steps .current a:hover,
.wizard > .steps .current a:active
{
    background: #007cc1;
    color: #fff;
    cursor: default;
}

.wizard > .steps .done a,
.wizard > .steps .done a:hover,
.wizard > .steps .done a:active
{
    background: #9dc8e2;
    color: #fff;
}

.wizard > .steps .error a,
.wizard > .steps .error a:hover,
.wizard > .steps .error a:active
{
    background: #ff3111;
    color: #fff;
}

.wizard > .content
{
    background: #eee;
    display: block;
    margin: 0.5em;
    min-height: 35em;
    overflow: hidden;
    position: relative;
    width: auto;

    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}

.wizard.vertical > .content
{
    display: inline;
    float: left;
    margin: 0 2.5% 0.5em 2.5%;
    width: 65%;
}

.wizard > .content > .body
{
    float: left;
    position: relative;
    width: 95%;
    height: 95%;
    padding: 2.5%;
}

.wizard > .content > .body ul
{
    list-style: disc !important;
}

.wizard > .content > .body ul > li
{
    display: list-item;
}

.wizard > .content > .body > iframe
{
    border: 0 none;
    width: 100%;
    height: 100%;
}

.wizard > .content > .body input
{
    display: block;
    border: 1px solid #ccc;
}

.wizard > .content > .body input[type="checkbox"]
{
    display: inline-block;
}

.wizard > .content > .body input.error
{
    background: rgb(251, 227, 228);
    border: 1px solid #fbc2c4;
    color: #8a1f11;
}

.wizard > .content > .body label
{
    display: inline-block;
    margin-bottom: 0.5em;
}

.wizard > .content > .body label.error
{
    color: #8a1f11;
    display: inline-block;
    margin-left: 1.5em;
}

.wizard > .actions
{
    position: relative;
    display: block;
    text-align: right;
    width: 100%;
}

.wizard.vertical > .actions
{
    display: inline;
    float: right;
    margin: 0 2.5%;
    width: 95%;
}

.wizard > .actions > ul
{
    display: inline-block;
    text-align: right;
}

.wizard > .actions > ul > li
{
    margin: 0 0.5em;
}

.wizard.vertical > .actions > ul > li
{
    margin: 0 0 0 1em;
}

.wizard > .actions a,
.wizard > .actions a:hover,
.wizard > .actions a:active
{
    background: #007CC1;
    color: #fff;
    display: block;
    padding: 0.5em 1em;
    text-decoration: none;

    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}

.wizard > .actions .disabled a,
.wizard > .actions .disabled a:hover,
.wizard > .actions .disabled a:active
{
    background: #eee;
    color: #aaa;
}

.wizard > .loading
{
}

.wizard > .loading .spinner
{
}



/*
    Tabcontrol
*/

.tabcontrol > .steps
{
    position: relative;
    display: block;
    width: 100%;
}

.tabcontrol > .steps > ul
{
    position: relative;
    margin: 6px 0 0 0;
    top: 1px;
    z-index: 1;
}

.tabcontrol > .steps > ul > li
{
    float: left;
    margin: 5px 2px 0 0;
    padding: 1px;

    -webkit-border-top-left-radius: 5px;
    -webkit-border-top-right-radius: 5px;
    -moz-border-radius-topleft: 5px;
    -moz-border-radius-topright: 5px;
    border-top-left-radius: 5px;
    border-top-right-radius: 5px;
}

.tabcontrol > .steps > ul > li:hover
{
    background: #edecec;
    border: 1px solid #bbb;
    padding: 0;
}

.tabcontrol > .steps > ul > li.current
{
    background: #fff;
    border: 1px solid #bbb;
    border-bottom: 0 none;
    padding: 0 0 1px 0;
    margin-top: 0;
}

.tabcontrol > .steps > ul > li > a
{
    color: #5f5f5f;
    display: inline-block;
    border: 0 none;
    margin: 0;
    padding: 10px 30px;
    text-decoration: none;
}

.tabcontrol > .steps > ul > li > a:hover
{
    text-decoration: none;
}

.tabcontrol > .steps > ul > li.current > a
{
    padding: 15px 30px 10px 30px;
}

.tabcontrol > .content
{
    position: relative;
    display: inline-block;
    width: 100%;
    height: 35em;
    overflow: hidden;
    border-top: 1px solid #bbb;
    padding-top: 20px;
}

.tabcontrol > .content > .body
{
    float: left;
    position: absolute;
    width: 95%;
    height: 95%;
    padding: 2.5%;
}

.tabcontrol > .content > .body ul
{
    list-style: disc !important;
}

.tabcontrol > .content > .body ul > li
{
    display: list-item;
}

如何修复此错误???

1 个答案:

答案 0 :(得分:3)

您已将formBasico变量名称分配给包含.show()方法的内容。

var formBasico = $("#basico").show();

然后您将其附加到.valid()方法...

alert(formBasico.valid());

您只能将.valid()方法附加到表单对象或表单的数据输入元素。但是,在您的情况下,formBasico变量既不代表。

通过仅将.valid()附加到表示表单对象的内容来修复它...

$("#basico").valid()

查看你的jsFiddle,我可以通过将.valid()移到.steps()之外来测试.valid()方法。

https://jsfiddle.net/2uyp1g25/1/

出于某种原因,.steps().steps()方法中调用时停止工作。我正在考虑true它正在返回.valid(),因为在插入onStepChanging之前,Steps插件隐藏了面板。一旦隐藏,表单就会有效,因为你忽略了隐藏的字段。

The documentation for Stepsfalse

  

在步骤更改之前触发,可以通过返回return false来防止步骤更改。对表单验证非常有用。

虽然您的演示证明情况并非如此。

  • 如果我在onStepChangingreturn false,我可以停止这一步;但是我无法在.valid()之前或之后运行任何其他代码。

  • 如果我按照您的方式尝试,则步骤会在.valid()运行之前发生变化,然后onFinishing为真,因为该步骤已隐藏。

我认为这是步骤中的错误。

当我尝试falsewhich states ...

时,我得到的结果相同
  

在完成之前触发,可以通过返回return false来阻止完成。对表单验证非常有用。

我只是将return false放在这里,它甚至不能像上面的文档中所描述的那样工作!如果rules甚至没有停止该步骤,那么您将无法在其中运行任何其他代码。

https://jsfiddle.net/2uyp1g25/2/

为什么有两个完全不同的选项,都被描述为“对表单验证非常有用”哪一个正常工作就足够了?

presently 109 open issues个步骤插件和issues within onStepChanging,其中许多人描述了表单验证问题。自2014年9月以来,此插件似乎也未被更新或维护。

修改

经过更多实验,我发现可以通过将验证规则内联为类名而不是onStepChanging对象内部来“修复”...

https://jsfiddle.net/2uyp1g25/3/

无论你如何声明规则,jQuery Validate都是一样的,所以唯一不同的是它的时间。这只能确认Steps插件在其git remote add origin https://github.com/ni8mr/Local-Weather-App/tree/gh-pages 回调的工作原理方面存在一些严重问题。