2010-08-28 4 views
2

Je suis en train de faire une barre utilisateur de recherche comme celui de facebook (il consiste en une zone d'entrée et une baisse dynamique dans la liste déroulante des résultats)jQuery - Comment masquer la liste déroulante des résultats de recherche?

mais je vais avoir des problèmes à se cacher dans la liste déroulante des résultats liste quand je clique dans une autre zone.

le code html est quelque chose comme ceci:

<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> 

et le code jquery près ceci:

$('#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()); 
}); 

mais il ne déclenche pas la display_selected_user_info();

Le principal problème est que le focus #search_container est déclenché avant que le clic $('#search_result_list').children('li') ne soit activé, ce qui fait disparaître l'élément li b La fonction click li est alors activée.


Note: Je l'ai placé un exemple était u peut tester here.

+0

Je suis assez surpris que le menu affiche même - les résultats de la recherche est un frère de * *, pas un enfant à l'entrée. –

+0

true il devrait être juste ('#search_result_list') au lieu de $ (this) .children ('li') ... déjà le corriger. mon vrai code est un peu plus complexe, mais l'idée est la même. – Seeker

Répondre

3

Je trouve enfin comment faire. (après beaucoup de recherche)

Fondamentalement, je peux utiliser l'événement click de document et le event.trigger pour vérifier si je clique ou non dans ma liste de résultats.

// 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(); 
    } 
}); 

J'ai mis la version complète de mon exemple here

0

ÉDITÉE

$('#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(); 
}); 
+0

déjà essayé avec le flou, mais cela ne fonctionne pas. Note: search_result_list flotte visuellement hors du search_container (si ce n'est pas le cas, jquery n'a pas déclenché le focus quand j'ai cliqué sur l'élément li dans search_result_list) – Seeker

+0

essaie le script édité ... btw tu sais que la liste ne s'affiche que lorsque vous cliquez sur le et non lorsque vous appuyez sur une touche à l'aide de la touche – Val

+0

mon code actuel utilise également la touche pour mettre à jour la liste des résultats de la recherche. Dans cet exemple, je suppose que j'ai la même liste de résultats (juste pour être plus simple). – Seeker

0

est ur liste générée dynamiquement? si oui essayer den fonction en direct pour détecter de nouveaux li ajouté à dom et jquery pour dis est:

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

oui je fais quelque chose comme ceci, c'est mon update_search_result_list(); dans le $ ('# search_imput') .cliquez sur (fonction() que j'ai mis dans le code Note: je le commente simplement parce que le problème est simple (je suppose que la liste est statique pour l'instant) et le display_selected_user_info() est d'aller à une autre page montrant les informations de l'utilisateur que j'ai sélectionné dans la liste – Seeker

+4

ur? Den? Dis? Répondez-vous par message texte? Mes yeux ont juste saigné un peu –

2

J'ai trouvé un travail simple autour de ce problème. Vous pouvez introduire un délai avant que la liste de résultats ne se cache, de sorte que l'événement click aura le temps de se déclencher.

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

Voir la version mise à jour: http://jsfiddle.net/5FRar/1/

+0

J'ai déjà J'ai essayé cela avant et ça fonctionne, mais ça dépend de l'ordinateur, si c'est un PC lent, il faut augmenter le temps ou ça va échouer, c'est un peu ennuyeux, mais ça vous ennuie de poster. après beaucoup de recherches. – Seeker

Questions connexes