【问题标题】:Set <select> element depending on another <select> element根据另一个 <select> 元素设置 <select> 元素
【发布时间】:2017-06-07 21:19:41
【问题描述】:

我需要一个选择元素的选项根据另一个元素的值来改变。

<select id="first">
    <option value="1">one</option> // When you click this one, all the values of #second change (arbitrary number of entries)
    <option value="2">two</option> // When you click this one, all the values of #second change to something else (not necessarily the same number)
</select>
<select id="second">
    <option value="thisChanges">soDoesThis</option>
    <option value="thisToo">andThis</option>
</select>

<script>
    $("#first").on("change", function() {
        <pseudo>
            if #first == "1"
                #second = {"this", "that", "the other"}
            else if #first == "2"
                #second = {"more", "even more", "yet another", "still more"}
        </pseudo>
    }
</script>

这几乎就是我所追求的(我花了数年时间才弄清楚如何完全替换选择框的值),但是按钮单击事件甚至不起作用。一分钟前它还在工作,虽然 for 循环没有。

显然,对于我的用例,我会检查是否单击了选择并使用.val() 检索其值,但我认为此按钮更易于调试。

JSFiddle

HTML:

<select id="sel">
  <option value="1">One</option>
  <option value="2">Two</option>
</select>

<button>
Click me
</button>

JS:

var list = ['11', 'Eleven', '12', 'Twelve', '13', 'Thirteen'];
$('button').on('click', function () {
        alert('click');
    var sel = $('#sel');
    alert('1');
    sel.empty();
    alert('2');
    for (i = 0, i < list.length; i+2) {
        $('#sel').append('<option value="' + list[i] + '">' + list[i+1] + '</option>');
    }
    alert('3');
});

【问题讨论】:

  • 喜欢this ?
  • 根据您的第一个元素,第二个元素的预期输出是什么?

标签: javascript jquery html asp.net-mvc


【解决方案1】:

如果我理解正确的话,我认为您的要求类似于级联下拉列表。

Ex jquery 代码:

$(document).ready(function () {
  $("#state").prop("disabled", true);
  $("#country").change(function () {
    if ($("#country").val() != "Please select") {
       var options = {};
       options.url = "/home/getstates";
       options.type = "POST";
       options.data = JSON.stringify({ country: $("#country").val() });
       options.dataType = "json";
       options.contentType = "application/json";
       options.success = function (states) {
       $("#state").empty();
       for (var i = 0; i < states.length; i++) {
         $("#state").append("<option>" + states[i] + "</option>");
       }
       $("#state").prop("disabled", false);
    };
    options.error = function () { alert("Error retrieving states!"); };
    $.ajax(options);
  }
  else {
    $("#state").empty();
    $("#state").prop("disabled", true);
  }
 });
});

完整代码请参考这篇好文章:

http://www.binaryintellect.net/articles/b58fde6b-415e-454d-985b-d5dc4ad2fca8.aspx

希望对你有帮助

谢谢

卡提克

【讨论】:

    【解决方案2】:

    既然你指定了 jQuery,那我就给你一个 jQuery 答案吧!从选定的选项中获取值和文本,然后将一个新的附加到选择中:

    $(document).on('change', '#two', function() {
      var option_to_add = $(this).find("option:selected").text();
      var number_of_options = $('#two option').length
      $('#one').append($('<option>', {
        value: number_of_options,
        text: option_to_add
      }));
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select id="one">
        <option value="cash">Cash</option>
        <option value="money">Money</option>
    </select>
    <select id="two">
        <option value="stack">Stack</option>
        <option value="overflow">Overflow</option>
        <option value="my">My</option>
        <option value="question">Question</option>
        <option value="op1">Should be option 1: <a id="option1"></a></option>
    </select> Should also be option 1:
    <div id="option1"></div>

    根据您的 cmets 和对您帖子的更改,如果您只是想使用虚拟数组(或数组数组)替换选择元素中的选项,您可以通过以下方式进行详见代码 cmets

    // dummy data array of arrays
    var list = [
      [11, "Eleven"],
      [12, "Twelve"],
      [13, "Thirteen"]
    ];
    
    // click the button, replace the select contents
    $('#btn').on('click', function() {
    
      // build an array of option objects from an array of arrays
      // see below
      var opt_array = build_opt_array(list);
    
      $('#sel').empty();
    
      // add the new options
      $(opt_array).each(function(index) {
        $('#sel').append(opt_array[index]);
      });
    
    });
    
    // helper function
    // builds a new array of option html objects from 
    // an array of arrays
    function build_opt_array(items) {
      var opt_array = [];
      $(items).each(function(index) {
        var new_option = $('<option>', {
          value: items[index][0],
          text: items[index][1]
        });
        opt_array.push(new_option);
      });
      return opt_array;
    };
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <select id="sel">
      <option value="1">One</option>
      <option value="2">Two</option>
    </select>
    
    <button id="btn">
      Click me
    </button>

    【讨论】:

    • @Sinjai - 您需要澄清您的编辑以更透明地解释您的问题。 When #one is selected, you want that value removed from one and placed in #two? Do you want them to swap values?
    • @Sinjai - 这对于 jQuery 来说非常简单,如果您使用 this 标准清理您的问题编辑,那就太好了,以防它可能有助于其他人。
    • 我会尽快编辑它。你能具体说明你不明白的地方吗?我认为斜体部分总结得最好。假设您有 3 组数据。第一个选择哪个集合,第二个显示集合。
    • @Sinjai - 据我所知,您正在从数据库中获取值的集合,将它们传递给您的视图,然后希望将不同的集合显示为 select 选项(选择 2)基于最初在“选择 1”中选择的内容......这是正确的吗?在 SO 上,您需要提供MVCE 和您尝试过的任何 相关代码,以及对您面临的问题 的清晰描述。跨度>
    • 希望我可以将其移至聊天。 @wahwahwah 除了使问题更复杂之外,我看不出这会对任何人有什么好处。超级具体是好的,除了它,嗯,超级具体。将来希望这样做的人会希望根据他们的需求调整这个核心概念。
    【解决方案3】:

    要获取在第一个选择字段中找到的文本,请在所需的选择字段上使用 find(":selected") 后使用 .text() 函数。

     $("#two").focus(function() {
        document.getElementById("option1").innerHTML = $("#one").find(":selected").text();
    });
    

    【讨论】:

      猜你喜欢
      • 2014-05-21
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多