比较选择值并在匹配

时间:2015-08-11 13:01:25

标签: javascript jquery html

我有4个下拉列表,您必须从中选择一个选项。

如果您多次选择相同的选项,我要做的是显示警告。它的目的是保持游戏的分数,这样一个人就不应该像2那样玩。

目前下拉列表如下:

<select id="users_1" aria-labelledby="dropdownMenu1">
    <option>Select player</option>
    <?php foreach($users as $user) : ?>
    <option value="<?=$user['id_user']?>"><a href="#"><?=$user['nume']?></a></option>
    <?php endforeach; ?>
</select>

我在JQuery中尝试做的是:

$("#users_2").change(function() {
    var a=$(this).val("#users_1");
    var b=$(this).val("#users_2");
    if(a == b) {
        alert($(this).val());
    }
});

我还尝试将它们比作这样:

$("#users_2").change(function() {
    if($(this).val() == $("#users_1").val()) {
        alert($(this).val());
    }
});

似乎无效,我不知道为什么。我已经检查过,实际值是从视图中获取的,但if子句显然无法比较它们。

感谢您的帮助!非常感谢!

2 个答案:

答案 0 :(得分:3)

获取您的值,不要设置它们

改变这个......

$("#users_2").change(function() {
    var a=$(this).val("#users_1");
    var b=$(this).val("#users_2");
    if(a == b) {
        alert($(this).val());
    }
});

......对此...

$("#users_2").change(function() {
    var a = $("#users_1").val();
    var b = $(this).val(); // equivalent to $("#users_2").val()
    if(a === b) {          // Use strict comparison operator as a best practice
        alert(a + ' matches ' + b);
    }
});

让它变得动态

通过聆听一组元素并使处理程序动态,您可以更进一步:

// Listen to set of all select elements.
$('select').on('change', function(e) {
  
  // Serialize form values.
  var vals = $('#select_player').serializeArray();
  
  // Convert to simple array of just values.
  vals = $.map(vals, function (val, i) {
    return val.value;
  });
  
  // Remove current selection from array…
  vals.splice(vals.indexOf($(this).val()), 1);
  
  // …then check to see if it's value was already there.
  if(vals.indexOf($(this).val()) !== -1) { // If value is found,
    
    // …reset current select element to default option,
    $(this).val('default');
    
    // …and alert user with a relevant message.
    alert('You cannot select this player more than once.');
  };
});
label {
  display: block;
  margin: 10px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<form id="select_player" name="select_player">
  <label>Player 1:
    <select id="users_1" name="users_1">
      <option value="default" selected="selected" disabled>Select player</option>
      <option value="uid001">John Doe</option>
      <option value="uid002">Jane Doe</option>
      <option value="uid003">Jerome Smith</option>
      <option value="uid004">Janet O'Public</option>
    </select>
  </label>

  <label>Player 2:
    <select id="users_2" name="users_2">
      <option value="default" selected="selected" disabled>Select player</option>
      <option value="uid001">John Doe</option>
      <option value="uid002">Jane Doe</option>
      <option value="uid003">Jerome Smith</option>
      <option value="uid004">Janet O'Public</option>
    </select>
  </label>

  <label>Player 3:
    <select id="users_3" name="users_3">
      <option value="default" selected="selected" disabled>Select player</option>
      <option value="uid001">John Doe</option>
      <option value="uid002">Jane Doe</option>
      <option value="uid003">Jerome Smith</option>
      <option value="uid004">Janet O'Public</option>
    </select>
  </label>

  <label>Player 4:
    <select id="users_4" name="users_4">
      <option value="default" selected="selected" disabled>Select player</option>
      <option value="uid001">John Doe</option>
      <option value="uid002">Jane Doe</option>
      <option value="uid003">Jerome Smith</option>
      <option value="uid004">Janet O'Public</option>
    </select>
  </label>
</form>

答案 1 :(得分:2)

我在所有下拉列表中使用了相同的类,然后只使用一个事件处理程序。

$('.dropdown').on('change', function (event) {
    var selectedValue = $(event.currentTarget).val();
    var matchedDropdowns = $('.dropdown').filter(function (index) {
      return $(this).val() === selectedValue;
    });
    if (matchedDropdowns.length > 1) {
      alert("Alert Alert!")
    }
  })

在事件处理程序中,我可以获取所选值,过滤掉与该值匹配的所有下拉列表,如果我得到超过1个下拉列表,我将只显示警报。

您可以在fiddle上查看。