2011-07-21 128 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

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