【问题标题】:Simultaneous div show/hide and enable/disable on checkbox check/uncheck using Javascript/jQuery使用 Javascript/jQuery 同时显示/隐藏和启用/禁用复选框选中/取消选中
【发布时间】:2015-10-13 15:59:02
【问题描述】:

我有以下看法:

<div>
    <label id = "show_hide_checkbox_label">Text Input?</label>
    <input type ="checkbox" class="myCheckbox" onchange="show_hide_divs()" />
</div>
<div id="text_div" hidden>
    <label id ="emp_id_input_label">Employee ID:</label>
    <input type="text" name="emp_id" id="employee_id_input"></input>
</div>
<div id="select_div">
     <label id= "emp_id_add_label">Employee ID:</label>
     <select name="emp_id" id = "employee_id">
     <option>--Select--</option>
     <option>INCB001</option>
     <option>INCB002</option>
     <option>INCB003</option>
     </select>
</div>

我想做的是这样的:

默认情况下,复选框未选中,文本框隐藏和禁用,选择元素可见,我只能从选择元素中的选项发布数据,我不能从文本框发布数据。但是,如果我选中该复选框,则选择元素将变为隐藏和禁用,并且文本框可见并启用,并且我只能从文本框发布数据,而不能从选择元素发布数据。如果我再次取消选中该复选框,则行为会反转等等。

不幸的是,下面的 jQuery 代码不允许我在复选框更改时正确禁用/启用和显示/隐藏 div。

这是我的 jQuery 代码:

    <script>
        function show_hide_divs()
        {
                if ($('.myCheckbox').is(':checked'))
                {
                    $("div#text_div").show();
                    $("div#text_div").children().prop('disabled', 'false');
                    $("div#select_div").hide();
                    $("div#select_div").children().prop('disabled', 'true');
                }
                else {
                     $("div#select_div").show();
                     $("div#select_div").children().prop('disabled', 'false');
                     $("div#text_div").hide();
                     $("div#text_div").children().prop('disabled', 'true');
                }
        }
    </script>

我的 jQuery 代码似乎有问题,只是我自己弄不明白。

【问题讨论】:

    标签: javascript jquery html css checkbox


    【解决方案1】:

    您当前的代码很有可能在 DOM 就绪处理程序中,因此该函数实际上隐藏在包装函数的范围内。

    不要在 jQuery 中使用基于属性的事件处理程序。当 jQuery 版本更灵活(支持多个处理程序)时,将事件注册与事件处理程序代码分开是没有意义的。

    此外,对布尔属性设置使用布尔值。如果您使用字符串,这似乎是某些浏览器中的错误:

    http://jsfiddle.net/TrueBlueAussie/3me1og4o/2/

    $(function () {
        $('.myCheckbox').change(function () {
            if ($(this).is(':checked')) {
                $("div#text_div").show();
                $("div#text_div").children().prop('disabled', false);
                $("div#select_div").hide();
                $("div#select_div").children().prop('disabled', true);
            } else {
                $("div#select_div").show();
                $("div#select_div").children().prop('disabled', false);
                $("div#text_div").hide();
                $("div#text_div").children().prop('disabled', true);
            }
        });
    });
    

    这也意味着您可以在处理程序中将点击的checkbox 引用为this,这也更好,因为它可以支持同一页面上的多个控件(然后您将开始制作相对于点击的其他选择器控制)。

    注意:$(function(){}): 只是$(document).ready(function(){}); 的便捷快捷方式

    【讨论】:

    • 所以你建议我应该去掉这个:onchange="show_hide_divs()" 在我的复选框中?
    • 是的。确实...您应该会发现该示例更易于维护,因为处理程序注册和处理程序在一起。
    • 还是不行。选中复选框时,text_div 可见并已启用,但 select_div 仍可见且已启用。我希望整个 select_div 在复选框更改时禁用并隐藏。
    • 根据 Chrome 的 DOM 检查器,选择被禁用且不可见。你用什么来确认这一点?
    • 我使用的是 Mozilla Firefox v.33.0.2
    【解决方案2】:

    检查这个:http://jsfiddle.net/9cdoz896/2/

    JS

    $('.myCheckbox').on('click',function(){
     if ($('.myCheckbox').is(':checked'))
                {
                    $("div#text_div").show();
                    $("div#text_div").children().prop('disabled', false);
                    $("div#select_div").hide();
                    $("div#select_div").children().prop('disabled', true);
                }
                else {
                     $("div#select_div").show();
                     $("div#select_div").children().prop('disabled', false);
                     $("div#text_div").hide();
                     $("div#text_div").children().prop('disabled', true);
                }
        });
    

    CSS

    #text_div{
            display:none;    
    }
    

    HTML

    <div>
        <label id = "show_hide_checkbox_label">Text Input?</label>
        <input type ="checkbox" class="myCheckbox" />
    </div>
    <div id="text_div" >
        <label id ="emp_id_input_label">Employee ID:</label>
        <input type="text" name="emp_id" id="employee_id_input"></input>
    </div>
    <div id="select_div">
         <label id= "emp_id_add_label">Employee ID:</label>
         <select name="emp_id" id = "employee_id">
         <option>--Select--</option>
         <option>INCB001</option>
         <option>INCB002</option>
         <option>INCB003</option>
         </select>
    </div>
    

    【讨论】:

    • 看来@TrueBlueAussies 和您的答案都有完全相同的问题。 div 被永久禁用。应该交替启用 div 的 onchange。
    • 当我取消选中该复选框时,select 未启用。
    • 最好编辑你的答案以匹配你的新 JSFiddle,因为你发布的答案不正确(但你的新 JSFiddle 是)。
    • @TrueBlueAussie: 谢谢
    • 还有 JSFiddle 链接... :)
    【解决方案3】:

    脚本标签是否包含在您的 html 中?或 show_hide_divs 对 DOM 可见的函数(即在 DOM 加载后注册处理程序)。如果脚本在同一个 html 中,则将脚本标签移动到正文标签的末尾。如果它在外部文件中,则首先删除 &lt;script&gt; 标签。 不要使用内联事件处理程序。 这是小提琴:http://jsfiddle.net/mrk_m/g9Lo3u8r/1/
    这个小提琴还解决了您永久禁用元素的问题。它使用 removeProp 和 addProp。

    【讨论】:

    • 脚本在我的 html 文件中。
    • 如果能解释一下您对removePropaddProp 的使用情况会更好,解决了实际问题,而不是只关注window.onload (在 jQuery 问题中,它不如使用 DOM 就绪处理程序好/灵活)。 :)
    • @TrueBlueAussie 同意您的观点,即避免内联方法处理程序并专注于 addProp 和 removeProp。但后来我试图询问 Crescent Moon 是否首先注册事件处理程序。
    • 在 cmets 中提问。我只能按照您发布的答案进行(如果他们按照您的建议将其包装在onload 函数中,这将进一步破坏它)。只需编辑您的答案以专注于真正的问题(您也解决了):)
    • 注意:稍后为内联函数调用注册该函数无关,因为这是在事件时评估的。对于此示例,它可以位于页面中的任何位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    相关资源
    最近更新 更多