2011-12-05 82 views
1

時除外jQuery的模糊事件這是我的代碼:點擊一個特定的div

$("#newGenreTxt").blur(function() { 
     $("#txtAddGenreContainer").slideUp(); 
    }); 

我想隱藏的文本框,如果它失去焦點,但問題是,我想如果用戶將其隱藏點擊任何地方,但我的按鈕:

$("#addGenreFinal").click(function() {}); 

所以,如果用戶點擊addGenreFinal沒有任何反應,如果它是其他隱藏的文本框的東西。

回答

3

可以綁定.slideUp()調用點擊事件觸發的文檔對象,然後取消點擊,如果它被稱爲在任所述addGenreFinalnewGenreTxt元素:

//add event handler to hide the `txtAddGenreContainer` element when the document is clicked 
$(document).on('click', function() { 
    var $tar = $("#txtAddGenreContainer");//UPDATE 
    if ($tar.css('display') != 'none') {//UPDATE 
     $tar.slideUp(); 
    }//UPDATE 
}); 

//add event handler to the `addGenreFinal` and `newGenreTxt` elements to stop the click event from bubbling up the document 
$('#addGenreFinal, #newGenreTxt').on('click', function (event) { 
    event.stopPropagation(); 
}); 

這裏是一個的jsfiddle:http://jsfiddle.net/jasper/qrSEn/

+0

我喜歡你的答案,但我'我不知道這種解決我的問題的方式是否得到了很好的優化,因爲我將點擊這個地方(文檔),並且每次點擊這個函數on會執行(第一個,滑動一個),這樣會影響我的表現嗎?即使文本框被隱藏,這段代碼也會一次又一次地隱藏起來...... –

+0

如果元素已經隱藏,'slideUp()'函數將不會運行,但是您也可以自己檢查。查看**更新**到我的答案。 – Jasper

+0

if語句對任何事情都沒有幫助,因爲它每次點擊文檔時仍然檢查隱藏屬性,它仍然使用積分能力,也許它是微不足道的,但仍然.. –

2

請注意,單擊事件傳播。除非您通過點擊處理程序調用e.stopPropataion(),否則它仍然會執行點擊其他對象(例如,文檔正文)。

無論如何,您的邏輯有瑕疵,因爲它需要生活在最高事件級別,並通過使用e.target來測試實際開始點擊事件的內容。

你可以做這樣的事情:

$(document).click(function(e) { 
    if (e.target.id === 'addGenreFinal') 
     return; 
    $('#txtAddGenreContainer').slideUp(); 
}); 

JSFiddle Example

+0

感謝您的回答,我想知道我是否可以使用brur方法以某種方式結合它。不jQuery的方法,雖然我甚至不知道如果這是有道理的 –

+0

@AlanBudzinski你必須更具體說明你的意思是... –

1

如果你仍然想使用.blur(),你可以這樣做:

$("#newGenreTxt").blur(function (e) { 
    if ($(e.relatedTarget).attr('id') == 'addGenreFinal') 
     return; 

    $("#txtAddGenreContainer").slideUp(); 
}); 

http://jsfiddle.net/Yz5Gh/