javascript - JS动态显示/隐藏多种表单的div

标签 javascript jquery

我在 Rails 中生成了一个表单,允许用户使用“添加对象”按钮添加任意数量的对象实例。对象的每个实例都显示相同的形式。我希望当他们在选择输入中选择特定选项时,该表单能够动态显示一个字段。

我当前的 JS 遇到的问题是,当我更改一个表单上的选择输入时,页面上的其余表单都会反射(reflect)更改。我需要 JS 仅反射(reflect)正在修改的表单上的更改。

# HTML
<form id=edit_application>
    <div class="fields">
        <select class="asset_type">
            <option value="Machinery">Machinery</option>
            <option value="Equipment">Equipment</option>
            <option value="Property">Property</option>
        </select>
        <div class="Machinery">
            # input field
        </div>
        <div class="Equipment">
            # input field
        </div>
        <div class="Property">
            #input field
        </div>
    </div>
    <div class="fields">
        <select class="asset_type">
            <option value="Machinery">Machinery</option>
            <option value="Equipment">Equipment</option>
            <option value="Property">Property</option>
        </select>
        <div class="Machinery">
            # input field
        </div>
        <div class="Equipment">
            # input field
        </div>
        <div class="Property">
            #input field
        </div>
    </div>
</form>

对象表单的每个实例都包含在

<div class="fields"></div>.

我用来在 Rails 中生成嵌套对象表单的 gem 提供了一个触发器,我可以使用该触发器 (nested:fieldAdded) 在添加新实例时运行 JS 函数。

    $(function() {
      $(document).on('nested:fieldAdded', function(event){
        $(".property").hide();
        $(".equipment").hide();
        $(".machinery").hide();
      });
    });

    $(function() {
      $('.asset_type').on('change', function () {
          $( "select option:selected").each(function(){
              if($(this).attr("value")=="Property"){
                  $(".property").show();
                  $(".equipment").hide();
                  $(".machinery").hide();
              }
              if($(this).attr("value")=="Machinery"){
                  $(".machinery").show();
                  $(".property").hide();
                  $(".equipment").hide();
              }
              if($(this).attr("value")=="Equipment"){
                  $(".property").hide();
                  $(".equipment").show();
                  $(".machinery").hide();
              }
          });
      }).change();
    });

上述函数背后的逻辑是,当添加对象的新实例时,应隐藏字段。当用户更改选择输入时,结果应显示正确的 div,并确保其他 div 被隐藏,但是当选择输入更改为“属性”时,它不应更改每个显示的所有字段页面上的表单。

最佳答案

我对 html 做了一些轻微的更改,以便您可以知道您正在查看哪个输入字段。在 asset_type 选项的更改函数内,我得到最接近的字段 div。我使用该引用来过滤您想要显示的 div

HTML

<form id=edit_application>
    <div class="fields">
        <select class="asset_type">
            <option value="Machinery">Machinery</option>
            <option value="Equipment">Equipment</option>
            <option value="Property">Property</option>
        </select>
        <div class="Machinery">
            # machinery input field
        </div>
        <div class="Equipment">
            # equipment input field
        </div>
        <div class="Property">
            # property input field
        </div>
    </div>
    <div class="fields">
        <select class="asset_type">
            <option value="Machinery">Machinery</option>
            <option value="Equipment">Equipment</option>
            <option value="Property">Property</option>
        </select>
        <div class="Machinery">
            # machinery input field
        </div>
        <div class="Equipment">
            # equipment input field
        </div>
        <div class="Property">
            # property input field
        </div>
    </div>
</form>

JQuery

$(function() {
    $(document).on('nested:fieldAdded', function(event){
        $(".property").hide();
        $(".equipment").hide();
        $(".machinery").hide();
    });
});

$(function() {
    $('.asset_type').on('change', function () {
        var foo = $(this).closest(".fields");
        $( "select option:selected").each(function(){
            if($(this).attr("value")=="Property"){
                $(foo).children(".Property").show();
                $(foo).children(".Equipment").hide();
                $(foo).children(".Machinery").hide();
            }
            if($(this).attr("value")=="Machinery"){
                $(foo).children(".Property").hide();
                $(foo).children(".Equipment").hide();
                $(foo).children(".Machinery").show();
            }
            if($(this).attr("value")=="Equipment"){
                $(foo).children(".Property").hide();
                $(foo).children(".Equipment").show();
                $(foo).children(".Machinery").hide();
            }
        });
    }).change();
});

关于javascript - JS动态显示/隐藏多种表单的div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29130645/

相关文章:

javascript - 如何为动态创建的 div 设置动画?

javascript - Wordpress 主题重复但在不同域上显示不同

javascript - 使用jQuery淡入淡出div onclick

javascript - &lt;script&gt; 标签在 jQuery 发布后不起作用

javascript - click 函数不引用 servlet (IDEA, java)

javascript - 将一个数组分成几个 block

jquery - 用于删除重复列表项的更快的 jQuery 代码

javascript - Jquery 替换文本而不删除列表

jquery - 设置属性不起作用

javascript - Angular ui-calendar 事件函数被调用两次