jQuery-单击focusin上显示的按钮

jQuery-单击focusin上显示的按钮,jquery,Jquery,我想在focusin上显示按钮,单击时执行一些操作或在focusout上隐藏该按钮: $(".editableDiv").live('focusin', function(){ // show button under the .editableDiv div $("#button").live('click', function(){ // do action }); $(".editableDiv").live('focusout', fun

我想在focusin上显示按钮,单击时执行一些操作或在focusout上隐藏该按钮:

$(".editableDiv").live('focusin', function(){
    // show button under the .editableDiv div

    $("#button").live('click', function(){
        // do action
    });
    $(".editableDiv").live('focusout', function(){
        // hide button
    });
});
它在焦点上显示按钮,但当单击按钮时,该操作将被忽略,按钮将立即隐藏,就像focusout优先于单击一样。当我尝试移除focusout部分时,操作完成,但按钮保持可见。。。但我需要隐藏focusout上的按钮


看起来很简单。。。但是我不明白为什么它不起作用-任何提示都将不胜感激。

您需要稍微调整一下处理程序的分配。现在,按钮单击和focusout处理程序仅绑定在第一个focusin上


除此之外,还有一个问题(不使用IE特定信息),是什么事件触发了focusout(因此您无法将按钮隔离为源)。最好的解决方案似乎是超时解决方案。我建议使用中提供的代码。

这只是当你点击一个按钮时,你实际上是在关注它,因此,对于刚刚有焦点的任何东西,它都会触发focusout/blur事件。

发生的是,focusout在接收到click事件之前触发并隐藏了你的按钮

那么为什么不在几毫秒后隐藏click/focusout按钮呢

$(".editableDiv").live('focusin', function(){
    // show button under the .editableDiv div
    $("#button").show();
}).live('focusout', function(){
    setTimeout(function(){
        $("#button").hide();
    },50);
});
$("#button").live('click', function(){
    // hide button
    alert('test');
    $("#button").hide();
});

您需要防止该按钮单击处理程序上的事件传播,因为如果没有,按钮将获得焦点,并调用focusout函数

$("#button").live('click', function(event) {
  event.stopPropagation();
  //do your thing...
});

单击时您正在执行的操作是什么?您可以将
click
的绑定移动到
focusin
处理程序中的按钮外,因为它是由id绑定的。您确实不应该使用live。使用
delegate()
另外,您能在jsbin.com或其他网站上向我们展示一下吗?按钮是在div内还是在div外?@no.good.at.coding-该操作是一个很长的函数,用于获取contentEditable=true的div内容,并对其执行一些操作。我不想让这个问题复杂化——当focusout部分被移除时,这个动作做得很好。我最初在handler中的按钮没有聚焦,但它没有任何区别。实际上,我正试图通过将其移动到focusin处理程序中来修复它:(看起来是这样,但我怎么能避免呢?哎呀,我的操作是反向的。我认为问题仍然存在,主要是按钮在收到点击之前就被隐藏了:这产生了与我上面代码相同的结果。focusout似乎在点击注册之前就隐藏了按钮。点击似乎不均匀调用focusout函数是因为在此之前调用了…因此添加.stopPropagation()点击函数不在里面调用。是的,没错。点击事件绑定必须在广泛播放之后才从焦点中出来,这是正确的答案。@贾斯克特-谢谢,我以前也曾经做过类似的事情。@ HuZZZ。如果你认为是正确的答案,点击下面的勾选勾勾到LF的勾勾。答案的t.:@honzzz-我刚刚在一台笔记本电脑上尝试了这个方法,但速度不是特别快,50毫秒太快了;在
setTimeout()
上,你可能会将它增加到250或500毫秒。