2011-07-21 56 views
2

使用jQuery的1.6.1,因为我有以下HTML:jQuery事件;防止 “兄弟姐妹”,从触发事件eachothers

<div class="control"> 
    <label>My Control</label> 
    <input type="text" /> 
    <input type="text" /> 
</div> 

<div class="control"><input>以下仅control)聚焦时,<label>position: relative;)动画:

$('.control :input').bind('focus', function(e){ 
    $(this).prevAll('label').animate({ 
     'left': '-50px' 
    }, 250); 
}); 

当模糊,所述<label>返回:

.bind('blur', function(e){ 
    $(this).prevAll('label').animate({ 
     'left': '0px' 
    }, 250); 
}); 

然而,如果<input>元件获得焦点,然后之一模糊作为焦点相同control内切换到另一<input>(经由标签或鼠标点击)的事件当然还是火,而<label>来回动画。

如何强制模糊事件触发只有当焦点丢失从所有在给定的control输入?

回答

1

编辑:根据OP提供的更多输入更新答案。

如果一秒稍有延迟隐藏标签是好的,那么你可以使用的setTimeout/clearTimeout组合.. 喜欢的东西:

<div class="control"> 
    <label>My Control</label> 
    <input type="text" /> 
    <input type="text" /> 
    <input type="text" /> 
</div> 
<div class="control"> 
    <label>My Control</label> 
    <input type="text" /> 
    <input type="text" /> 
    <input type="text" /> 
</div> 

<div class="control"> 
    <label>My Control</label> 
    <input type="text" /> 
    <input type="text" /> 
    <input type="text" /> 
</div> 

<div class="control"> 
    <label>My Control</label> 
    <input type="text" /> 
    <input type="text" /> 
    <input type="text" /> 
</div> 

    <script type="text/javascript"> 
     var timeoutIds = []; 
      $('.control').each(function(index, el){ 
       $(':input', el).bind('focus', function(e){  
         clearTimeout(timeoutIds[index]); 
         $(this).prevAll('label').animate({   
           'left': '-50px'  
         }); 
       }); 

       $(':input', el).bind('blur', function(e){  
         var that = this; 
         timeoutIds[index] = setTimeout(function(){ 
          $(that).prevAll('label').animate({   
            'left': '0px' 
          }); 
        }, 500); 
       }); 
      }); 
    </script> 

工作例如:http://jsfiddle.net/Tn9sV/2/

+0

谢谢@Cyber​​nate - 几乎就像一个魅力。也许这是我的错,因为我没有提到会有多个“控制”。从“控制”切换到“控制”时,由于第二秒调用了“clearTimeout()”,模糊无法在第一次触发。 – Dan

+0

@Tomcat:但模糊首先触发,然后关注第二。 – Chandu

+0

@TomcatExodus:它工作得很好。检查此jsfiddle:http://jsfiddle.net/Tn9sV/ – Chandu

1

在你模糊的回调我想看看这样的事情是在1.6引入了:focus选择:

Using jQuery to test if an input has focus

如果$('.control :focus).length > 0return停止运行的功能。

+0

感谢@Alex Mcp--不幸的是,即使从“输入”立即切换到“输入”,模糊事件在下一个焦点事件之前立即出现(*在我的粗略测试*中)。它总是评估为0. – Dan

+0

Aaah,有趣。根据其他答案,我认为稍有延迟是为了。让焦点有机会进行注册,然后评估是否存在焦点元素。 –

+0

也许,我希望@Cyber​​nate提出的答案能让我在那里。 – Dan

1

我在过去通过将新的焦点绑定到文档或表单而不是将输入的模糊绑定到输入上,从而触发标签返回而取得了类似的成就。

+0

Thanks @citizen conn - 这似乎是一个可行的解决方案,但是我似乎无法将'focus'事件绑定到'body','document','window'等等。至? – Dan

+0

@TomcatExodus对不起,绑定一个mousedown事件,而不是焦点 –

+0

谢谢@citizen conn - 问题是,如果我'Tab'出控制组,它不会触发。 – Dan

0

两个选项,我能想到的:

  • 选项1(使用当前的方案):

    • 模糊:由第二

    • 的一小部分.delay动画重点:。停止现有的动画

  • 选项2(变模糊项):

    • CHAGE模糊项目在您的股利,而不是标签的
1

blur回调你可以使用这个$("input:focus").length来检测是否有任何输入元素被聚焦。如果length>0比没有动画

更新

这个怎么样的代码?

var control; 
    var inTheSameControl=false; 
    $('.control :input').bind('focus', function(e){ 
     if(control) 
     { 
      if(control.find(this).length>0) 
       inTheSameControl=true; 
      else 
       inTheSameControl=false; 
     } 
     control=$(this).parent(); 
     if(!inTheSameControl) 
     { 
      console.log('focus'); 
     } 
    }); 
    $('.control :input').bind('blur', function(e){ 
     if(!inTheSameControl) 
     { 
      console.log('blur'); 
     } 
    }); 

它与多个div.control 当你将焦点切换到input在另一个.contor,文字“专注”登录到控制台,如果你是住在同一个.control - 没有。 而不是console.log(...)你可以写你想要的。我没有写你的代码(动画),因为它不是主题。

我希望它会有帮助。

+0

感谢@Ruslan Polutsygan - 不幸的是它不起作用,请参阅我对Alex的回答的评论。 – Dan

+0

看到我上面的更新后的帖子。 –