Chosen.js并验证jquery

时间:2012-04-30 17:01:17

标签: javascript jquery validation jquery-chosen

我正在使用validate.jquery.js:工作正常。 但是当我添加selected.js时,对选择下拉列表的验证不再有效。

这是JS我正在使用http://pastebin.com/S9AaxdEN

这是我的选择形式:

<select name="category" id="category" placeholder="" class="{validate:{required:true}}">
<option value=""><?php echo lang('category_choice'); ?></option>
<option value="vtt">VTT</option>
<option value="autre">Autre type de v&eacute;lo</option>
</select>

不知道为什么choose.js禁用验证,任何想法?

4 个答案:

答案 0 :(得分:18)

您可以通过添加“chzn-done”类来解决这个问题,该类不会将“ignore”属性设置为“validate.settings”:

var settings = $.data($('#myform')[0], 'validator').settings;
settings.ignore += ':not(.chzn-done)';

example

HTML:

<form method="post" id="form1" action="">
    <fieldset>
        <legend>Login Form</legend>
        <div>
            <label>datos</label>
            <select name="data-select" title="data-select is required" class="chzn-select {required:true}" style="width:150px;">
                <option></option>
                <option value="1">uno</option>
                <option value="2">dos</option>
            </select>
        </div>
        <div>
            <label for="phone">Phone</label>
            <input id="phone" name="phone" class="some styles {required:true,number:true, rangelength:[2,8]}" />
        </div>
        <div>
            <label for="email">Email</label>
            <input id="email" name="email" class="{required:true,email:true}">
        </div>

        <div class="error"></div>
        <div>
            <input type="submit" value="enviar datos"/>
        </div>
    </fieldset>
</form>

JS:

$(function() {

    var $form = $("#form1");

    $(".chzn-select").chosen({no_results_text: "No results matched"});
    $form.validate({
        errorLabelContainer: $("#form1 div.error"),
        wrapper: 'div',
    });

    var settings = $.data($form[0], 'validator').settings;
    settings.ignore += ':not(.chzn-done)';

    $('form').each(function(i, el){

        var settings = $.data(this, 'validator').settings;
        settings.ignore += ':not(.chzn-done)';

    });

});

答案 1 :(得分:5)

我只想添加一个错误放置,它会将元素附加到隐藏的旁边,因此您可能希望通过在验证函数上使用以下代码作为选项参数来更改放置

errorPlacement: function(error,element) {
        if (element.is(":hidden")) {
            //console.log(element.next().parent());
            element.next().parent().append(error);
        }
        else {
            error.insertAfter(element);
        }

    }

答案 2 :(得分:3)

这不仅可以解决无法看到验证的问题,还可以将标准“input-validation-error”类应用于selected.js样式选择。

有两种情况需要在提交表单和选择更改时应用它。请参阅下面的代码的三个部分。

  1. 第一个设置表单验证以验证隐藏元素。
  2. 第二个检查提交时选择的验证。
  3. 第三个检查更改时选择的验证。
  4. 设置表单验证以显示隐藏:

    var validator = $("#FormID").data('validator');
    validator.settings.ignore = ":hidden:not(select)";
    

    检查表单提交:

    $('#FormID').on('submit', function () {
        var ChosenDropDowns = $('.chzn-done');
        ChosenDropDowns.each(function (index) {
            var ID = $(this).attr("id");
            if (!$(this).valid()) 
            {
                $("#" + ID + "_chzn a").addClass("input-validation-error");
            }
            else 
            {
                $("#" + ID + "_chzn a").removeClass("input-validation-error");
            }
        });
    });
    

    检查选择更改:

    $(".chzn-select").chosen().change(function () {
        var ID = $(this).attr("id");
        if (!$(this).valid()) {
            $("#" + ID + "_chzn a").addClass("input-validation-error");
        }
        else {
            $("#" + ID + "_chzn a").removeClass("input-validation-error");
        }
    });
    

答案 3 :(得分:0)

在提交表单之后,还存在验证所选择的选择菜单的问题。如果菜单上有验证错误,则将菜单更改为有效,验证错误不会消失。表格仍然可以提交,但鉴于显示验证错误,这一点并不明显。

以下是使用invalidHandlervalid()修复此问题的一个示例。

// We'll use this flag so we don't have to validate fields before
// the form has been submitted.
var validatingForm = false;

// This line before validate() is called allows
// chosen menus to be validated
$.validator.setDefaults({ ignore: ":hidden:not(select)" });

$("#yourForm").validate({
    invalidHandler: function() {
        // Now we can validate the fields onChange
        validateForm = true;
    },
        rules: {
            // Probably your validation rules here
        }
    });

//  Now set an onChange event for the chosen menu
$("yourChosenMenu").change(function(){

    // Check that we've tried to submit the form
    if(validateForm) {
        // We tried to submit the form, re-validate on change
        $("yourChosenMenu").valid();
    }
});