【问题标题】:How do I get the value from a select2 dropdown?如何从 select2 下拉列表中获取值?
【发布时间】:2015-05-26 12:19:53
【问题描述】:

好的,我加载了一些数据 (JSON),然后通过选择菜单,我根据所选值生成一个新的选择菜单:换句话说,选择一个县,生成一个包含该县所有城镇的另一个选择,并在同时应用 select2 插件,使其可搜索。

我需要能够将所选内容放入隐藏字段以进行提交,这就是我遇到的问题。谁能帮帮我,谢谢。 JQuery 不是我最强的。

<script>
    $(document).ready(function(){

    //var county = $('#county').find(":selected").text();
    $('select').on('change', function() {
    var countySelect = $(this).val();
    console.log(countySelect);
    $.getJSON('irishtowns.json', function(data) {
    var output="<select id='townSelect'>";
    output+="<option>Choose a town</option>";
    for (var i in data.irishtowns) {
        if (data.irishtowns[i].county == countySelect) {
        output+="<option value='>" + data.irishtowns[i].town + "'>" + data.irishtowns[i].town + "</option>";
        }
    }
    output+="</select>";
    document.getElementById("placeholder").innerHTML=output;
    $('#placeholder select').select2();

    });

  });
 });
</script>

【问题讨论】:

  • 将数据绑定到输出时出现语法错误output+="&lt;option value='" + data.irishtowns[i].town + "'&gt;" + data.irishtowns[i].town + "&lt;/option&gt;";使用这一行。

标签: jquery json jquery-select2


【解决方案1】:

在更改事件中,您可以使用this 访问触发更改事件的select。要使用 jQuery 函数并获取值,您应该这样做(在第一次选择时已经这样做了):

var selected = $(this).val();

由于您每次都创建了一个新的选择,因此您必须重新创建一个更改处理程序:

$('#placeholder select').on('change', function() {
    $('#hidden').val($(this).val());
})

可以使用一些优化:

  • 您正在混合使用传统的 JavaScript 和 jQuery(如果您刚开始,这可以正常工作并且可以理解,但会使内容更难阅读)。
  • 您应该为更改处理程序使用 ID,以确保这仅适用于您想要的选择。
  • 也许不需要重新创建选择。仅更新选项。
  • (我不知道 select2,所以也许这还不是最优的)。

以下是一些建议:

<script>
$(document).ready(function(){

    // Make townSelect a select2 and update the value in hidden when changed
    $('#townSelect').select2();
    $('#townSelect').on('change', function() {
        var selectedTown = $(this).val();
        $('#hidden').val(selectedTown);
    });

    // Change the available towns when county changes
    $('#county').on('change', function() {
        var countySelect = $(this).val();
        $.getJSON('irishtowns.json', function(data) {
            // Remove previous options
            var select = $('#townSelect').empty();
            // Add new options
            // & trigger 'change' to make select2 aware of it
            select.append($('<option>', { text: 'Choose a town' }).change();
            for (var i in data.irishtowns) {
                if (data.irishtowns[i].county == countySelect) {
                    select.append($('<option>', { value: data.irishtowns[i].town, text: data.irishtowns[i].town });
                }
            }
        });
    });
});
</script>
<!-- ... -->
<select id="county"><!--...--></select>
<select id="townSelect"><option>Choose a county</option></select>

【讨论】:

  • 在添加第一个占位符选项后,可能必须在 #townSelect 上重新触发 change 事件,但过去您的答案看起来是正确的。
  • @KevinBrown 您是否建议触发change 以使隐藏字段保持最新?如果是这样,只需确认,我将编辑答案。如果没有,您能否解释原因,我将编辑答案。谢谢!
  • 不是让隐藏字段保持最新,而是通知 Select2 自身状态已更改(特别是显示占位符而不是现有选择)。但我猜,更新隐藏字段有一个很好的副作用。
  • 附加的 on-change 事件似乎不起作用
  • 嗯。我没有尝试过,因为我不知道 select2。也许在制作select2 之后使用on 是一个问题。我编辑了我的答案以分离 select2 并更改处理程序绑定。好点了吗?
【解决方案2】:

你的 value 属性有语法错误。

试试:

    output+="<option value='"  + data.irishtowns[i].town + "'>" + data.irishtowns[i].town + "</option>";

【讨论】:

  • 这不能回答问题,而是欢迎作为评论。
猜你喜欢
  • 2013-04-17
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 2013-02-28
  • 1970-01-01
  • 2016-09-15
相关资源
最近更新 更多