【问题标题】:Show rest of form if checkbox is checked如果选中复选框,则显示其余表格
【发布时间】:2014-02-20 02:06:22
【问题描述】:

我查看了几个不同的 SO 答案 (show rest of a form if a checkbox is ckecked in ruby on rails),但没有一个对我有用。

还有其他答案,但我对 jQuery 或 JS 并不精通,其余的都是假设性的。在任何一种情况下,我都完美地遵循了链接问题的示例答案,但是,当复选框被选中时,表单的其余部分没有出现。

想法?

身体

      <div class="form-group" id="checkbox">
        <%= f.check_box :paydeliver %>
        <%= f.label :paydeliver, "Pay $25" %>
      </div>

      <div id="delivery" style="display:none;">
        <div class="form-group">
          <%= f.label :addysdeliver, "Delivery address"%>
          <%= f.text_field :addysdeliver, class: "form-control"%>
        </div>
      </div>

      <%= f.submit "Go!", class: "btn btn-primary btn-large btn-block" %>

      <% end %> #end of form

我尝试过的脚本(来自链接的 SO 答案)但失败了......请随意改进其中的任何一个或全部!

<script>
window.onload = function() { 
 var checkbox = document.getElementById('checkbox');
 if (checkbox.checked) {
 document.getElementById("delivery").style.display = "block";
 } else {
 document.getElementById("delivery").style.display = "none";
 }
};

<script>
window.onload = function() { 
var checkbox = document.getElementById('checkbox');
var delivery_div = document.getElementById('delivery');
checkbox.change = function() {
   if(this.checked) {
     delivery_div.style['display'] = 'block';
   } else {
     delivery_div.style['display'] = 'none';
   }
};

<script>
$('select#paydeliver').change ->
  if $(this).val() == 'true'
    $('delivery').slideDown('fast')
  else
    $('delivery').slideUp('fast')

<script>
$("input[type='checkbox']#paydeliver").on('change', function(){
$('delivery').toggle();
});
</script>

请注意,对于上述每种方法,我还尝试在 ID 元素前添加 # 符号,例如 ('#delivery') 而不是 ('delivery')。还是没有运气!

编辑

@emilioicai 肯定得到了问题的正确答案,但这样做也让我意识到一些更复杂的事情。对于每个控制器,在发布此表单后,用户将被重定向到编辑视图,因此如果他们愿意,他们可以进行更改。他们刚刚输入的表单中的所有数据都会保留在编辑视图中(包括选中的框),但如果选中该框应该出现的字段除外。

这就是为什么我试图将 JS 中的 if (condition) 更改为基于复选框是否显示“True”而不是仅选中它。其他想法表示赞赏!

【问题讨论】:

  • 很抱歉问这个问题,我不是 ruby​​-on-rails。但是html代码中的复选框在哪里
  • 就是这个位 '
    '
  • 但您将 'id' 分配给 div 而不是复选框
  • 嗨詹姆斯,如果你想这样做,你可以将功能提取到一个单独的函数中,不仅在点击时调用它,而且在页面加载时调用它。看看我的第二个答案,如果它对您有用,如果您可以将其作为正确答案进行检查或投票,那就太好了。谢谢!

标签: javascript jquery ruby-on-rails checkbox


【解决方案1】:

那里有几个错误的地方。主要的一个是 id 应该在复选框中。不在 div 中。像这样的:

  <div class="form-group">
    <input id="checkbox" type="checkbox">
  </div>

  <div id="delivery" style="display:none;">
    <div class="form-group">
      HIDDEN
    </div>
  </div>



var checkbox = document.getElementById('checkbox');
var delivery_div = document.getElementById('delivery');
checkbox.onclick = function() {
   if(this.checked) {
     delivery_div.style['display'] = 'block';
   } else {
     delivery_div.style['display'] = 'none';
   }
};

在这里看到它的工作:http://jsfiddle.net/D46Zb/

【讨论】:

  • 哦,当然,也感谢@sanjeev。我唯一的问题是,您知道如何在 Rails 表单助手的上下文中将 ID 设为复选框吗?使用 Rails 表单助手是我被教导将复选框的输出分配给变量的唯一方法(在本例中为:paydeliver)
  • 试试这个:f.check_box :paydeliver, :id => "checkbox"
  • 非常感谢!如果您有第二个跟进,如果我不想使用 onclick,而是实际上告诉 javascript 只检查复选框是否 = true(即单击),我可以删除 onclick 行并将 if 更改为如果复选框 = true?
  • 你会有2个问题:1.如果你删除onclick if只会执行一次(加载时),并且由于默认情况下未选中该复选框,它永远不会显示隐藏的div . 2. checkbox 是一个 dom 元素,所以你不能直接使用它来检查它的值,但你应该使用 .checked 属性来代替
  • 您的解决方案确实有效,但它让我意识到它只解决了我的部分问题。发布此表单后,用户将被重定向到编辑视图。所有其他字段,包括复选框是否被选中,都会持续存在,但如果选中复选框,则不可见的字段不会保持可见(当然,数据仍然存在,如果我取消选中并重新检查我可以看到输入)。关于如何制作这根棍子的任何想法?这就是为什么我试图锚定复选框的真实性,因此它不会依赖于单击或更改操作。
【解决方案2】:

这将使它持续存在:

  <div class="form-group">
    <input id="checkbox" type="checkbox">
  </div>

  <div id="delivery" style="display:none;">
    <div class="form-group">
      HIDDEN
    </div>
  </div>



var checkbox = document.getElementById('checkbox');
var delivery_div = document.getElementById('delivery');
var showHiddenDiv = function(){
   if(checkbox.checked) {
     delivery_div.style['display'] = 'block';
   } else {
     delivery_div.style['display'] = 'none';
   } 
}
checkbox.onclick = showHiddenDiv;
showHiddenDiv();

【讨论】:

  • 这就像一个魅力,我也理解关于在单击复选框时调用该函数以及在加载页面时调用该函数的解释,非常感谢!
【解决方案3】:

如果您只想在页面加载时检查一次,请使用

<script type="text/javascript">

    window.onload = function() {
     if ($('checkbox').is('checked')) {
        document.getElementById("delivery").style.display = "block";
     } else {
        document.getElementById("delivery").style.display = "none";
     }
    };

否则,如果您想在每次单击复选框时都进行检查-

 <script type="text/javascript">
  $(document).ready(function(){
    $('checkbox').click(function(){ 
     if ($('checkbox').is('checked')) {
        document.getElementById("delivery").style.display = "block";
     } else {
        document.getElementById("delivery").style.display = "none";
     }
    });
});

【讨论】:

  • 后者会更理想,但我无法让代码工作?另外,我编辑了问题:发布此表单后,用户将被重定向到编辑视图。所有其他字段,包括复选框是否被选中,都会持续存在,但如果选中复选框,则不可见的字段不会保持可见(当然,数据仍然存在,如果我取消选中并重新检查我可以看到输入)。关于如何制作这根棍子的任何想法?这就是为什么我试图锚定复选框的真实性,因此它不会依赖于单击或更改操作。
猜你喜欢
  • 2012-05-06
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
相关资源
最近更新 更多