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

时间:2022-05-10 03:14:35

I have two dropdowns. When I select an option in the first dropdown, the second dropdown values will be changed according to the first dropdown values.

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

HTML CODE

<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 CODE

$("#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")
    }
});

Both the code for two dropdowns do the same function. Is there any efficient way to reduce the code? Like declaring a common function and using it for both dropdowns (like a prototype)?

两个下拉列表的代码都执行相同的功能。有没有有效的方法来减少代码?就像声明一个共同的功能并将它用于两个下拉菜单(如原型)?

Here is the JSFiddle.

这是JSFiddle。

6 个解决方案

#1


5  

  1. Add common class to the both drop-down.
  2. 在两个下拉列表中添加公共类。

  3. Bind change event on the elements using common class
  4. 使用公共类在元素上绑定更改事件

  5. Use siblings() to set the value of other drop-down
  6. 使用siblings()设置其他下拉列表的值

  7. Use trigger() to update the drop-down values on page load.
  8. 使用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>

#2


1  

Like this?

$('#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>

#3


0  

Of course, there are many ways to do it:

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

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

See it here:

在这里看到:

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>

#4


0  

Make it a function with two arguments to pass your dropdown ids:

使它成为一个带有两个参数的函数来传递你的下拉列表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");
    }
};

#5


0  

The simplest way (given your code) - though not the most efficient - would be to pass the select elements in as parameters to a common function call.

最简单的方法(给出你的代码) - 尽管不是最有效的 - 将把参数中的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.

这是行动中的一个小提琴。

#6


0  

$('#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');

#1


5  

  1. Add common class to the both drop-down.
  2. 在两个下拉列表中添加公共类。

  3. Bind change event on the elements using common class
  4. 使用公共类在元素上绑定更改事件

  5. Use siblings() to set the value of other drop-down
  6. 使用siblings()设置其他下拉列表的值

  7. Use trigger() to update the drop-down values on page load.
  8. 使用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>

#2


1  

Like this?

$('#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>

#3


0  

Of course, there are many ways to do it:

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

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

See it here:

在这里看到:

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>

#4


0  

Make it a function with two arguments to pass your dropdown ids:

使它成为一个带有两个参数的函数来传递你的下拉列表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");
    }
};

#5


0  

The simplest way (given your code) - though not the most efficient - would be to pass the select elements in as parameters to a common function call.

最简单的方法(给出你的代码) - 尽管不是最有效的 - 将把参数中的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.

这是行动中的一个小提琴。

#6


0  

$('#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');