jQueryは、1divを除くページ内の任意の場所をクリックします


回答:


144

イベントがidのdivによって生成された場合は、ドキュメントに適用clickして処理bodyをキャンセルできます。これによりclickclickイベントがmenu_content単一の要素にバインドされ、clickを除くすべての要素のバインドが保存されます。menu_content

$('body').click(function(evt){    
       if(evt.target.id == "menu_content")
          return;
       //For descendants of menu_content being clicked, remove this check if you do not want to put constraint on descendants.
       if($(evt.target).closest('#menu_content').length)
          return;             

      //Do processing of click event here for every element except with id menu_content

});

3
DIVの子孫はどうですか?
iKamy 2013年

2
イベントのソースのチェックに最も近いものを使用できます。if($(evt.target).closest( '#menu_content')。length)retrunのようなIDmenu_contentを持つ祖先があります。私の更新された答えを確認してください。
アディル2014

closest現在の要素で始まるためmenu_content、子孫のクリックだけでなく、のクリックも処理します。if必要なのは2番目だけだと思います。
goodeye 2018年

50

jQueryイベントターゲットのドキュメントを参照してください。イベントオブジェクトのtargetプロパティを使用すると、#menu_content要素内でクリックが発生した場所を検出し、発生した場合は、クリックハンドラを早期に終了できます。.closest()クリックがの子孫で発生した場合を処理するためにを使用する必要があります#menu_content

$(document).click(function(e){

    // Check if click was triggered on or within #menu_content
    if( $(e.target).closest("#menu_content").length > 0 ) {
        return false;
    }

    // Otherwise
    // trigger your click function
});

43

これを試して

 $('html').click(function() {
 //your stuf
 });

 $('#menucontainer').click(function(event){
     event.stopPropagation();
 });

外部イベントを使用することもでき ます


5
これは機能しますが、event.stopPropagation()を使用すると、親に含まれる他のJSに影響を与える可能性があります。
Edd Smith

9

私はこの質問が答えられたことを知っています、そしてすべての答えは素晴らしいです。しかし、似たような(しかし完全に同じではない)問題を抱えている人々のために、この質問に2セントを追加したいと思いました。

より一般的な方法では、次のようなことができます。

$('body').click(function(evt){    
    if(!$(evt.target).is('#menu_content')) {
        //event handling code
    }
});

このようにして、idを持つ要素以外のすべてによって発生するイベントだけでなくmenu_content、CSSセレクターを使用して選択できる要素以外のすべてによって発生するイベントも処理できます。

たとえば、次のコードスニペットでは<li>、idを持つdiv要素の子孫であるすべての要素を除くすべての要素によってイベントが発生していますmyNavbar

$('body').click(function(evt){    
    if(!$(evt.target).is('div#myNavbar li')) {
        //event handling code
    }
});

1
このメソッドは私にとっては問題なく機能したと言いたかったのですが、IDを持たないcssセレクターで.is()と.closest()を使用しましたが、いくつかのクラスに感謝します
relipse 2016年

7

これが私がしたことです。日付ピッカーの子を閉じずにクリックできることを確認したかったのです。

$('html').click(function(e){
    if (e.target.id == 'menu_content' || $(e.target).parents('#menu_content').length > 0) {
        // clicked menu content or children
    } else {
        // didnt click menu content
    }
});

私の実際のコード:

$('html').click(function(e){
    if (e.target.id != 'datepicker'
        && $(e.target).parents('#datepicker').length == 0
        && !$(e.target).hasClass('datepicker')
    ) {
        $('#datepicker').remove();
    }
});

子供やクラスのクリックを含む素敵なバージョンは、選ばれた答えでなければなりません!
rAthus 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.