2012-12-20 14 views
10

Ich arbeite an einem Projekt mit einem Autocomplete-Suchfeld. Jetzt habe ich das Problem, dass ich den Wert aus den gefundenen Autocompleteresults an das Eingabefeld übergeben möchte, aber gleichzeitig möchte ich die Autocompletebox ausblenden, wenn das Eingabefeld nicht mehr fokussiert ist.jQuery .focusout/.click Konflikt

Jetzt habe ich einen Konflikt mit beiden von ihnen, da der Klick auf die Autocompletebox als Focusout gesehen wird und das Feld ausblenden, noch bevor es den Wert übergeben kann. Irgendwelche Zeiger oder Workarounds für diese Art von Problem? Hier ein Spiel, um es dir klarer zu machen.

http://jsfiddle.net/KeGvM/

Oder hier

CSS:

#a_c {display:none;}​ 

JS:

$('#search_field').focusout(function() { 
    $('#a_c').hide(); // IF I DELETE THIS IT WORKS 
}); 

$('#search_field').focusin(function() { 
    $('#a_c').show(); 
}); 

$('#a_c a').click(function() { 
    $('#search_field').val(''); 
    var value = $(this).text(); 
    var input = $('#search_field'); 
    input.val(input.val() + value); 
    $('#a_c').hide(); 
    return false; 
});​ 

HTML:

<input autocomplete="off" onkeyup="searchFor(this.value);" name="search" id="search_field" class="bold" type="text" placeholder="Search..."> 
<div id="a_c"><a href="">hello world</a></div>​ 

Antwort

17

Meine Lösung in ähnlicher Situation Timeout wurde mit der Aktion in blur Ereignishandler getroffen, um abwehren. Wie folgt aus:

$('#search_field').focusout(function() { 
    window.setTimeout(function() { $('#a_c').hide() }, 100); 
}); 
+0

Sehr gute Workaround imo. Danke für die schnelle Antwort! – Johnny000

+1

Ich hatte ein ähnliches Problem wie die OP, und ich entschied mich, diese schmutzige Lösung als Lösung zu verwenden (letzter Ausweg und ich muss eine Frist so schnell wie möglich beheben).Dies bringt die Ereignisse in einen schlechten Zustand und es ist eine sehr sehr schlechte Übung. Ich werde das verwenden, danke für diese Antwort, aber werde ablehnen. Warten auf eine bessere Antwort. – Sharky

17

Wie wäre es

mit: schweben

ich gleiche Problem mit ihm gelöst.

$('className').on('focusout', function(e) { 
    if($('.suggestLi' + ':hover').length) { 
     return; 
    } 
    $('.suggestList').empty(); 
}); 
+1

Ich denke, das ist die beste Lösung. Ich habe das benutzt und es funktioniert perfekt. Vielen Dank! – ZanattMan

+1

Dies ist die eleganteste Lösung, die ich im Internet gefunden habe. Vielen Dank. –

+0

Funktioniert nicht, wenn Mouse suggerList und ich TAB drücken (wie zur nächsten Eingabe wechseln) (stattdessen klicken) ** [JSFIDDLE] (http://jsfiddle.net/KeGvM/61/) ** – bsbak

1

So wie ich dies die mousedown Ereignis statt click gelöst wurde mit, wie die mousedown Ereignis vor dem Ereignis focusout ausgelöst wird, während click nicht ist.

Sie können es in der kleinen Demo unten ausprobieren. Konzentriere dich auf das Feld und klicke dann auf den Button.

const field = document.getElementById('field'); 
 
const btn = document.getElementById('btn'); 
 

 
btn.addEventListener('click',() => console.log('Click')); 
 
btn.addEventListener('mousedown',() => console.log('Mouse down')); 
 
field.addEventListener('focusout',() => console.log('Focus out'));
<input id="field"> 
 
<button id="btn">Try it</button>

Wie Sie die Ausgabe in der folgenden Reihenfolge sehen:

  1. Maus nach unten
  2. Fokus heraus
  3. Click

Der einzige Nachteil dieser Lösung ist, dass sie nicht darauf wartet, dass der Benutzer ihre Maustaste loslässt, sondern dass Sie selbst entscheiden können, ob das ein Problem ist.

+1

Dies sollte akzeptiert werden antwort, danke für deine untersuchung! –