我有两个陈述。我想要做的是当有人点击#area_a
然后隐藏整个#area_b
div 而不激活focusout
的{{1}}。但是我尝试了不同的代码(我不在这里,因为它不正确,想要得到你的建议),而且每次点击#area_b_textbox
div时都会激活focusout
。
JQuery基本动作
#area_a
HTML:
$("#area_a").click(function() { $("#area_b").hide(); });
$("#area_b_textbox").focusout(function() {$("#area_b_error").show();});
谢谢!
答案 0 :(得分:1)
这是不可能的,因为当你点击其他地方时自动松开焦点......
您需要做的是在#area_a
悬停时取消绑定焦点事件并稍后重新绑定...
$("#area_a").click(function() {
$("#area_b").hide()
}),hover(
function(){
$("#area_b_textbox").unbind("focusout")
},
function(){
$("#area_b_textbox").focusout(function() {$("#area_b_error").show();});
}
)
PS:你的终极目标是什么?
答案 1 :(得分:1)
为什么不添加一个标志来忽略下一个focusout(blur?)事件。
ignoreNextFocus = false;
$("#area_a").click(function() { ignoreNextFocus=true; $("#area_b").hide(); });
$("#area_b_textbox").focusout(function() { if(!ignoreNextFocus)$("#area_b_error").show();ignoreNextFocus=false;});
在该注释上设置点击事件的标志可能为时已晚。如果是这种情况,请尝试mousedown事件。
答案 2 :(得分:1)
你可以用计时器解决这个问题。定时器通常味道不好,但我认为这是你最安全的选择。如果您尝试使用悬停或其他鼠标事件,您可能会遇到键盘导航和激活问题或触摸界面上缺少“hoverish”事件(我们不能假装它们不再存在)。
这样的事情:
var timer_kludge = {
start: function(fn) {
this.id = setTimeout(fn, 200);
},
stop: function() {
if(this.id)
clearTimeout(this.id);
this.id = null;
},
id: null
};
$('#area_a').click(function() {
timer_kludge.stop();
$('#out').append('<p>click</p>');
});
$('#area_b_textbox').focusout(function() {
timer_kludge.start(function() {
$('#out').append('<p>textarea focusout</p>');
});
});
$('#area_b_textbox').focusin(function() {
timer_kludge.stop();
});
演示:http://jsfiddle.net/ambiguous/s8kw8/1/
你想稍微玩200超时,看看在你的情况下什么效果最好。
答案 3 :(得分:0)
我不确定这是否可行,因为根据定义,如果用户要点击按钮,焦点必须留下#area_b_textbox。