2012-12-20 18 views
10

私はオートコンプリート検索ボックスを使ってプロジェクトを進めています。今私は、私は、入力フィールドには、より焦点を当てていないときに、私はオートコンプリートボックスを非表示にしたいと思うが、私は、入力ボックスに、見つかった自動補完からの値を渡したい問題があります。jQuery .focusout/.click conflict

ここでは、オートコンプリートボックスのクリックがフォーカスアウトとみなされ、値を渡す前でもボックスを非表示にしているので、両方とも競合しています。この種の問題のポインタや回避策はありますか?ここであなたにそれをより明確にするjsfiddle。

http://jsfiddle.net/KeGvM/

それともここ

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

答えて

17

似たような状況で私のソリューションは、一時的にblurイベントハンドラで行われたアクションをオフに保持するためのタイムアウトを使用していました。このように:

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

非常に良い回避策です。早速のお返事ありがとうございます! – Johnny000

+1

私はopのような同様の問題を抱えていました。私は解決策としてこの汚れた修正を使用することに決めました。これはイベントを競合状態にし、非常に悪い習慣にします。私はこの答えに感謝しますが、downvoteを使用します。より良い答えを待っている。 – Sharky

17

使用についての方法:私はそれを使用して同じ問題を解決し

置きます。

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

私はこれが最善の解決策だと思います。私はそれを使用して、それは完全に動作します。ありがとう! – ZanattMan

+1

これは私がインターネット上で見つけた最もエレガントなソリューションです。ありがとう。 –

+0

マウスのホバーがリスト表示されていて、Tabを押すと(次の入力に移動するなど)** [JSFIDDLE](http://jsfiddle.net/KeGvM/61/)** – bsbak

1

Iはclickはないがmousedownイベントがfocusoutイベントの前にトリガされ、これは、代わりclickmousedownイベントを使用した解決方法。

以下の小さなデモで試してみることができます。フィールドに注目し、ボタンをクリックします。

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>

ますが、出力は次の順序である見ることができるように:

  1. マウスダウン
  2. フォーカスアウト
  3. クリック

このソリューションの唯一の欠点は、ユーザーがマウスボタンを離すのを待たずに、問題がある場合は自分で判断できることです。

+1

これが受け入れられるはずです答え、あなたの調査のおかげで! –