【问题标题】:Compare string to each li element将字符串与每个 li 元素进行比较
【发布时间】:2016-01-16 18:20:12
【问题描述】:

我想将输入与 li 元素进行比较,但由于某种原因,它只检查最后一个 li 元素。你可以在下面运行脚本时看到这一点,所有带有“test”的东西都可以正常工作,但对于“example”或“example 2”则不行

$(document).ready(function() {
    var $input = $('#autocomplete');
    $(document).on('keyup', $input, function() {
        var $val = $input.val().trim(),
            $select = $('.autocomplete-content');

        // Check if the input isn't empty
        if ($val != '') {
            $select.children('li').each(function() {
                var $li = $(this),
                    $html = $li.html(),
                    $text = $li.text().trim();

                // Set input value
                $li.click(function() {
                    $input.val($text);
                });

                // Check if the value has at least 1 match else hide
                if ($text.indexOf($val) !== -1) {
                    // Remove class hide when input changes and finds a match
                    if ($li.hasClass('hide')) {
                        $li.removeClass('hide');
                    }

                    // Unhide "ul.autocomplete-content"
                    if ($select.hasClass('hide')) {
                        $select.removeClass('hide'); // Show options
                    }
                } else {
                    $li.addClass('hide');
                    $select.addClass('hide'); // Hide options
                }
            });
        } else {
            $select.addClass('hide');
        }
    });
});
.hide {
  display: none;
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="autocomplete" class="autocomplete">

<ul class="autocomplete-content hide">
  <li><img src="test.jpg"> example</li>
  <li><img src="test.jpg"> example 2</li>
  <li><img src="test.jpg"> test</li>
</ul>

所以我的问题是如何将输入与每个 li 元素进行比较。提前致谢。

更新

我忘了提到的是,li 元素中可能是img,这就是我使用$li.text() 的原因

【问题讨论】:

  • 你考虑过datalists吗?
  • @Hatchet 不知道它的存在,但它并不是我正在寻找的与样式等相关的东西。
  • 您正在为每个 keyup 事件添加一个新的 click 处理程序
  • @Andreas 这与比较字符串有什么关系,因为它只是设置输入的值?
  • 这与您的问题无关,但它是您的脚本中的错误。 $li.click(function() { $input.val($text) }) 添加了一个新的点击处理程序。在第一个 keyup 之后有一个填充输入的点击处理程序,在第二个 keyup 之后有两个填充输入的点击处理程序,在第三个 keyup 之后有三个 ...

标签: javascript jquery


【解决方案1】:

您可以尝试使用伪选择器:contains,而不是在输入中输入任何内容时循环遍历所有li。这会找到我们提供的文本的所有元素,如果您的意图是找到以搜索字符串开头的元素,那么您可能需要即兴发挥一点。 This thread 可能会有所帮助。

$(document).ready(function() {
  var $input = $('#autocomplete');
  $(document).on('keyup', $input, function() {
    var $val = $input.val().trim(),
        $select = $('.autocomplete-content');
    // Check if the input isn't empty
    if ($val != '') {
      $select.children('li').addClass('hide')
      $select.children('li').filter(function() { 
      	console.log($(this).text().indexOf($val))
      	return $(this).text().indexOf($val) !== -1; 
      }).removeClass('hide');
    } else {
      $select.children().addClass('hide');
    }
  });
});
.hide {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="autocomplete" class="autocomplete">

<ul class="autocomplete-content">
  <li class="hide"><img src="test.jpg"> example</li>
  <li class="hide"><img src="test.jpg"> example 2</li>
  <li class="hide"><img src="test.jpg"> test</li>
</ul>

【讨论】:

  • 您确实需要说明您为使这项工作所做的更改;因为它是为了计算出我们需要用你的代码和 OP 来找出差异的变化,这是不必要的乏味。此外,如果没有解释,任何人都很难从这个答案中学到任何东西。
  • @DavidThomas 对此感到抱歉。我正在编辑答案。
  • @SuperDJ 让我看看。
  • @SuperDJ 请立即检查答案。
【解决方案2】:

需要删除$select.addClass('hide');。当输入不匹配 test 时调用它,即使它可能匹配 example

$(document).ready(function() {
    var $input = $('#autocomplete');
    $(document).on('keyup', $input, function() {
        var $val = $input.val().trim(),
            $select = $('.autocomplete-content');

        // Check if the input isn't empty
        if ($val != '') {
            $select.children('li').each(function() {
                var $li = $(this),
                    $html = $li.html(),
                    $text = $li.text().trim();

                // Set input value
                $li.click(function() {
                    $input.val($text);
                });

                // Check if the value has at least 1 match else hide
                if ($text.indexOf($val) !== -1) {
                    // Remove class hide when input changes and finds a match
                    if ($li.hasClass('hide')) {
                        $li.removeClass('hide');
                    }

                    // Unhide "ul.autocomplete-content"
                    if ($select.hasClass('hide')) {
                        $select.removeClass('hide'); // Show options
                    }
                } else {
                    $li.addClass('hide');
                    //$select.addClass('hide'); // Hide options
                }
            });
        } else {
            $select.addClass('hide');
        }
    });
});
.hide {
  display: none;
  }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="autocomplete" class="autocomplete">

<ul class="autocomplete-content hide">
  <li>example</li>
  <li>example 2</li>
  <li>test</li>
</ul>

【讨论】:

    【解决方案3】:

    您必须将hide 类设置为li 而不是ul#autocompletekeyup 事件上遍历lis,其中一个包含文本框值,从中删除类hide并添加不包含的类hide

    $(document).on('keyup', '#autocomplete', function () {
        var text = $(this).val();
    
        $('.autocomplete-content li').each(function () {
            if ($(this).text().trim().indexOf(text) > -1) {
               $(this).removeClass('hide');
            } else {
               $(this).addClass('hide');
            }
        });
    });
    .hide {
      display: none;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    
    <input type="text" id="autocomplete" class="autocomplete">
    <ul class="autocomplete-content">
      <li class="hide"><img src="test.jpg"> example</li>
      <li class="hide"><img src="test.jpg"> example 2</li>
      <li class="hide"><img src="test.jpg"> test</li>
    </ul>

    【讨论】:

    • 以什么方式“可以帮助”?有什么不同,为什么?原始代码中的错误在哪里,该错误是如何导致代码无法按预期工作的?
    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2018-10-04
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多