【问题标题】:jQuery - How to hide drop down search result list?jQuery - 如何隐藏下拉搜索结果列表?
【发布时间】:2010-08-28 15:59:41
【问题描述】:

我正在尝试做一个类似 facebook 中的搜索用户栏 (它包含一个输入区域和一个动态下拉结果列表)

但是当我点击另一个区域时,我在隐藏下拉结果列表列表时遇到了问题。

html 代码是这样的:

<div id="search_container">
  <input id="search_imput" type="text" autocomplete="off">
  <ul id="search_result_list">
    <li>result 1</li>
    <li>result 2</li>
    <li>result 3</li>
  </ul>
</div>

以及这附近的jquery代码:

$('#search_imput').click(function(){
  //update_search_result_list();
  $('#search_result_list').show();      
});

$('#search_container').focusout(function(){
  $('#search_result_list').hide();
});

$('#search_result_list').children('li').click(function(){
  //display_selected_user_info();
  alert(($(this).text());
});

但它不会触发display_selected_user_info();

主要问题是#search_container$('#search_result_list').children('li')点击激活之前触发了focusout,使得li在点击li功能激活之前就消失了。


注意:我放了一个例子,你可以测试here

【问题讨论】:

  • 我很惊讶菜单甚至显示 - 搜索结果是 sibling ,而不是输入的孩子。
  • true 它应该只是 ('#search_result_list') 而不是 $(this).children('li')... 已经修复它。我的真实代码稍微复杂一点,但思路是一样的。

标签: jquery


【解决方案1】:

我终于知道该怎么做了。 (经过大量搜索)

基本上我可以使用文档点击事件和 event.trigger 来检查我是否点击了我的结果列表。

// remove the $('#search_container').focusout and use this one:
$(document).unbind('click');
$(document).click(function(event){
  if($(event.target).closest('#search_container').length == 0) {
    $('#search_result_list').hide();
  }
});

我已经把我的例子的完整版本here

【讨论】:

    【解决方案2】:

    我找到了解决此问题的简单方法。您可以在结果列表隐藏之前引入延迟,以便单击事件有足够的时间触发。

    $('#search_imput').blur(function() {
        setTimeout(function(){
            $('#search_result_list').hide();
        }, 100);
    });
    

    查看更新版本:http://jsfiddle.net/5FRar/1/

    【讨论】:

    • 我之前已经尝试过这个,它有点工作。但是,这取决于计算机。如果它的电脑速度很慢,你需要增加时间,否则它会失败。它有点烦人。但是让你发帖。经过大量搜索,我最终找到了答案。
    【解决方案3】:

    你的列表是动态生成的吗? 如果是,则尝试使用实时函数来检测添加到 dom 的新 li,并且 dis 的 jquery 是:

    $('#search_result_list li').live('click', function(){
      display_selected_user_info();
    });
    

    【讨论】:

    • 是的,我做这样的事情,那就是我的 update_search_result_list();在我放入代码的 $('#search_imput').click(function() 中。注意:我只是评论它,因为问题很简单(我现在假设列表是静态的)和 display_selected_user_info () 是转到另一个页面,显示我在列表中选择的用户的信息。
    • 你?窝?迪斯?你是通过短信回复吗?我的眼睛只是流了一点血。
    【解决方案4】:

    已编辑

    $('#search_imput').click(function(){
      //update_search_result_list();
      $(this).find('#search_result_list').children('li').show();       
    });
    
    $('#search_container').unbind().bind('blur',function(){
      $(this).find('#search_result_list').children('li').hide();
    });
    
    $('#search_result_list').children('li').die().live('click',function(){
      display_selected_user_info();
    });
    

    【讨论】:

    • 已经尝试过模糊,但它不起作用。注意:search_result_list 视觉上漂浮在 search_container 之外(如果不是,当我单击 search_result_list 中的元素 li 时,jquery 可能没有触发焦点)
    • 尝试编辑后的脚本...顺便说一句,您知道该列表仅在您单击 时显示,而不是在您“keypress”按一个键时显示
    • 我的实际代码也使用按键来更新搜索结果列表。在这个例子中,我只是假设我有相同的结果列表(只是为了更简单)。
    • 你使用的新代码也不能解决问题。主要问题是在 ('#search_result_list').children('li') 点击被激活之前触发了 '#search_container' 模糊。并且在点击功能激活之前li项就消失了。
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2018-11-29
    • 2020-06-28
    • 1970-01-01
    • 2017-01-30
    • 2013-04-11
    • 2023-03-13
    相关资源
    最近更新 更多