根据 HTML 表单 ID 值动态设置 jquery 选择器

Set jquery selector dynamically based on HTML form ID value

我在一个页面上有多个表单,它们因表单的 ID 而异。 ID 的不同之处在于附加的 _0、_1、_2 等(由 rails 每个 do 循环创建的索引值)。

我正在尝试验证这些表单,但是为了让我的代码保持干燥,我希望表单选择器是动态的。我需要以某种方式获取表单的 ID 值(“_0”)并将其添加到 jQuery 选择器。

这个 Fiddle 举例说明了我现在是如何解决这个问题的。 validation() 块内的代码在 jQuery 函数之间是相同的。我需要将选择器变量设置为如下内容:

$("new_loan_question_answer_"+i)

我不确定如何将 HTML 形式的 _0 或 _1 传递给 jQuery 函数。

形式html

<div class="form">
    <p>Question #1 text</p>
    <form id="question_response_0">
        <input type="text" name="response"></input>
        <input type="submit">
    </form>
</div>
<div class="form">
    <p>Question #2 text</p>
    <form id="question_response_1">
        <input type="text" name="response"></input>
        <input type="submit">
    </form>
</div>

jquery

$(function () {
    $("#question_response_0").validate({
        rules: {
            "response": {
                required: true
            }
        },
        messages: {
            "response": {
                required: 'This field is required'
            }
        },
        errorPlacement: function (error, element) {
            error.insertAfter(element.parent());
        }
    });
});

$(function () {
    $("#question_response_1").validate({
        rules: {
            "response": {
                required: true
            }
        },
        messages: {
            "response": {
                required: 'This field is required'
            }
        },
        errorPlacement: function (error, element) {
            error.insertAfter(element.parent());
        }
    });
});

查看 http://api.jquery.com/submit/ 例如。

如果您使用事件处理程序来调用函数,那么该事件可能包含您需要的信息(提交表单的 ID)。

有关事件对象的信息可在此处获得:http://api.jquery.com/category/events/event-object/

可以使用标记中已经显示的 classes,或添加 class 来形成标签:

$('div.form form').validate({/* options*/}) ;

这将包括与选择器匹配的所有表单,每个表单都有自己的验证实例

不要为增量 id 属性而烦恼。维护起来会很痛苦,并且会导致保持代码干燥的问题。这种东西 正是 classes 的发明目的:

<div class="form">
    <p>Question #1 text</p>
    <form class="question_response"> <!-- < use a common class on the form -->
        <input type="text" name="response"></input>
        <input type="submit">
    </form>
</div>
<div class="form">
    <p>Question #2 text</p>
    <form class="question_response"> <!-- < use a common class on the form -->
        <input type="text" name="response"></input>
        <input type="submit">
    </form>
</div>

现在您只需将验证附加到 .question_response class。不幸的是,当在包含多个表单元素的选择器上实例化时,错误突出显示(以及可能的其他功能)似乎在验证插件中被窃听,因此您需要依次遍历每个表单:

$(function () {
    $('.question_response').each(function() {
        $(this).validate({
            rules: {
                "response": {
                    required: true
                }
            },
            messages: {
                "response": {
                    required: 'This field is required'
                }
            },
            errorPlacement: function (error, element) {
                error.insertAfter(element.parent());
            }
        });
    });
});

Example fiddle