【问题标题】:Validating select box with jquery validate and chosen plugins使用 jquery validate 和选择的插件验证选择框
【发布时间】:2013-02-13 19:11:46
【问题描述】:

我正在尝试同时使用 validate 和 selected 插件。我在验证选择框时遇到问题。我发现了类似的问题 How can I use jQuery validation with the "chosen" plugin?Chosen.js and validate jquery 但我找不到将解决方案导入我的代码的方法:

<form  class='myform' id='producteditform'>
                    <input type='hidden' value='<? echo $row['id']; ?>' name='pkedit' id='pkedit'>                   
                    <input type='hidden' value='save' name='operation' id='operation'>
                    <p><label for='nameedit'>Product Name</label><em>*</em><input id='nameedit' name='nameedit' value='<? echo $row['pname']?>'/></p>
                    <p><label for='unitedit'>Unit</label><em>*</em><?
                        $query="select * from units";
                        $result=$mysqli->query($query);
                        if($result->num_rows==0)
                        echo "<a href='units.php?operation=insert'>No unit found. Please define a unit first</a>";
                        else{               
                        echo    "<select class='chosen' id='unitedit' name='unitedit'>";        
                            while($row=$result->fetch_assoc())
                              echo  "<option value='".$row['id']."'>".$row['name']."</option>";
                            echo    "</select>";
                        }
                        $mysqli->close();               

                    ?></p>                    
                    <p><a class='button' class='button' id='saveedit'>Save</a>
                    <a class='button' id='canceledit' onclick='f()' >Cancel</a></p>
                    </form>

jquery 代码

$("#save").click(function () {
        if($("#producteditform").validate({ 
         ignore: [], 
                rules: {
                  nameedit: {
                    required: true,
                    maxlength:100

                  },
                  unitedit:{
                    required: true,
                  }

                }
              }).form()
            )
        {
            // do sth

                })
        }
}

html 渲染输出

<form class="myform" id="productform" novalidate="novalidate">
                    <input type="hidden" value="insert" name="operation" id="operation">

                    <p><label for="name">Product Name</label><em>*</em><input type="text" name="name" id="name"></p>
                    <p><label for="unit">Unit</label><em>*</em><select class="chosen chzn-done" id="unit" name="unit" style="display: none;"><option value="">please choose..</option><option value="1">kgg</option></select><div id="unit_chzn" class="chzn-container chzn-container-single" style="width: 200px;" title=""><a href="javascript:void(0)" class="chzn-single" tabindex="-1"><span>please choose..</span><div><b></b></div></a><div class="chzn-drop" style="left: -9000px; width: 198px; top: 24px;"><div class="chzn-search"><input type="text" autocomplete="off" style="width: 163px;"></div><ul class="chzn-results"><li id="unit_chzn_o_0" class="active-result result-selected" style="">please choose..</li><li id="unit_chzn_o_1" class="active-result" style="">kgg</li></ul></div></div></p>
                    <p><a class="button" id="save">Save</a>
                    <a class="button" id="cancel" onclick="f()">Cancel</a></p>                  
                    </form>

当我删除 class='chosen' 时,单击保存按钮时一切正常,否则我收到错误 Uncaught Error: Failed to validate, found an element with no name assigned。请参阅控制台以获取元素参考。

【问题讨论】:

  • 您需要显示更多代码,并详细说明它应该如何工作以及您想要什么。什么event 或函数正在调用您的if 语句?如果表单有效,你想做什么?
  • 另外,显示您的渲染 HTML 输出。您的原始 PHP 对回答这个问题毫无用处。

标签: jquery jquery-validate jquery-chosen


【解决方案1】:

试试这样吧。

$(document).ready(function() {

    // initialize the plugin on DOM ready
    $("#producteditform").validate({ 
        // all rules and options,
        rules: {
            nameedit: {
                required: true,
                maxlength:100
            },
            unitedit:{
                required: true,
            }
        }
    });

    // test for valid form
    $('#save').on('click' function() {
        if($("#producteditform").valid()) {
            // do this on valid form
        } else {
            // do this on invalid form
        }
    });

});

$('#producteditform').validate() initializes the validate pluginform

$('#producteditform').valid() programmatically triggers an actual validation test 并返回一个 true/false 布尔值。


或者,由于您的eventsubmit 事件上的click 形式,那么您只需使用内置的submitHandler 回调函数即可。 (无需创建另一个click 处理程序。)

$(document).ready(function() {

    // initialize the plugin on DOM ready
    $("#producteditform").validate({ 
        // all rules and options,
        rules: {
            nameedit: {
                required: true,
                maxlength:100
            },
            unitedit:{
                required: true,
            }
        },
        submitHandler: function(form) {
            // do this on valid form
        }
    });

});

完整文档:

http://docs.jquery.com/Plugins/Validation


在您显示 HTML 输出而不是 PHP 之前,这里有一个通用示例,说明如何验证 select 元素:

http://jsfiddle.net/6Dt7F/

重要的是,select 元素中的第一个或默认 option 必须包含 value="" 否则 required 规则将失败。

<select name="field1">
    <option value="">please choose...</option>
    <option>option 1</option>
    <option>option 2</option>
    <option>option 3</option>
</select>

编辑

我仍然没有足够的代码来制作一个有效的演示。但是,由于chosen 插件隐藏了实际的表单元素,您必须执行以下操作...

1) 定位将被验证并传递数据的实际表单元素,而不是chosen 创建的可视元素。

2) Enable jQuery Validate to work on hidden elements 通过设置ignore: [] 选项。

试试这个...

$(document).ready(function () {

    // initialize the plugin on DOM ready
    $("#producteditform").validate({ 
        // all rules and options,
        ignore: [], // <-- option so that hidden elements are validated
        rules: {
            name: {  // <-- name of actual text input
                required: true,
                maxlength: 100
            },
            unit:{  // <-- name of actual select input
                required: true
            }
        },
        submitHandler: function(form) {
            // do this on valid form
        }
    });

});

【讨论】:

  • 它仍然无法正常工作。我必须在onready里面写验证吗?目前在 $("#save").click(function ().
  • @woryzower,是的,这正是问题所在。 .validate() 必须在 DOM 内部调用,以便正确初始化。你不要把它放在点击处理程序中,因为submitHandler 回调选项已经处理了点击。我的答案的第一部分对此进行了解释。
【解决方案2】:

这是因为 Chosen 插入了一个输入字段,用户可以使用该字段在下拉列表中进行搜索。

出于某种原因,此搜索字段 没有 有名称标签(因此出现错误):

<input type="text" autocomplete="off" tabindex="7">

输入也没有类或 ID,这可能是控制台错误如此模糊的原因。一个快速的解决方法是给它一个名字:

$(".chzn-search input").attr('name', 'chzn-search');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多