如何使用 jquery 唯一地添加选项以进行选择

Posted

技术标签:

【中文标题】如何使用 jquery 唯一地添加选项以进行选择【英文标题】:how can i uniquely add options to select using jquery 【发布时间】:2012-06-03 14:43:10 【问题描述】:

我在<select> 中有很多独特的选项。只有当它是唯一的并且不存在于现有选项中时,我才需要添加一个新选项。

如何使用 jquery 查找给定的option 是否已存在于给定的select 中?

例如:

<select id="combobox">
    <option value="">Select one...</option>
    <option value="Apple">Apple</option>
    <option value="Banana">Banana</option>
    <option value="Pears">Pears</option>
</select>
新的有效选项:梨 新的无效选项:Apple

【问题讨论】:

我的问题的扩展:是否有一个实用程序可以为我提供这两组的交集? (我知道我可以轻松编写它,但如果某些东西已经存在,我宁愿重用它)。例如给定选项和新选项。我想将这两者的交集添加到 givenOptions。 Watch my updated answer 到您的不区分大小写的请求。 “两个选项的交集”是什么意思? @DavidThomas 现有选项(在本例中为 givenOptions:Apple、Banana、Pears)。 newOptions 就像一个数组(我通过 ajax 调用得到它,例如 [apple, plums])。我想得到givenOptionsnewOptions 的交集以在这两个集合中找到独特的元素并将它们添加到givenOptions 【参考方案1】:
if (!$("#combobox option[value='Apple']").length)
    // Add it

使其可重复使用可以:

if (!$("#combobox option[value='" + value + "']").length)
    // Add it

Live DEMO

不区分大小写:

var isExist = !$('#combobox option').filter(function() 
    return $(this).attr('value').toLowerCase() === value.toLowerCase();
).length;​

完整代码:(演示)

$('#txt').change(function() 
    var value = this.value;

    var isExist = !!$('#combobox option').filter(function() 
        return $(this).attr('value').toLowerCase() === value.toLowerCase();
    ).length;

    if (!isExist) 
        console.log(this.value + ' is a new value!');
        $('<option>').val(this.value).text(this.value).appendTo($('#combobox'));
    
);​

Live DEMO

【讨论】:

如何使这个不区分大小写? 太棒了!你能解释一下 jquery 中的!! 运算符是什么吗?这部分我看不懂:!!$('#combobox option').filter(... 感谢格多伦!那很有帮助。您是否知道一个实用程序可以为我提供这两个 options 的交集? (我知道我可以轻松编写它,但如果某些东西已经存在,我宁愿重用它)。例如当前选项集中的 givenOptions 和 newOptions 作为 json 数组接收。我想将这两者的交集添加到 givenOptions。我的相关问题:***.com/questions/10796413/… @brainydexter。没有内置的方法。你需要自己写。没那么难,接近 3-5 行代码。【参考方案2】:

我假设您想通过 value 而不是文本内容进行搜索。在您的示例中,它们始终相同,但可能并不总是...

var toAdd = 'Apricot',
    combobox = $('#combobox');

if (!combobox.find('option[value="' + toAdd + '"]').length) 
    combobox.append('<option value="' + toAdd + '">' + toAdd + '</option>');

【讨论】:

【参考方案3】:

假设newOption 变量中存在新的选项文本:

$('button').click(
    function() 
        var newOption = $('#newOptionInput').val(),
            opts = [];
        $('#combobox option').each(
            function() 
                opts.push($(this).text());
            );

        if ($.inArray(newOption, opts) == -1) 
            $('<option />')
                .val(newOption)
                .text(newOption)
                .appendTo('#combobox');
        
    );​

JS Fiddle demo.

编辑更正了上面的代码(我忘记了$.inArray()在找不到值时返回-1,而不是false),并使用更合适的选择器。

参考资料:

appendTo()each(). $.inArray()/jQuery.inArray()push()text()val().

【讨论】:

这不会在给定页面上的所有“选项”中搜索吗?【参考方案4】:
if ($('#combobox').find('option[value="Pear"]').length) 
  // there's pear
 else 
  // nope, no pear

【讨论】:

以上是关于如何使用 jquery 唯一地添加选项以进行选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jQuery whit“selectpicker”类中添加选项以选择列表?

如何在 jQuery 中对选择选项进行排序以同时尊重每个选项数据属性?

jQuery更新选择列表

如何处理jQuery选择器中的特殊符号

如何删除选择框的所有选项,然后添加一个选项并使用 jQuery 选择它?

如何根据值将 css 类添加到选择列表选项中 - 使用 jQuery