jQuery клацніть де завгодно на сторінці, крім 1 розділу


Відповіді:


141

Ви можете подати заявку clickна bodyдокумент і скасувати clickобробку, якщо clickподія генерується div з ідентифікатором 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

2
Ми можемо використовувати найближчий для перевірки джерела події, який має будь-якого предка з ідентифікатором menu_content, наприклад if ($ (evt.target) .closest ('# menu_content'). Length) retrun; перевірити мою оновлену відповідь.
Аділ

Оскільки closestпочинається з поточного елемента, він обробляє натискання menu_content, а також натискання на нащадків. Я думаю, що друге if- це все, що вам потрібно.
goodeye

50

Див. Документацію щодо jQuery Target Event . Використовуючи властивість 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
});

42

спробуйте це

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

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

Ви також можете використовувати зовнішні події


5
Ця робота, але використання event.stopPropagation () може вплинути на вплив на інші JS, що містяться в батьківському.
Edd Smith

9

Я знаю, що на це питання відповіли, і всі відповіді приємні. Але я хотів додати свої два центи до цього питання для людей, які мають подібну (але не зовсім однакову) проблему.

Більш загальним чином ми можемо зробити щось подібне:

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

Таким чином ми можемо обробляти не тільки події, що запускаються будь-чим, крім елемента з ідентифікатором, menu_contentале також події, які запускаються будь-чим, крім будь-якого елемента, який ми можемо вибрати за допомогою селекторів CSS.

Наприклад, у наступному фрагменті коду я отримую події, що запускаються будь-яким елементом, крім усіх <li>елементів, які є нащадками елемента div з ідентифікатором myNavbar.

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

1
Я просто хотів сказати, що цей метод у мене спрацював чудово, я використовував .is (), а також .closest () із селектором css, який не мав ідентифікатора, але лише деякі класи дякую
relipse

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.