2010-09-22 33 views
3

我只是想隱藏一個div,如果文本框失去焦點,除非用戶在另一個特定div中點擊。如果用戶單擊該特定的div,則聚焦不會觸發div.box被隱藏。jQuery focusOut除了如果

下面是我的僞代碼評論的代碼。有任何想法嗎?

textInput.focusout(function() { 
    // So long you didn't click div.stop, then 
     $('div.box').hide(); 
}); 

回答

3
var flag = false; 

$('div.stop').click(function() {flag = true;}); 
textInput.focusout(function() { 
    // So long you didn't click div.stop, then 
    if(!flag) 
     $('div.box').hide(); 
}); 

如果你想避免添加的標誌變量,你可以使用jQuery的.data存儲針對例如標誌值在div.stop元素,如:

$('div.stop').click(function() {$(this).data('clicked', true);}); 

// ... 

    if(!$('div.stop').data('clicked')) 
// ... 

編輯

如果你想允許在文本框中具有焦點的情況,然後你點擊div.stop,你不希望它隱藏,那麼你可以嘗試這樣的:

$('div.stop').click(function() {$('div.box').stop();}); 
textInput.focusout(function() { 
    // So long you didn't click div.stop, then 
    $('div.box').delay(200).hide(); 
}); 
+0

嗯......你測試過了嗎?我認爲文本框可能在點擊按鈕上點擊之前失去焦點。 – Strelok 2010-09-22 06:17:04

+0

@Strelok - 編輯。我認爲你的解釋是正確的。 – sje397 2010-09-22 06:37:09

+0

我做了一些修改,使其能夠在文檔中被多次觸發,但是您提供的一般解決方案是正確的。謝謝! – James 2010-09-22 15:46:29

2
var flag = false; 
$('#inputID').blur(function(){ 
    $('div.box').toggle(flag);  
}); 

$('#someDIVid').click(function(){ 
    flag = true; 
}); 

simple demo

加入的備註:

.toggle(showOrHide)

showOrHide一個布爾指示是否顯示或隱藏的元素。如果此參數是true,則匹配的元素顯示爲;如果false,則隱藏元素

+0

在這裏使用切換沒有意義 - 'if(!flag).... hide()'更高效,更易於閱讀。 – sje397 2010-09-22 06:27:12

+0

@ sje397 - 我期望有人會這樣說:)但是你是第一個回答的人,所以我必須考慮其他方法。我腦子裏想的是,如果'div.box'已經隱藏,OP可能想要在點擊另一個框(OP上的'div.stop')後再次顯示該框。 :) – Reigel 2010-09-22 06:37:17

3
$(document).bind('click',function(e) { 
    if ($(e.target).closest('div.box').length) return; 
    $('div.box').hide(); 
}); 

試試這個!