【问题标题】:JQuery How to hide/show dynamic number of divs all with unique idJQuery如何隐藏/显示所有具有唯一id的div的动态数量
【发布时间】:2015-01-01 02:48:03
【问题描述】:

我不太擅长 JQuery,但我正在努力学习。我正在根据数据库中定义的“事件”数量来呈现“里程碑”数字字段的数量。因此,对于 2 个事件,将有 2 个数字字段。我遇到的麻烦是隐藏所有字段,并且仅根据“事件”选择字段中的选择显示一个。这是sn-ps的代码:

<div>
<%= f.label "Event" %>
<%= f.select(:event, options_for_select(get_events),{}, { :class => 'form-control', :id => 'event'})%>
<%if any_errors(@attendance_policy, :event) != nil%>
   <%= any_errors(@attendance_policy, :event) %>
<%end%>
</div>
.....
<% Event.all.each do |event| %>
   <div id='<%=event.event_name%>' >
   <%= f.label "Absence Milestone(Make dynamic with selected event)"+event.event_name %>
   <%= f.number_field :absence_milestone, in: 0..event.absence_max.to_i, class: 'form-control' %>
   <%if any_errors(@attendance_policy, :absence_milestone) != nil%>
       <%= any_errors(@attendance_policy, :absence_milestone) %>
   <%end%>          
</div>
<%end%>

这是我对 JQuery 的一次可怜尝试:

$(document).ready(function() {

    $("select#event").bind("change", function() {
        var selected = $("select#event").text();
        $("div#"+selected).show();
    })
})

我知道我必须捕获所有 div,但我不知道如何诚实...您不能将 ruby​​ 参数传递给 JQuery...将它们全部隐藏,从事件选择器中捕获文本并仅显示一个 id 匹配的内容在选择器中选择..

更新

工作代码: 除了我将 div 的类设置为“wipe”之外,Ruby 部分没有太大变化。

<% Event.all.each do |event| %>
    <div id="<%= event.event_name%>" class="wipe">
    <%= f.label "Absence Milestone" %>
    <%= f.number_field :absence_milestone, in: 0..event.absence_max.to_i, class: 'form-control' %>
    <%if any_errors(@attendance_policy, :absence_milestone) != nil%>
    <%= any_errors(@attendance_policy, :absence_milestone) %>
    <%end%>
    </div>
<%end%>

这里是更新的 jQuery。我在测试时发现了另一个错误,即使我输入了一个值,我的验证器也会抱怨该字段不能为空。背后的原因是所有其他隐藏字段都没有输入任何内容。我更新了 jQuery 以更新所有隐藏字段在显示的焦点丢失事件中键入值。

jQuery 工作(可能很乱):

$(document).ready(function() {
    $("[class='wipe']").hide();
    var selected = $("select#event").find("option:selected").text();
    $("[id='" + selected + "']").show();
    $("[id='" + selected + "']").on('focusout', function() {

        var input = $(this).find("input").val();
        $('input[type=number]').val(input)
    })
    $("select#event").on('change', function() {
        $("[class='wipe']").hide();
        var selected = $(this).find("option:selected").text();
        $("[id='" + selected + "']").show();
        $("[id='" + selected + "']").on('focusout', function() {

            var input = $(this).find("input").val();
            $('input[type=number]').val(input)
        })
    });

【问题讨论】:

    标签: javascript jquery html forms ruby-on-rails-4


    【解决方案1】:

    你已经接近了。您应该使用.change() 而不是.bind(),并且您需要找到所选option 的文本:

     $(document).ready(function() {
    
       $("select#event").change(function() {
          var selected = $(this).find("option:selected").text();
          $("div#"+selected).show();
        })
     })
    

    .bind() 已弃用

    FIDDLE

    【讨论】:

    • 感谢您为我指明正确的方向。我忘记了我可以使用警报来调试代码,所以我能够拼凑出我需要的工作位。另外,谢谢你的建议。我认为自己更像是服务器端编码器而不是客户端,所以我的 JS 技能还没有那么发达。我想通过这个小问题我确实学到了很多 jQuery 是如何运作的。
    【解决方案2】:

    如果我理解正确.. 你不能使用 Ids Id 是唯一的,所以你需要使用 Classes

    $("div."+selected)
    

    您可以使用此代码

    $(document).ready(function() {
     $('div.hidden').hide();    
     $("select#event").on('change',function() {
            var selected = $(this).val();
            $('div.hidden').hide();
            $('div.'+selected).show()
     });
    });
    

    你可以查看演示

    DEMO

    【讨论】:

    • 我使用了您在此处提出的课程理念,因此您确实有所帮助。使用 。或 # 表示法不起作用(我的一些 id 或类中有空格,例如:'Hello World',因此根据 StackOverflow 的其他一些帖子,我明确搜索了我的属性)并且 'hidden' 是 HTML5 属性(显然......)它隐藏了我所有的字段,所以我不得不重命名它。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    相关资源
    最近更新 更多