除非使用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()触发。