【问题标题】:How to use the same function in different ways?如何以不同的方式使用相同的功能?
【发布时间】:2015-10-22 23:49:17
【问题描述】:

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

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。

【问题讨论】:

  • 使用 Native javascript 会更好
  • 如果你想绑定多个 DOM 元素,那么我建议使用 Knockout 或 AngularJS

标签: javascript html jquery drop-down-menu jquery-events


【解决方案1】:
  1. 将常用的class 添加到两者的下拉菜单中。
  2. 使用公共类在元素上绑定change事件
  3. 使用siblings()设置其他下拉菜单的value
  4. 使用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】:

    像这样?

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

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

      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>

      【讨论】:

        【解决方案4】:

        使它成为一个带有两个参数的函数来传递你的下拉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】:

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

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

            【讨论】:

              猜你喜欢
              • 2017-03-14
              • 1970-01-01
              • 2020-08-26
              • 2012-09-08
              • 1970-01-01
              • 1970-01-01
              • 2021-03-18
              • 1970-01-01
              • 2012-05-08
              相关资源
              最近更新 更多