2009-12-17 37 views
4

有人可以幫我解決這個問題嗎? :jquery文檔正文單擊事件

我有一個按鈕,單擊時它顯示一個特定的div。這個div有幾個後代。現在,我想要的是,當我點擊文檔中的其他地方時,,但不會在這個div消失的任何後代中。 我認爲是使用未選擇器這樣的:

$("#button").click(function(){ 
    $("#mydiv").show(); 
    $(document.body).not($("#mydiv").children()).one('click',function(e) { 
     $("#mydiv").hide(); 
    }); 
     return false; 
}); 

,但是這是不工作!任何想法爲什麼?謝謝

+0

另外,我的問題:我明白,一個綁定事件只有一次到所有匹配的元素。因此,如果用戶在div外部單擊「元素a」(div現在隱藏),然後單擊div外部的「元素b」,此事件將再次觸發「元素b」? – ram 2009-12-17 22:53:19

回答

15

如何檢查點擊事件,看看被點擊了什麼?具體看看event.target

$(document).click(function(event) { 
    var target = $(event.target); 

    if (!target.attr('id').match(/^mydiv/) && target.parents('#mydiv').length == 0) { 
    $('#mydiv').hide(); 
    } 
}); 

我已經使用此代碼之前關閉一個打開的窗口,當有人點擊任何地方,但窗口。

+0

我不想排除只有該編號,但也排除該元素的所有後代 – Manuel 2009-12-17 22:56:56

+0

嘗試更新的代碼,它應該檢查目標沒有任何父母的編號是「mydiv」。 – 2009-12-17 23:01:09

+0

完美!謝謝 – Manuel 2009-12-17 23:07:21

5

最接近檢查是否目標是mydiv的後裔。

$("#button").click(function(){ 
    $("#mydiv").show(); 
    $(document.body).click(function() { 
     if ($(event.target).closest("#mydiv").length == 0) 
      $("#mydiv").hide();  
    }); 
    return false; 
}); 

如果你點擊裏面mydiv不能使用one()因爲該事件會得到清除。如果你想刪除它,你必須做一些自定義事件解除綁定。

+0

由於$(this)對象是document.body – Manuel 2009-12-17 22:51:00

+0

,所以不起作用。對不起。忘了你必須使用目標。固定。 – Joel 2009-12-18 14:56:29

0

的問題可能與您傳遞什麼到.not()排除

.not($("#mydiv").children()) 

此刻的你傳遞一個jQuery對象,但from the docs,什麼被傳遞到.not()應該是一個字符串選擇器,DOM元素或DOM元素的數組。因此,簡單地jQuery對象轉換爲元素的數組應該工作

$("#button").click(function(){ 
    var myDiv = $("#mydiv").show(); 
    $(document.body).not(myDiv.children().get()).one('click',function(e) { 
     myDiv.hide();  
    }); 
     return false; 
}); 
+0

好吧,我現在已經學到了一些新東西,但仍然沒有解決我的問題。無論如何感謝 – Manuel 2009-12-17 22:57:43