【问题标题】:Jquery search text heighlighting issueJquery搜索文本高亮问题
【发布时间】:2017-08-03 09:00:04
【问题描述】:

只需打开小提琴并在搜索框中输入“rima”,然后按向下箭头,这里所有 li 标签都在选择,但它应该选择搜索词等于 li 文本的位置。

这是我的 DEMO 和代码。

jQuery

var $expandBtns = $('.expandBtn');
var $span;

//Search    
$('input#catInput').keyup(function(e) {
  var searchTerms = $(this).val();
  console.log('Input change');
  if (searchTerms == '') {
    $expandBtns.each(function() {
      var $subList = $(this).siblings('ul');
      $subList.hide('slow');
    });
  }
  $('#orgCat li').each(function() {
    var $li = $(this);
    var hasMatch = searchTerms.length == 0 || $li.text().toLowerCase().indexOf(searchTerms.toLowerCase()) > 0;
    $li.toggle(hasMatch).removeClass('searchActiveLi');

    if ($li.is(':hidden')) {
      $li.closest('ul').show('slow');
    }

    if(e.keyCode == 40 && searchTerms.length !=0){ //highlighting selected li using down arrow key
        $li.addClass('searchActiveLi');
    }    
  });

以上代码是我在 Fiddle 中使用的任何问题,请在 cmets 中问我。

【问题讨论】:

    标签: jquery html search


    【解决方案1】:

    这里的问题是$li.text()会返回<li></li>之间的内容,即使里面有<ul></ul>

    示例

    <ul id="outerUl">
      <li id="test">
       <ul>
        <li> foo </li>
        <li> bar </li>
       </ul>
      </li>
     </ul>
     $('#test').text(); //<== This will out put : foo bar
     //So, if i do $('#test').text().toLowerCase().indexOf("foo") it will return a real index of "foo" !
    

    所以你要做的是检查最后一个孩子是否包含你正在寻找的单词:

    if(e.keyCode == 40 && searchTerms.length !=0){ //highlighting selected li using down arrow key
        if($li.children('ul').length <= 0) //<== If the li does not contain any other list
            $li.addClass('searchActiveLi');
    }    
    

    这是您更新后的Fiddle

    更新:

    我找到了一种使用匹配文本突出显示li 并将其内容放入搜索框中的方法:

    if(e.keyCode == 40 && searchTerms.length !=0 && matched.length > 0){ //highlighting selected li using down arrow key
     if(arrowDownClick < matched.length){
        if(arrowDownClick > 0)
        matched[arrowDownClick - 1].removeClass('searchActiveLi');
        var $selectedli = matched[arrowDownClick];
      $selectedli.addClass('searchActiveLi');
      var selectedliText = $selectedli.text();
      $('input#catInput').val(selectedliText);
      arrowDownClick++;
     }else{
        matched[arrowDownClick - 1].removeClass('searchActiveLi');
        arrowDownClick = 0;
     }
    }    
    

    为此,我使用数组matched 来存储每次搜索框的值更改时匹配的li。但是当用户点击down arrow时,脚本会处理匹配到的li的表,并从选中的li中删除.searchActiveLi类并添加到下一个。

    这是最后的Fiddle,如果您需要进一步解释,请告诉我。

    【讨论】:

    • 谢谢@Hamza Abdaoui,它正在工作,但是一旦输入“ri”并检查它是否正在选择所有孩子。它应该单独选择,这意味着添加选择 li 的类
    • jsfiddle.net/nelsonfeel/420Lf338/16 检查所有名称都显示在搜索框中。
    • @nani0077,我不明白需要什么!你想只将类添加到第一个li,然后如果我再次按下向下箭头,它会选择下一个li
    • 是的,将类删除到第一个 li,用选定的 li 文本更新搜索框这是我的要求
    • 你的意思是;当按下向下箭头时,第一个带有匹配词的li 应该突出显示,并且它的内容应该放在搜索框中?如果我再次按下向下箭头,依此类推..
    【解决方案2】:

    而不是

    $li.addClass('searchActiveLi');
    

    使用

     $li.each(function(){
        if($(this).find('li').length  <= 1){
         $li.addClass('searchActiveLi');
        }
       })
    

    【讨论】:

    • 它正在工作并选择 li 组,但它应该只选择一个 li
    猜你喜欢
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 2011-11-23
    • 2011-05-21
    • 2015-08-28
    相关资源
    最近更新 更多