0

与此问题相关:使用 jQuery,保持表单的提交按钮处于禁用状态,直到所有必需的文本框、单选、复选框元素都有值(或被选中)

我非常好心地帮助整理了这个功能

    $('input[type=submit]').prop('disabled', true).addClass('disabled');

    var required = $('[required]');

    required.bind('change keyup', function()
    {
        var flag = 0;
        required.each(function()
        {   
            if ($(this).not(':checkbox, :radio').val() || $(this).filter(':checked').val())
            {
                flag++;
            }
        });

        if (flag == required.length)
        {
            $('input[type=submit]').prop('disabled', false).removeClass('disabled');
        }
        else
        {
            $('input[type=submit]').prop('disabled', true).addClass('disabled');
        }
    });

这里发生的是表单的提交按钮一直处于禁用状态,直到所有具有“必需”属性的字段都具有某种值(或已被检查等)。

作为更大图景的一部分,另一个 jQuery 函数(工作正常)根据选择框的值隐藏其中一些字段。

实际上,当这些字段被隐藏时,应该删除所需的属性。删除 required 属性后,我希望上述函数只计算 (required.length) 剩余的必填字段,但实际上,它会计算所有这些字段——即使是那些不再具有 required 属性的字段。

关于解决这个问题的任何想法?

4

3 回答 3

1

您一遍又一遍地比较同一组元素。您需要在每次检查期间重新选择您需要的那些。

改变

required.each(function()

$([required]).each(function()

您正在选择所有元素,然后循环遍历它们,而不管它们现在具有什么属性。您希望 jQuery 重新选择现在具有该required属性的元素,以便获得更新的列表。然后,这应该按您的预期执行。

于 2013-07-09T15:58:30.347 回答
1

你不仅删除了required属性,而且 1..unbind('change keyup')对于这个元素 2. 从集合中删除它required = required.not('[required]');

这个小提琴给出了基本的想法:在你点击按钮之前,两个必需的输入都会提醒他们的号码,在你点击它之后,总长度会减少,第二个输入会停止提醒

change keyup如果您再次要求它,请不要忘记绑定

于 2013-07-09T16:16:28.357 回答
1

你可以加:

|| $(this).css('display') === 'none')

到 if around flag++。

于 2013-07-09T16:27:27.197 回答