【问题标题】:Count the number of options in a list计算列表中的选项数量
【发布时间】:2012-08-14 14:40:29
【问题描述】:

我正在尝试计算列表中的选项数量。但是,由于在输入框中输入了搜索文本,一些选项已被隐藏。

我开始研究 .size() 和 .length 但只得到了完整的列表,而不是那些没有隐藏的。为了简化,我将其更改为尝试找到隐藏的选项(我可以使用 :not later)。

$('#txtListSearch').keyup(function(evt) {
    if($(this).val().length < 1) {
        $('#selContactLists option').show();
    } else {
        $('#selContactLists option:not(:contains("' + $(this).val() + '"))').hide();

        if($('#selContactLists').size()) {
            $('#selContactLists option:contains("' + $(this).val() + '")').first().attr('selected', 'selected');                
        } else {
        }
    }
    console.log($('#selContactLists option').filter(':hidden'));
});

我也试过:console.log($('#selContactLists option:hidden')); 我从来没有完全得到我期望的数字。谁能看出我哪里出错了?

更奇怪的是,如果我更改选择的“大小”以便默认显示多个项目,则在 chrome 上它永远不会隐藏任何选项。

【问题讨论】:

  • 你也可以发布一个 HTML 示例吗?
  • 附注size() 因为你提到了它。它已被标记为已弃用。来自文档:The .size() method is functionally equivalent to the .length property; however, the .length property is preferred because it does not have the overhead of a function call. (api.jquery.com/size)
  • 选项隐藏或显示的依据是什么?
  • 由搜索框中的文字决定:jsfiddle.net/kcRUB/3
  • 是的,我见过小提琴。我假设输入t 应该同时显示twothree?而o 应该只显示one

标签: jquery hidden option


【解决方案1】:

这对我有用,但出于兼容性原因,您可能希望从元素中手动添加和删除 css display:none,而不是使用 show/hide...

alert($('#selContactLists option:not([style*=none])').length);

【讨论】:

  • 我几乎忽略了你的回答,这似乎太容易了。我错了。做得好,谢谢!
【解决方案2】:

使用 jQuery 的 :visible 选择器。

$('#selContactLists option:visible').length;

【讨论】:

  • 嗨詹姆斯,这总是以零返回。我首先使用 .hide() 将它们从视图中隐藏,但是在列表已从 3 个选项过滤到 2 个的示例中,我仍然得到 0
  • @David,发布您的标记。更好的是,给我们举个例子fiddle
  • @David,你还打算把隐藏的选项放回去吗?
  • 是的,如果您从搜索中删除所有文本,它们就会重新出现
  • 这似乎是一个 chrome 问题,如果我这样做,它可以在 Firefox 中运行:alert(($('#selContactLists option').filter(':visible').length));跨度>
【解决方案3】:

一种似乎可行的方法是以下,尽管它通过将隐藏和显示的选项分配给变量然后使用这些变量的.length 属性来欺骗,但在某种程度上是作弊:

$('#txtListSearch').keyup(
    function(e) {
        var val = $(this).val().toLowerCase(),
            sel = $('#selContactLists');
        if (val.length < 1) {
            sel.find('option').show();
        }
        else {
            var shown = sel.find('option').filter(

                function() {
                    return $(this).text().toLowerCase().indexOf(val) !== -1;
                }).show().first().prop('selected',true),
                hidden = sel.find('option').filter(

                function() {
                    return $(this).text().toLowerCase().indexOf(val) == -1;
                }).hide();
            console.log(shown.length, hidden.length);
        }
    });​

JS Fiddle demo.

请注意,以上是对您原始代码的较大改写。我已经使用了一些选择器缓存来减少从 keyup 方法中访问 DOM 的次数,并且,目前,由于 .toLowerCase() 方法,这是一个不区分大小写的搜索,并且还移动了 @ 987654326@ 到第一个非隐藏选项(在 Chromium 中,这似乎是必需的,以便在输入 t 时在 select 中显示 one 时隐藏它)。

【讨论】:

  • 这对我仍然不起作用。我得到的显示和隐藏的计数都不正确。上述所有尝试都在每个浏览器中产生不同的结果。我认为将选项存储在单独的数组中,然后填充或删除元素是可行的方法。我也尝试增加选择框的大小,以便一次显示多个元素,在这种情况下,没有任何元素被隐藏。我认为隐藏不是一个好主意,删除是答案。我已经为你的答案 +1 了,因为它不太正确(至少对我而言),但它让我走上了正确的道路。
猜你喜欢
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 2021-03-09
  • 2016-03-03
  • 2016-03-04
相关资源
最近更新 更多