如何以不同的方式使用相同的功能?

How to use the same function in different ways?

我有两个下拉菜单。当我 select 在第一个下拉菜单中选择一个选项时,第二个下拉菜单的值将根据第一个下拉菜单的值进行更改。

HTML 代码

<select id="one">
    <option value="a">A</option>
    <option value="b">B</option>
</select>
<select id="two">
    <option value="a">A</option>
    <option value="b">B</option>
</select>

JS代码

$("#one").change(function () {
    if ($("#one").val() == 'a') {
        $("#two").val("b")
    } else if ($("#one").val() == 'b') {
        $("#two").val("a")
    }
});

$("#two").change(function () {
    if ($("#two").val() == 'a') {
        $("#one").val("b")
    } else if ($("#two").val() == 'b') {
        $("#one").val("a")
    }
});

两个下拉菜单的代码执行相同的功能。有什么有效的方法可以减少代码?喜欢声明一个通用函数并将其用于两个下拉列表(如原型)?

这里是JSFiddle

  1. 将常见的 class 添加到下拉列表中。
  2. 使用通用 class
  3. 在元素上绑定 change 事件
  4. 使用siblings()设置其他下拉value
  5. 使用 trigger() 在页面加载时更新下拉值。

Demo

$('.mySelect').on('change', function() {
  var newVal = $(this).val() == 'a' ? 'b' : 'a';
  $(this).siblings('.mySelect').val(newVal);

  // Even Shorter
  // $(this).siblings('.mySelect').val($(this).val() == 'a' ? 'b' : 'a');
}).trigger('change');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<select id="one" class="mySelect">
  <option value="a">A</option>
  <option value="b">B</option>
</select>
<select id="two" class="mySelect">
  <option value="a">A</option>
  <option value="b">B</option>
</select>

像这样?

$('#one,#two').on('change', function() {
  var other = ( $(this).attr('id') == 'one' ) ? '#two' : '#one';
  
  var value = ( $(this).val() == 'a' ) ? 'b' : 'a';
  
  $(other).val(value);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="one">
    <option value="a">A</option>
    <option value="b">B</option>
</select>
<select id="two">
    <option value="a">A</option>
    <option value="b">B</option>
</select>

当然有很多方法可以做到:

function onChange($element, $other) {
  if($element.val() == 'a'){
    $other.val("b")
  }else if($other.val() == 'b'){
    $element.val("a")
  }
}

在此处查看:

function onChange($element, $other) {
  if ($element.val() == 'a') {
    $other.val("b")
  } else if ($element.val() == 'b') {
    $other.val("a")
  }
}

$('#one, #two').change(function() {
  var other = $('#one, #two').not(this);
  onChange($(this), other);
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="one">
  <option value="a">A</option>
  <option value="b">B</option>
</select>
<select id="two">
  <option value="a">A</option>
  <option value="b">B</option>
</select>

将其设为带有两个参数的函数以传递您的下拉列表 ID:

$("#one").change(switchSelection("#two", "#one"));

$("#two").change(switchSelection("#one", "#two"));

function switchSelection(x, y) {
    if($(y).val() == 'a') {
        $(x).val("b")
    }
    else if ($(x).val() == 'b') {
        $(y).val("a");
    }
};

最简单的方法(根据您的代码)——虽然不是 最有效的方法——是将 select 元素作为参数传递给公共函数调用。

var handleChange = function($select, $linkedSelect){
    if($select.val() == 'a'){
        $linkedSelect.val("b")
    }else if($select.val() == 'b'){
        $linkedSelect.val("a")
    }
}; 

$("#one").change(function(){
    handleChange($(this),$('#two'));
});

$("#two").change(function(){
    handleChange($(this),$('#one'));
});

Here's a fiddle of that in action.

$('#one,#two').change(function() {
 var opositeIdObj = {"one":"two","two":"one"};
 var opositeValObj = {"a":"b","b":"a"};
 $("#"+opositeIdObj[this.id]).val(opositeValObj[this.value]);
}).trigger('change');