【问题标题】:jQuery - How to evaluate two select option values for an if/else statement?jQuery - 如何评估 if/else 语句的两个选择选项值?
【发布时间】:2016-01-16 09:05:35
【问题描述】:

我在页面上有一个带有“options-btn”类的继续按钮(这是一个多步骤预订过程),页面上有两个选择字段。这些下拉选择字段之一需要用户选择一个值,然后他们才能单击页面上的提交按钮,同时还禁用单击事件?

每个下拉字段都有默认选择选项 0,其他选项为“1”。我如何编写一个函数来基本上说“如果这些选项中的任何一个都没有选择值 1 - 警报消息“请选择一个选项”并禁用按钮。

与这些选择字段关联的两个 ID 是:

#extra_units_7 & #extra_units_4

这是我到目前为止写的,但它不起作用:

jQuery(document).ready(function($) {
$(".options-btn").click(function() {
  if ( $('#extra_units_7').val() === 0  ||  $('#extra_units_4').val() === 0 )
    alert("Please select an option");
    return false;    
  } else {
      $('.options-btn').trigger('click');
  }
});

【问题讨论】:

标签: javascript jquery


【解决方案1】:

我对您的 HTML 进行了重构,以便您能够向最终用户反馈,而不会对 alert() 框造成干扰。

<!-- Use ID to attach to in JS -->
<form id="form_units" action="#" method="post">
    <div>
      <!-- Labels, because... well, labels. -->
      <label for="extra_units_4">extra_units_4</label>
      <!-- Use data-attr to identify which elements should be validated and how. This future proofs your code, and it's a good pattern to follow. -->
      <select id="extra_units_4" data-validate="notempty">
        <option value="0">0</option>
        <option value="1">1</option>
        <option value="2">2</option>
      </select>
    <!-- Hidden element to provide feedback as it's better UX -->
    <div class="fielderror">Please make a selection</div>
  </div>
  <div>
    <label for="extra_units_7">extra_units_7</label>
      <select id="extra_units_7" data-validate="notempty">
        <option value="0">0</option>
        <option value="1">1</option>
        <option value="2">2</option>
      </select>
      <div class="fielderror">Please make a selection</div>
  </div>
  <!-- Included an input[type="text"] for fun, and because future proofing is good -->
  <div>
    <label for="extra_units_8">extra_units_8</label>
    <input type="text" id="extra_units_8" data-validate="notempty" />
    <div class="fielderror">Please make a selection</div>
  </div>
  <!-- There appeared to be no reason not to use an input[type="submit"] in your code. Not doing so adds a tiny amount of complexity - so I slimmed the example down. Re-factor yourself for if <button> is a requirement. -->
  <input type="submit" class="options-btn" value="Submit" />
</form>

现在我们有一个简单的 JS,它将捕获所有 &lt;input&gt;s 和 data-validate="notempty"

// Make sure you're specific with your selector for your form
$('#form_units').on('submit',function(e) {
  // Hide all .fielderror elements within the context of 'this' form.
  // This means that the next time we submit error messages are reset
  $('.fielderror', this).hide();
  // Select for all 'not empty' validations
  $('[data-validate="notempty"]').each(function (index, item) {

    // Check if it's an input[type="text"] - future proofing your "not empty" requirements. Expand on this idea for "radio" and "checkbox" inputs if and when required.
    if ($(item).attr('type') === 'text') {

      // Text is empty if the length is less than one char
      if ($(item).val().length < 1) {
        // We've found one that is invalid so stop the from from sending
        e.preventDefault();
        // Show the .fielderror text that is associated with the input being validated
        $(item).siblings('.fielderror').show();
      }
    } else {
        // Selects are empty if val() is less than 1. Be warned, this is dependant on having numerical values - and assumes that zero means no answer.
        if ($(item).val() < 1) {
          // We've found one that is invalid so stop the from from sending
          e.preventDefault();
          // Show the .fielderror text that is associated with the input being validated
          $(item).siblings('.fielderror').show();
        }
      }
  })
});

最后,添加一点 CSS 来隐藏错误消息并在它们显示时设置样式。

.fielderror { display: none; color: red;}

更新 HTML 结构和文本输入的工作示例的 jsFiddle - https://jsfiddle.net/likestothink/xLLvzps2/9/

【讨论】:

  • 太棒了,它成功了!我花了一整天的时间来改变一些东西,但你帮了我很多!非常感谢。
【解决方案2】:
jQuery(document).ready(function($) {
    $(".options-btn").click(function(){
        if ( $('#extra_units_7').val() === 0  &&  $('#extra_units_4').val() === 0 )
            alert("Please select an option");
            return false;    
        }
        return true;
    });
)}

你应该使用 && 而不是 ||。您不需要再次触发点击事件。

【讨论】:

  • 不要使用return falsereturn true。请改用event.preventDefault()
  • return false 包括 event.preventDefault(): css-tricks.com/return-false-and-prevent-default
  • 感谢您的帮助!当我将此代码粘贴到 wordpress 主题自定义 JS 编辑器中时,它会抛出此错误:imgur.com/mLDEaFW - 继续按钮仍然可以点击
【解决方案3】:

第一个:您的代码末尾有}); 错误

第二个:使用==而不是===

3rd:无需使用$('.options-btn').trigger('click');

试试这个..如果你有没有表单的提交按钮

jQuery(document).ready(function($) {
  $(".options-btn").on('click',function() {
    if( $('#extra_units_4').val() == 0 ){
      alert("Please select an option in extra_units_4");
      //return false;  
    }else if($('#extra_units_7').val() == 0 ){
      alert("Please select an option in extra_units_7");
        //$('.options-btn').trigger('click');
    }else{
      alert('extra_units_4 value = '+$('#extra_units_4').val());
      alert('extra_units_7 value = '+$('#extra_units_7').val());
    }
  });
});

Working Demo

或者这个..如果你有一个表单的提交按钮(你需要使用e.preventDefault();window.location.href

jQuery(document).ready(function($) {
  $(".options-btn").on('click',function(e) {
    e.preventDefault();
    if( $('#extra_units_4').val() == 0 ){
      alert("Please select an option in extra_units_4");
      //return false;  
    }else if($('#extra_units_7').val() == 0 ){
      alert("Please select an option in extra_units_7");
        //$('.options-btn').trigger('click');
    }else{
      alert('extra_units_4 value = '+$('#extra_units_4').val());
      alert('extra_units_7 value = '+$('#extra_units_7').val());

      // window.location.href = "type_url_here" // change type_url_here with url you need or with the form action attribute 
    }
  });
});

Working Demo

【讨论】:

    【解决方案4】:

    您想检查 id 在每次更改选择时都会遵守条件,基本上禁用/启用按钮,代码非常好,但您必须在更改事件中执行检查。我在外部提取了 check 函数只是为了提高可重复性(你错过了一个 { 缩进了太多代码)并且我在 select 上引入了一个类来更好地执行检查,如果你喜欢,你可以使用 ID .

    <select class="input-select" id="extra_units_4">
      <option value="0">Volvo</option>
      <option value="1">Saab</option>
    </select>
    
    <select class="input-select" id="extra_units_7">
      <option value="0">Volvo</option>
      <option value="1">Saab</option>
    </select>
    
    <button class="options-btn" disabled="disabled">Submit</button>
    
    <script>
    jQuery(document).ready(function() {
        $(".input-select").on( "change", checkSelect);
    });
    
    function checkSelect() {
        if ( $('#extra_units_7').val() == '0'  &&  $('#extra_units_4').val() == '0' ) {
        $(".options-btn").attr("disabled","disabled");
            alert("Please select an option");
        }
    
        else {        
            $(".options-btn").removeAttr('disabled');        }
    }
    </script>
    

    if 条件是 AND,因为您正在检查两个值是否均为 0,并且必须对字符串执行检查,因为选择值不是整数。

    【讨论】:

      【解决方案5】:

      这是另一种方法,以防您打算继续添加互斥但必需的选择(您需要将required-select 添加到所有选择中): });

      jQuery(document).ready(function($) {
      
        var hasSelected = function() {
          return $('.required-select option:not([value="0"]):selected').length;
        };
      
        $('.required-select').change(function() {
          $('.options-btn').prop('disabled', !hasSelected());
        });
      
        $('form').submit(function(e) {
          if (!hasSelected()) {
            alert("Please select an option");
            e.preventDefault();
          } else {
            alert('submitted');
          }
        });
      
      });
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <form method="post" onsubmit="return false;">
        <select id="extra_units_7" class="required-select">
          <option value="0">Select an option</option>
          <option value="1">One</option>
          <option value="2">Two</option>
        </select>
        <select id="extra_units_4" class="required-select">
          <option value="0">Select an option</option>
          <option value="1">One</option>
          <option value="2">Two</option>
        </select>
        <hr>
        <button type="submit" class="options-btn" disabled="disabled">Submit</button>
      </form>

      我认为当按钮被禁用时验证提交是矫枉过正的,并且允许提交、警告错误和然后禁用按钮是不直观的。我会采用上面代码中的两种方法之一(我更喜欢以书面形式指定选择是必需的,并且在选择它们之前不启用提交)。

      【讨论】:

        猜你喜欢
        • 2018-01-13
        • 1970-01-01
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        相关资源
        最近更新 更多