2017-01-17 13 views
-2

でクリックイベントを阻止されていない:ディスプレイ:どれも私は検索候補と検索ボックスを持っているjQueryの

<input id="searchBar" /> 
<div id="searchSuggestion"></div> 

入力が行われたときにdivのsearchSuggestionが自動的にjQueryのAJAXを介して更新される(コードが示されていません)。非表示/(検索テキストボックスの下に表示されます)オートコンプリート候補を表示するには、私が使用します。

$searchBar.blur(function() { 
    $searchSuggestion.css("display", "none"); 
}); 
$searchBar.focus(function() { 
    $searchSuggestion.css("display", ""); 
}); 

これまでのところは良いです。 display:noneがあるので、

$searchSuggestion.on("click", ".item", function() { 
    alert("clicked"); 
}); 

問題は、検索提案項目をクリックすると、フォーカスを失うテキストボックスが発生している:

は今、私は、ユーザーが検索の提案項目をクリックしたときにテキストボックスを自動入力したいです検索候補アイテムに設定すると、clickイベントは発生しません。

display:noneコードを削除すると、すべて正常に機能します。

この競合を回避するにはどうすればよいですか?

+3

あなたが必要とするロジックはかなりレイアウトされています。 * searchSuggestion以外の*をクリックすると、検索候補が非表示になります。 –

+0

クリックを委任します。 event.targetが提案または検索バーでない場合は、 – mplungjan

+0

@KevinBを正確に行う方法を隠しますか?グローバルなマウスクリックイベントをキャプチャしますか? – kevin

答えて

0

あなたのblurハンドラ内で小さなtimeoutを追加することでこの問題を回避することができ、例えば、これを試してみてください。

$searchBar.blur(function() { 
    setTimeout(function() { 
     $searchSuggestion.css("display", "none"); 
    }, 150); 
}); 
+0

is not 'これは、提案項目の部分をクリックすると全体的に.... clearTimeoutが欠けていますか? –

+0

タイムアウトなしでこれを行うことは可能ですか?理想的には、ユーザーが提案をクリックした時点で、フォーカスは既にわかっています。 blur()イベントの前に起動するclick()イベントが必要です。 – kevin

+0

@KevinBインスタンスが1つしか作成されないため、タイムアウトをクリアする必要はありませんが、もう一方の間隔はクリアする必要があります –

1

が伝播すると、フォーカスを失う要素を引き起こしてからマウスダウンイベントを防ぎthisソリューション、になってしまいましたクリック前(マウスアップが必要)は発射されます:

$searchSuggestion.on("mousedown", function (e) { 
    e.preventDefault(); 
}).on("click", ".item", function() { 
    alert("clicked"); 
}); 
関連する問題