jQuery klik di mana saja di halaman kecuali pada 1 div

89

Bagaimana saya bisa memicu suatu fungsi ketika saya mengklik di manapun pada halaman saya kecuali pada satu div ( id=menu_content)?

Vincent Roye
sumber

Jawaban:

145

Anda dapat menerapkan clickpada bodydokumen dan membatalkan clickpemrosesan jika clickacara dihasilkan oleh div dengan id menu_content, Ini akan mengikat acara ke satu elemen dan menyimpan pengikatan clickdengan setiap elemen kecualimenu_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

});
Adil
sumber
3
bagaimana dengan anak keturunan di DIV?
iKamy
2
Kita bisa menggunakan terdekat untuk memeriksa sumber peristiwa memiliki leluhur dengan id menu_content seperti if ($ (evt.target) .closest ('# menu_content'). Length) retrun; periksa jawaban saya yang diperbarui.
Adil
Karena closestdimulai dengan elemen saat ini, ia menangani klik menu_content, serta klik pada turunan. Saya pikir yang kedua ifadalah yang Anda butuhkan.
selamat tinggal
50

Lihat dokumentasi untuk jQuery Event Target . Dengan menggunakan properti target objek peristiwa, Anda dapat mendeteksi asal klik dalam #menu_contentelemen dan, jika demikian, menghentikan handler klik lebih awal. Anda harus menggunakan .closest()untuk menangani kasus di mana klik berasal dari turunan #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
});
nbrooks.dll
sumber
43

coba ini

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

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

Anda juga bisa menggunakan acara luar

Database_Query
sumber
5
Ini berfungsi, tetapi menggunakan event.stopPropagation () dapat berdampak pada JS lain yang terdapat dalam induk.
Edd Smith
9

Saya tahu bahwa pertanyaan ini telah terjawab, Dan semua jawabannya bagus. Tetapi saya ingin menambahkan dua sen saya ke pertanyaan ini untuk orang-orang yang memiliki masalah serupa (tapi tidak persis sama).

Secara lebih umum, kita dapat melakukan sesuatu seperti ini:

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

Dengan cara ini kita tidak hanya dapat menangani peristiwa yang dipicu oleh apa pun kecuali elemen dengan id menu_contenttetapi juga peristiwa yang dipicu oleh apa pun kecuali elemen apa pun yang dapat kita pilih menggunakan pemilih CSS.

Misalnya dalam cuplikan kode berikut saya mendapatkan peristiwa yang dipicu oleh elemen apa pun kecuali semua <li>elemen yang merupakan turunan dari elemen div dengan id myNavbar.

$('body').click(function(evt){    
    if(!$(evt.target).is('div#myNavbar li')) {
        //event handling code
    }
});
gandalf
sumber
1
Saya hanya ingin mengatakan bahwa metode ini bekerja dengan baik untuk saya, saya menggunakan .is () dan juga .closest () dengan pemilih css yang tidak memiliki ID tetapi hanya beberapa kelas terima kasih
relipse
7

inilah yang saya lakukan. ingin memastikan saya bisa mengklik salah satu anak di datepicker saya tanpa menutupnya.

$('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
    }
});

kode saya yang sebenarnya:

$('html').click(function(e){
    if (e.target.id != 'datepicker'
        && $(e.target).parents('#datepicker').length == 0
        && !$(e.target).hasClass('datepicker')
    ) {
        $('#datepicker').remove();
    }
});
Nate
sumber
Versi bagus termasuk klik pada anak-anak dan kelas, harus menjadi jawaban yang dipilih!
rAthus