我有一个数据列表的代码:

$('input[list]').on('input', function(e) {
  var $input = $(e.target),
    $options = $('#' + $input.attr('list') + ' option'),
    $hiddenInput = $('#' + $input.attr('id') + '-hidden'),
    label = $input.val();

  $hiddenInput.val(label);

  for (var i = 0; i < $options.length; i++) {
    var $option = $options.eq(i);

    if ($option.text() === label) {
      $hiddenInput.val($option.attr('data-value'));
      break;
    }
  }
});

// For debugging purposes
$("#myForm").on('submit', function(e) {
  $('#result').html($('#answer-hidden').val());
  e.preventDefault();
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<form id="myForm">
  <input list="answers" id="answer">
  <datalist id="answers">
        <option data-value="42">The answer</option>
        <option data-value="1337">Elite</option>
        <option data-value="69">Dirty</option>
        <option data-value="3">Pi</option>
    </datalist>
  <input type="hidden" name="answer" id="answer-hidden">
  <input type="submit">
</form>




<p>Submitted value (for debugging):</p>
<pre id="result"></pre>

我搜索Elite作为El,选择Elite选项并按下submit按钮,结果是1337。很好
但是,当我搜索Elite作为El并按下submit按钮(不选择选项Elite或任何其他…)时,结果是El。很糟糕。
如何防止用户提交虚假值?

最佳答案

正如@ecg8所提到的,您应该在下拉列表中有一个事件侦听器,并且只有在选择了有效值时才启用submit按钮。这对你有用:

var validValues = [42, 1337, 69, 3];
$("#answer").on("change", function() {
    var validValueSelected = validValues.some(x => x == $('#answer-hidden').val());
    document.getElementById("submitButton").disabled = !validValueSelected;
});

并将subimt按钮更改为:
<input id="submitButton" disbaled type="submit">

不过,我不建议将数据值硬编码到html中,然后在javascript文件中复制它们(即变量validValues)。我建议您使用KnockOut这样可以帮助您的库。

09-17 13:23