除非使用jQuery单击特定元素,否则对模糊执行操作

有两个元素在起作用:

$('#myInput') // an input field for search $('#myList') // a list to display search results 

我想在输入不再具有焦点时隐藏列表,如下所示:

 $('#myInput').blur(function() { $('#myList').hide(); }); 

这很有效,除非单击列表项,因为模糊事件在注册单击之前触发并隐藏列表。 目标是在单击列表的任何部分时列表保持可见,即使这会导致输入模糊。

我怎样才能做到这一点? 谢谢!

您可以通过保持全局变量和setTimouts等待延迟200毫秒然后检查2个元素中的一个是否具有焦点来实现此目的。

 var keepFocus = false; function hideList(){ if(!keepFocus){ $('#myList').hide(); } } $('#myInput').blur(function() { keepFocus = false; window.setTimeout(hideList, 200); }).focus(function(){ keepFocus = true; }); $('#myList').blur(function() { keepFocus = false; window.setTimeout(hideList, 200); }).focus(function(){ keepFocus = true; }); 

你需要能够说“做这个模糊(),除非列表同时获得焦点”。

这个问题说明了如何检测元素是否具有焦点: 使用jQuery测试输入是否具有焦点

那么你需要做的就是:

 $("#myInput").blur(function () { if (!$("#myList").is(":focus")) { $("#myList").hide(); } }); 

我遇到了完全相同的问题,所以这就是我解决它的方法。

我想出了blur()click()更早发生的事实。

所以我试图将click()更改为mousedown()并发现mousedown()blur()之前触发。

要模仿click()你必须解雇mousedown()然后mouseup()

所以在你的情况下,我会做这样的事情:

 var click_in_process = false; // global $('#myList').mousedown(function() { click_in_process = true; }); $('#myList').mouseup(function() { click_in_process = false; $('#myInput').focus(); // a code of $('#myList') clicking event }); $('#myInput').blur(function() { if(!click_in_process) { $('#myList').hide(); // a code of what you want to happen after you really left $('#myInput') } }); 

演示/示例: http : //jsfiddle.net/bbrh4/

希望能帮助到你!

Pigalev Pavel的回答非常有效。

但是,如果您想要一个更简单的解决方案,您可以在元素的“mousedown”中“防止默认”以防止模糊事件发生。 (因为防止默认实际上意味着最终输入永远不会失去焦点!)

当然,只有你在防止div中的默认值时才会这样。 它确实有一些副作用,比如文本不再可选。 只要这不是问题,这将有效。

我想如果你把鼠标放在div上,将鼠标移到div之外,然后释放鼠标,它也不会触发“模糊”事件。 但在我的情况下,我也不太担心,因为点击开始于目标div。

 $("input").focus(function(){ $(this).val(""); }); $("input").blur(function(){ $(this).val("blur event fired!"); }); $("div").mousedown(function(e){ e.preventDefault(); }) 
 div{ height: 200px; width: 200px; background: blue; } 
   
Click here to prevent blur event!

执行此操作的最佳方法是将事件处理程序附加到body元素,然后将另一个处理程序附加到列表以停止事件传播:

 $(body).click(function () { $("#myList").hide(); }); $("#myList").click(function (e) { e.stopImmediatePropagation(); }); 

这会侦听#myInput外部的单击并隐藏#myList。 同时,第二个函数侦听#myList上的单击,如果它发生,它会阻止hide()触发。