jQuery - 基于另一个字段选择值禁用输入字段

Posted

技术标签:

【中文标题】jQuery - 基于另一个字段选择值禁用输入字段【英文标题】:jQuery - disable input field based on another field selected value 【发布时间】:2011-04-13 11:51:36 【问题描述】:

我正在寻找一个可以做到这一点的 jQuery 插件。

例如:

<label><input type="checkbox" depends_on="foo=5" name="boo" ... /> Check </label>
<select name="foo" ... >
  <option value="5" selected="selected">5</option>
  <option value="15">15</option>
  <option value="25">25</option>
</select>

所以只有在下面选择了“5”选项时才会启用该复选框。

<select name="foo" depends_on="boo" ... >
  <option value="5" selected="selected">5</option>
  <option value="15">15</option>
  <option value="25">25</option>
</select>

<label><input type="checkbox" name="boo" ... /> Check </label>

在这种情况下,只有在选中“boo”时才应启用选择。

我设法想出了一个代码来做这样的事情:

$("*[depends_on]").each(function()

  var source = $(this);
  var dep = $(this).attr('depends_on');
  var target = dep.split("=");

  $("*[name='"+target[0]+"']:not(:hidden)").change(function()
    if($(this).attr('checked')) 
     source.removeClass('disabled');
     source.removeAttr('disabled');
    
    else
     source.attr('disabled', 'disabled');
     source.addClass('disabled');
    

  ).change();

);

对于依赖无线电的选择似乎可以正常工作,但我想为任何类型的输入或组合(或至少大部分)实现这一点,而不必为每种类型的输入编写单独的代码。

无论如何,有人知道这样的插件吗?或者对我上面的代码有什么建议? :)

【问题讨论】:

【参考方案1】:

给你 :-)

http://jsfiddle.net/balupton/cxcmf/


(function($)
    /**
     * jQuery.fn.dependsOn
     * @version 1.0.1
     * @date September 22, 2010
     * @since 1.0.0, September 19, 2010
     * @package jquery-sparkle @link http://www.balupton/projects/jquery-sparkle
     * @author Benjamin "balupton" Lupton @link http://www.balupton.com
     * @copyright (c) 2010 Benjamin Arthur Lupton @link http://www.balupton.com
     * @license Attribution-ShareAlike 2.5 Generic @link http://creativecommons.org/licenses/by-sa/2.5/
     */
    $.fn.dependsOn = function(source,value)
        var $target = $(this),
            $source = $(source),
            source = $source.attr('name')||$source.attr('id');

        // Add Data
        var dependsOnStatus = $target.data('dependsOnStatus')||;
        dependsOnStatus[source] = false;
        $target.data('dependsOnStatus',dependsOnStatus);

        // Add Event
        $source.change(function()
            var pass = false;
            var $source = $(this); // so $source won't be a group for radios

            // Determine
            if ( (value === null) || (typeof value === 'undefined') ) 
                // We don't have a value
                if ( $source.is(':checkbox,:radio') ) 
                    pass = $source.is(':selected:enabled,:checked:enabled');
                
                else 
                    pass = Boolean($source.val());
                
            
            else 
                // We do have a value
                if ( $source.is(':checkbox,:radio') ) 
                    pass = $source.is(':selected:enabled,:checked:enabled') && ($source.val() == value);
                
                else 
                    pass = $source.val() == value;
                
            

            // Update
            var dependsOnStatus = $target.data('dependsOnStatus')||;
            dependsOnStatus[source] = pass;
            $target.data('dependsOnStatus',dependsOnStatus);

            // Determine
            var passAll = true;
            $.each(dependsOnStatus, function(i,v)
                if ( !v ) 
                    passAll = false;
                    return false; // break
                
            );
            // console.log(dependsOnStatus);

            // Adjust
            if ( !passAll ) 
                $target.attr('disabled','disabled').addClass('disabled');
            
            else 
                $target.removeAttr('disabled').removeClass('disabled');
            
        ).trigger('change');

        // Chain
        return this;
    ;


)(jQuery);

举个例子:

Javascript:

    $(function()
        $('#foo').dependsOn('#boo').dependsOn('#moo','test')
            .dependsOn(":radio[name=doo]",'true');
    );

HTML:

<div>
    <select name="foo" id="foo" >
        <option value="5" selected="selected">5</option>
        <option value="15">15</option>
        <option value="25">25</option>
    </select>
    <input type="text" name="moo" id="moo" />
    <input type="checkbox" name="boo" id="boo" />
    <input type="radio" name="doo" value="false" />
    <input type="radio" name="doo" value="true" />
    <br/>
    Type test in the textbox and check the checkbox to enable the select.
    <br/>
    By <a href="http://www.balupton.com" target="_blank">Benjamin "balupton" Lupton</a>, for <a href="http://***.com/q/3731586/130638" target="_blank">a *** Question</a>
</div>

【讨论】:

谢谢。你做得很棒!唯一的问题是 input.dependsOn(radio=value) 似乎不起作用 我发现触发器导致更改事件在所有单选按钮上触发,从而导致禁用状态被切换。这是我的固定版本。 jsfiddle.net/rcollette/8V2ru【参考方案2】:

我想出了这个代码:

$("input[target]").change(function()
            var target = $("[name='"+$(this).attr("target")+"']");
            if($(this).is(":checked"))             
                target.attr("oldvalue",target.val()).val($(this).val());
            else
                target.val(target.attr("oldvalue"));
            
        );
        $("select").change(function()
            $("[target='"+ $(this).attr("name") +"'][value='"+ $(this).val() +"']").attr('checked', true);
        );

对于 html 格式:

<label><input type="checkbox" target="foo" value="15"/> Check </label>
    <select name="foo">
      <option value="5" selected="selected">5</option>
      <option value="15">15</option>
      <option value="25">25</option>
    </select>

所以基本上,您所要做的就是在输入上有一个“目标”属性,该属性应该与您要绑定到的下拉列表的“名称”属性相匹配。也设置输入的值,当它被选中时,它应该选择其对应下拉列表的值。

【讨论】:

感谢 xar,但根据另一个输入状态分配值并不是我真正想要的。【参考方案3】:

jQuery disable button (NOT Submit) until field validates + Validation Plugin

jQuery enable/disable show/hide button w/ SELECT options. Get remaining option values

jQuery disable SELECT options based on Radio selected (Need support for all browsers)

【讨论】:

谢谢,但以上链接都没有真正回答我的问题。【参考方案4】:

dependjs 在 HTML 中定义依赖关系。

<select name="foo">
  <option value="5" selected="selected">5</option>
  <option value="15">15</option>
  <option value="25">25</option>
</select>

<label><input type="checkbox" depend=[enabled=>[name=foo] option[value='5']] /> Check </label>

依赖是在依赖元素中定义的。

【讨论】:

以上是关于jQuery - 基于另一个字段选择值禁用输入字段的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个字段的值启用/禁用对某些字段的输入

Rails 4:如何在 Rails 中使用 JQuery 禁用基于复选框值的文本字段

如何根据垫单选按钮的值禁用垫输入字段?

jquery bootstrap Validation:多个输入值的总和,如果不等于其他输入字段,则禁用提交按钮

JQuery 根据另一个字段的值替换选择选项标签

Jquery:将值数组从一个数组输入传递到另一个数组输入字段