【问题标题】:Disable form-group input by javascript通过javascript禁用表单组输入
【发布时间】:2016-08-26 20:47:48
【问题描述】:

我在 jsp 中有一个表单,其中输入字段为菜肴名称、菜肴成分、价格、禁用输入字段的按钮和添加新菜单的加号按钮,如下所示:

JSP:

<form id="menuForm" method="post" class="field_wrapper form-horizontal" action="anotherMenu.jsp"> 
   <div class="menu_item">
       <div class="form-group">
            <label class="col-sm-1 control-label">Menu</label> 
            <div class="col-sm-2">
                 <input type="text" id="dishname" class="form-control" name="dishname[0]" placeholder="Enter dish name"/>
            </div>  
            <div class="col-sm-4">
                 <input type="text" id="ingredient" class="form-control" name="ingredient[0]" placeholder="Dish ingredients"/>
            </div>
            <i class="col-sm-1 control-label fa fa-inr"></i>
            <div class="col-sm-1">
                 <input type="number" id="price" class="form-control" name="price[0]" placeholder="Rs. /-" pattern="[0-9]*"/>
            </div>
            <div class="col-sm-1">
                 <button type="button" class="activate btn btn-default">Disable</button>
            </div>
            <div class="col-sm-1">
                 <button type="button" class="btn btn-default addButton" id="addInput"><i class="fa fa-plus"></i></button>
            </div>
       </div>
   </div>
       <div class="form-group">
           <div class="col-sm-4 col-sm-offset-1">
                <button type="submit" class="btn btn-default">Submit</button>
           </div>
       </div>

脚本:

   <script>
            $(document).ready(function() {
                (function ($) {
                    $.fn.toggleDisabled = function() {
                        return this.each(function () {
                            var $this = $(this);
                            if($this.attr('disabled')) {
                               $this.removeAttr('disabled');
                            }
                            else { 
                               $('.activate').text("Active");
                               $this.attr('disabled', 'disabled'); 
                            }
                        });
                    };
                })(jQuery);
                $(function() {
                    $('.activate').click(function() {
                        $('.activate').text("Disable");
                        $('input:text').toggleDisabled();
                        $('#price').toggleDisabled();
                    });
                });

                var max_field = 10, //validate for maximum input field
                    wrapper = $(".field_wrapper"),
                    add_button = $(".addButton"),                
                    x = 1, //used to increase the input field.
                    index = 0;  //used to increment the 'name' for the input

                //Add button click handler    
                $(add_button).on('click', function (e) {
                    e.preventDefault();
                    if(x < max_field) {
                        x++;
                        index++;  
                        var fieldHTML = '<div class="form-group removeGroup">\n'
                                  +'<label class="col-sm-1 control-label">Menu</label>\n' 
                                  +'<div class="col-sm-2">\n'
                                       +'<input type="text" id="dishname" class="form-control" name="dishname[' + index + ']" placeholder="Enter dish name"/>\n'
                                  +'</div>\n'  
                                  +'<div class="col-sm-4">\n'
                                      +'<input type="text" id="ingredient" class="form-control" name="ingredient[' + index + ']" placeholder="Dish ingredients"/>\n'
                                  +'</div>\n'
                                  +'<i class="col-sm-1 control-label fa fa-inr"></i>\n'
                                  +'<div class="col-sm-1">\n'
                                      +'<input type="text" id="price" class="form-control" name="price[' + index + ']" placeholder="Rs. /-"/>\n'
                                  +'</div>\n'
                                  +'<div class="col-sm-1">\n'
                                      +'<button type="button" class="activate btn btn-default" id="active">Disable</button>\n'
                                  +'</div>\n'
                                  +'<div class="col-sm-1">\n'
                                      +'<button type="button" class="btn btn-default removeButton"><i class="fa fa-minus"></i></button>\n'
                                  +'</div>\n'
                                +'</div>';

                        var currentEntry = $(this).parents('.menu_item:first');
                        $(fieldHTML).appendTo(currentEntry);
                    }
                });                

                //Remove button click handler
                $(wrapper).on('click', '.removeButton', function(e) {
                    e.preventDefault();
                    $(this).closest('.removeGroup').remove();
                    x--;
                });                
            });
        </script>

问题:当我点击第一个 Disable 按钮时,所有输入都禁用,如下图所示:

我想通过相应的“禁用”按钮禁用特定的表单组输入。我知道脚本中的问题,但是如何解决它。请帮忙。

谢谢!

【问题讨论】:

    标签: javascript jquery html forms jsp


    【解决方案1】:

    我想通过相应的“禁用”按钮禁用特定的表单组输入。我知道脚本中的问题,但是如何解决它。

    你不能像你一样为新创建的表单组附加点击事件:

    $('.activate').click(function() {
    

    这个事件必须像你在这一行中那样被委派:

    $(wrapper).on('click', '.removeButton', function(e) {
    

    此外,ID 必须是唯一的,不要对多个元素使用相同的 id。 例如,您可以考虑将 id price 更改为 class。

    当您点击“禁用”按钮时,您只需找到相关的输入:

    $(this).closest('div.form-group').find('#price, input:text')
    

    您的 toggleDisabled 扩展方法必须重写。

    我的代码:

    $.fn.toggleDisabled = function(obj) {
      var newState = false;
      if (obj.textContent == 'Disable') {
        obj.textContent = 'Active';
        newState = true;
      } else {
        obj.textContent = 'Disable';
      }
      return this.each(function (index, element) {
        element.disabled = newState;
      });
    };
    
    
    $(document).ready(function() {
      
      // 
      // this is the new event delegated handler
      //
      $('.field_wrapper').on('click', '.activate', function(e) {
        $(this).closest('div.form-group').find('#price, input:text').toggleDisabled(this);
      });
    
      
      
      var max_field = 10, //validate for maximum input field
          wrapper = $(".field_wrapper"),
          add_button = $(".addButton"),
          x = 1, //used to increase the input field.
          index = 0;  //used to increment the 'name' for the input
    
      //Add button click handler
      $(add_button).on('click', function (e) {
        e.preventDefault();
        if(x < max_field) {
          x++;
          index++;
          var fieldHTML = '<div class="form-group removeGroup">\n'
          +'<label class="col-sm-1 control-label">Menu</label>\n'
          +'<div class="col-sm-2">\n'
          +'<input type="text" id="dishname" class="form-control" name="dishname[' + index + ']" placeholder="Enter dish name"/>\n'
          +'</div>\n'
          +'<div class="col-sm-4">\n'
          +'<input type="text" id="ingredient" class="form-control" name="ingredient[' + index + ']" placeholder="Dish ingredients"/>\n'
          +'</div>\n'
          +'<i class="col-sm-1 control-label fa fa-inr"></i>\n'
          +'<div class="col-sm-1">\n'
          +'<input type="text" id="price" class="form-control" name="price[' + index + ']" placeholder="Rs. /-"/>\n'
          +'</div>\n'
          +'<div class="col-sm-1">\n'
          +'<button type="button" class="activate btn btn-default" id="active">Disable</button>\n'
          +'</div>\n'
          +'<div class="col-sm-1">\n'
          +'<button type="button" class="btn btn-default removeButton"><i class="glyphicon glyphicon-minus"></i></button>\n'
          +'</div>\n'
          +'</div>';
    
          var currentEntry = $(this).parents('.menu_item:first');
          $(fieldHTML).appendTo(currentEntry);
        }
      });
    
      //Remove button click handler
      $(wrapper).on('click', '.removeButton', function(e) {
        e.preventDefault();
        $(this).closest('.removeGroup').remove();
        x--;
      });
    });
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
    <script src="https://code.jquery.com/jquery-1.12.1.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    
    <form id="menuForm" method="post" class="field_wrapper form-horizontal" action="anotherMenu.jsp">
        <div class="menu_item">
            <div class="form-group">
                <label class="col-sm-1 control-label">Menu</label>
                <div class="col-sm-2">
                    <input type="text" id="dishname" class="form-control" name="dishname[0]" placeholder="Enter dish name"/>
                </div>
                <div class="col-sm-4">
                    <input type="text" id="ingredient" class="form-control" name="ingredient[0]" placeholder="Dish ingredients"/>
                </div>
                <i class="col-sm-1 control-label fa fa-inr"></i>
                <div class="col-sm-1">
                    <input type="number" id="price" class="form-control" name="price[0]" placeholder="Rs. /-" pattern="[0-9]*"/>
                </div>
                <div class="col-sm-1">
                    <button type="button" class="activate btn btn-default">Disable</button>
                </div>
                <div class="col-sm-1">
                    <button type="button" class="btn btn-default addButton" id="addInput"><i class="glyphicon glyphicon-plus"></i></button>
                </div>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-4 col-sm-offset-1">
                <button type="submit" class="btn btn-default">Submit</button>
            </div>
        </div>
    </form>

    【讨论】:

    • 感谢您的回答,但它对我不起作用。它给了我一个控制台错误Uncaught TypeError: $(...).closest(...).find(...).toggleDisabled is not a function
    • @JackGharu 您需要在页面的 head 部分包含 css 和 js:在我的 sn-p 中查看我的“
    • 我还在head部分添加了给定的css和js,但它也给了我同样的错误。
    • 现在,当我在$(document).ready() 中放置toggleDisabled 扩展方法时它的工作。再次感谢您的回答和建议。
    猜你喜欢
    • 2013-04-02
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多