jquery根据状态数组禁用提交按钮

Posted

技术标签:

【中文标题】jquery根据状态数组禁用提交按钮【英文标题】:jquery disable submit button based on status array 【发布时间】:2012-06-01 08:09:34 【问题描述】:

我正在尝试进行自己的自定义表单验证。我想维护一个状态数组,每个字段都有自己的键:值(值是“好”或“坏”)。当数组包含“坏”时,我想禁用提交按钮。

错误/成功消息在每个字段旁边工作(我的 ajax 工作正常),但我无法禁用提交按钮。

$(function() 
    // Custom Validation
    var statusArray = 
        'email' : 'good',
        'passC' : 'good',
        'pass1' : 'good',
        'pass2' : 'good'
    
    $("#email").blur(function() 
        var form_data = email: $("#email").val()
        $.ajax(
            url: "<?= base_url('lounge/validation/email'); ?>",
            type: 'POST',
            data: form_data,
            success: function(msg) 
                if (msg['status'] == false)
                    $('#email_status').html('<span class="lounge_error">'+msg['message']+'</span>');
                    statusArray['email'] = 'bad';
                
                else 
                    $('#email_status').html('<span class="lounge_okay">'+msg['message']+'</span>');
                    statusArray['email'] = 'good';
                
            
        );
        statusCheck();
        return false;
    )
    // Password fields validation
    $('#change_password').change(function () 
        if ($(this).attr("checked")) 
            $('#current_password_status').html('').css("display": "inline-block");
            $('#new_password1_status').html('').css("display": "inline-block");
            $('#new_password2_status').html('').css("display": "inline-block");
            $("#current_password").blur(function() 
                var form_data = password: $("#current_password").val()
                $.ajax(
                    url: "<?= base_url('lounge/validation/password'); ?>",
                    type: 'POST',
                    data: form_data,
                    success: function(result) 
                        if (result['status'] == false)
                            $('#current_password_status').html('<span class="lounge_error">'+result['message']+'</span>');
                            statusArray['passC'] = 'bad';
                        
                        else 
                            $('#current_password_status').html('<span class="lounge_okay">'+result['message']+'</span>');
                            statusArray['passC'] = 'good';
                        
                    
                );
                statusCheck();
                return false;
            );
            $("#new_password1").blur(function() 
                var form_data = pass1: $("#new_password1").val()
                $.ajax(
                    url: "<?= base_url('lounge/validation/newpass1'); ?>",
                    type: 'POST',
                    data: form_data,
                    success: function(result) 
                        if (result['status'] == false)
                            $('#new_password1_status').html('<span class="lounge_error">'+result['message']+'</span>');
                            statusArray['pass1'] = 'bad';
                        
                        else 
                            $('#new_password1_status').html('<span class="lounge_okay">'+result['message']+'</span>');
                            statusArray['pass1'] = 'good';
                        
                    
                );
                statusCheck();
                return false;
            );
            $("#new_password2").blur(function() 
                var form_data = pass2: $("#new_password2").val()
                $.ajax(
                    url: "<?= base_url('lounge/validation/newpass2'); ?>",
                    type: 'POST',
                    data: form_data,
                    success: function(result) 
                        if (result['status'] == false)
                            $('#new_password2_status').html('<span class="lounge_error">'+result['message']+'</span>');
                            statusArray['pass2'] = 'bad';
                        
                        else 
                            $('#new_password2_status').html('<span class="lounge_okay">'+result['message']+'</span>');
                            statusArray['pass2'] = 'good';
                        
                    
                );
                statusCheck();
                return false;
            );
         else 
            $('#current_password_status').html('').css("display": "none");
            $('#new_password1_status').html('').css("display": "none");
            $('#new_password2_status').html('').css("display": "none");

        
    );

);

function statusCheck() 
    var status = [];
    $.each(statusArray, function(key, value) 
        status.unshift(value);
    );
    if ($.inArray('bad', status) == '-1') 
        $("button[type=submit]").removeAttr("disabled");
     else 
        $("button[type=submit]").attr("disabled", true);
    

【问题讨论】:

【参考方案1】:

如下更新您的状态检查:

function statusCheck() 
    var isValid = true;
    $.each(statusArray, function(key, value) 
        if(value == 'bad')
            isValid = false;
    );
    if (isValid) 
        $("button[type=submit]").removeAttr("disabled");
     else 
        $("button[type=submit]").attr("disabled", "disabled");
    

$(document).ready(function()statusCheck(););

也许您只是错过了在 jquery 就绪部分调用它。但是这段代码比使用数组检查状态要好。

【讨论】:

nune,我认为您的答案比 $("button[type=submit]") 调用的修订更接近解决方案...我已经让 $("button[type=submit]").attr("disabled", true) 与过去的实验一起工作。这段代码仍然不起作用,当我在 ready 函数中包含 statusCheck() 时,它会破坏一切。 我看不出它怎么会破坏一切。你能提供一个jsfiddle吗?是的,您可以将属性值设置为任何值。大多数浏览器会忽略该部分。 我试图做一个 jsfiddle,但脚本依赖于从我的服务器中提取页面/脚本的 ajax 成功消息。出于某种原因,它似乎不适用于 jsfiddle。为了回答您的问题,当我尝试 $(function() statusCheck(); 时,没有任何效果......包括我对服务器的 ajax 调用以检查每个字段。不知道为什么……还没有完全弄清楚。 我将尝试修改此页面以适应 jsfiddle,而无需任何服务器端请求。即将推出。 这是我的小提琴:jsfiddle.net/pSx4u。更改 statusArray 中的值并进行测试。完美运行。【参考方案2】:

你可以试试

  $("button[type=submit]").prop("disabled", true);

【讨论】:

谢谢@thecodeparadox 我试过这个但没有成功。我怀疑问题可能出在其他地方......因为我之前在其他应用程序中使用过 $("button[type=submit]").attr("disabled", true)【参考方案3】:

变化:

$("button[type=submit]").attr("disabled", true);

对此(Jquery 1.6+):

$("button[type=submit]").prop('disabled', true);

或者这个:

$("button[type=submit]").attr('disabled', 'disabled');

【讨论】:

谢谢@fbfcn 我尝试了这两个建议,但没有成功。我怀疑问题可能出在其他地方......因为我之前在其他应用程序中使用过 $("button[type=submit]").attr("disabled", true)

以上是关于jquery根据状态数组禁用提交按钮的主要内容,如果未能解决你的问题,请参考以下文章

根据禁用/启用状态替换按钮文本

使用 Jquery 在第一次单击时禁用提交按钮

jQuery UI 禁用整个页面上的所有提交按钮

ASP.NET JQuery,禁用表单提交按钮不调用 httpPost 操作

如果电子邮件已使用 jquery 在 php 中注册,则禁用提交按钮 [重复]

jquery:重置后禁用/启用按钮不起作用