2012-05-21 2 views
2

J'ai le balisage suivant:Comment puis-je déclencher une 'mise au point' après avoir cliqué sur un élément?

<select style="display:none"> 
    <option value='1'>1</option> 
    <option vlaue='2'>2</option> 
</select> 
<input type="text" id="comboBox" /> 
<ul id="comboBoxData" style="display:none"> 
    <li id='1'>1</li> 
    <li id='2'>2</li> 
</ul> 

et le code JQuery suivant:

$(document).ready(function() { 
    $('select').each(function() { 
     var parent = this; 
     $('#comboBoxData').on('click', 'li', function() { 
      var value = $(this).prop('id'); 
      $(parent).val(value); 
      $('#comboBox').val(value); 
     }); 
    }); 
    $('#comboBox').bind('focusin', function() { 
     $('#comboBoxData').show(); 
    }); 
    $('#comboBox').bind('focusout', function() { 
     $('#comboBoxData').hide(); 
    }); 
}); 

Lorsque je clique sur un des LI de l'élément « comboBoxData » disparaît avant le déclenchement de clic se produit. Y at-il un moyen de contourner cet événement ou un autre événement que je peux utiliser à la place pour avoir le même effet qu'un focus?

+0

'Lorsque je clique sur l'un des l'élément « comboBoxData » de LI disparaît avant le déclenchement de clic happens.' ne comprenions pas. – Vimalnath

+0

#comboboxdata li a un événement click qui ne se produit pas parce que l'événement focusout se passe avant –

Répondre

3

Put mouseenter et des événements MouseLeave et modifier la valeur d'une variable globale disent Isover.

$('select').each(function() { 
    var parent = this; 
    $('#comboBoxData').on('click', 'li', function() { 
     var value = $(this).prop('id'); 
     $(parent).val(value); 
     $('#comboBox').val(value); 
     $('#comboBoxData').hide(); 
    }); 
}); 
$('#comboBoxData').mouseover(function(){ 
    isOver = true; 
}).mouseleave(function(){ 
    isOver = false; 
}); 
$('#comboBox').bind('focusin', function() { 
    $('#comboBoxData').show(); 
}); 
$('#comboBox').bind('focusout', function() { 
    if(!isOver){ 
     $('#comboBoxData').hide(); 
    } 
}); 
1

Vous ne nécessitent pas:

$('#comboBox').bind('focusout', function() { 
     $('#comboBoxData').hide(); 
}); 

utiliser à la place cet intérieur $('#comboBoxData').on('click', 'li', function() {

si vous êtes bien avec le plugin, vous pouvez simplement utiliser cette façon:

$('#menu').bind('clickoutside', function (event) { 
    $(this).hide(); 
}); 

Vous pouvez obtenir ce plugin here

Aussi, j'ai un changement d le code sans utiliser le plug-in: S'il vous plaît vérifier la réponse mise à jour:

DEMO

+0

Merci pour la suggestion, je vais certainement le faire mais en plus j'ai besoin qu'il disparaisse aussi quand l'utilisateur clique dessus –

+1

@William Calleja a mis à jour la réponse – Vimalnath

+0

@William Calleja Faites-moi savoir si la réponse mise à jour fonctionne bien pour vous? – Vimalnath

0

essayer avec blur() fonction

$('#comboBox').blur(function() { 
     $('#comboBoxData').hide(); 
    }); 

L'événement de flou est envoyé à un élément lorsqu'il perd le focus.

de http://api.jquery.com/blur/

+0

J'ai essayé d'utiliser le flou à la place, mais le même résultat exact est en train de se produire, l'événement de flou se produit avant les déclenchements de l'événement click. –

+0

peut-être essayer de remplacer #comboBox par #comboBoxData – jbduzan

0

Pas exactement élégant mais cela fonctionne.

$("body").click(function(event){ 
    if(!$(event.target).is("#comboBoxData") && !$(event.target).is("#comboBox")){  
     $("#comboBoxData").hide(); } 
}); 


$(document).ready(function() { 
    $('select').each(function() { 
     $('#comboBoxData').on('click', 'li', function() { 
     var value = $(this).prop('id'); 
       $('#comboBox').val(value); 
      $('#comboBoxData').hide(); 
     }); 
    }); 

    $('#comboBox').bind('focusin', function() { 
    $('#comboBoxData').show(); 
    }); 
}); 
Questions connexes