Як зупинити бульбашку подій, натиснувши прапорець


182

У мене є прапорець, у якому я хочу виконати якусь дію Ajax на події клацання, однак прапорець також знаходиться всередині контейнера зі своєю власною поведінкою натискання, яку я не хочу запускати, коли клацніть прапорець. Цей зразок ілюструє те, що я хочу зробити:

$(document).ready(function() {
  $('#container').addClass('hidden');
  $('#header').click(function() {
    if ($('#container').hasClass('hidden')) {
      $('#container').removeClass('hidden');
    } else {
      $('#container').addClass('hidden');
    }
  });
  $('#header input[type=checkbox]').click(function(event) {
    // Do something
  });
});
#container.hidden #body {
  display: none;
}
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<div id="container">
  <div id="header">
    <h1>Title</h1>
    <input type="checkbox" name="test" />
  </div>
  <div id="body">
    <p>Some content</p>
  </div>
</div>

Однак я не можу зрозуміти, як зупинити барбот події, не спричиняючи, що поведінка натискань за замовчуванням (прапорець стане відміченою / знятою) не запускається.

Обидва наведені нижче дії зупиняють міхур події, але також не змінюють стан прапорця:

event.preventDefault();
return false;

2
Я знайшов статтю з цього питання, яка може бути корисною для інших стеклів. Коротка порада: Клацніть рядок таблиці, щоб запустити прапорець Клацання
Педер Райс

Відповіді:


341

замінити

event.preventDefault();
return false;

з

event.stopPropagation();

event.stopPropagation ()

Зупиняє переповнення події для батьківських елементів, запобігаючи повідомленню будь-яких батьківських обробників про подію.

event.preventDefault ()

Заважає браузеру виконувати дії за замовчуванням. Використовуйте метод isDefaultPrevented, щоб дізнатися, чи був цей метод колись викликаний (на цьому об'єкті події).


4
чомусь це не працює для мене, але повернути помилкове було.
Ренді Л

3
Якщо ви прив'язуєте подію .live()методом, це не вийде. Вам доведеться використовувати return false;себе.
rahul

2
Це працює за допомогою .on()методу jQuery (прямо зараз застаріле). Я не міг зрозуміти, чому повернення помилкового не працює.
styfle

Я витратив досить довгий час, щоб з'ясувати, що event.preventDefault () не показував галочку в IE8, але добре працював в інших браузерах. Цю відповідь я знайшов після того, як я виправив, а потім googling з prevenDefault, IE8, галочку як ключове слово, привів мене сюди.
signonsridhar

не працював для .., але цей два рядки зробили (без повернення помилково) -> event.preventDefault (); event.stopPropagation ();
Куган Кумар


29

Не забудьте IE:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}

23
Ця відповідь - з 2012 року. У 2015 році забудьте забути IE.
Тейлан

8
Це стосується і IE9. Мій тестовий апарат IE9 задавлюється на stopPropagation (), але любить cancelBubble (). А деякі люди / організації все ще використовують IE9 у 2016 році, на жаль. Ті з нас, що мають корпоративних клієнтів, не можуть цього ігнорувати.
Кріс Кобер

я люблю ie5 у 2019 році
SuperUberDuper

5

Як уже згадували інші, спробуйте stopPropagation().

І є другий обробник, який слід спробувати: event.cancelBubble = true;Це IE-специфічний обробник, але він підтримується принаймні FF. Насправді не знаю багато про це, так як я сам його не використовував, але, можливо, варто було б зняти, якщо все інше не вдасться.


5

Це чудовий приклад для розуміння концепції бурбалки подій. Виходячи з вищенаведених відповідей, остаточний код буде виглядати так, як було зазначено нижче. Якщо користувач натискає прапорець, розповсюдження події на його головний елемент 'header' буде припинено event.stopPropagation();.

$(document).ready(function() {
            $('#container').addClass('hidden');
            $('#header').click(function() {
                if($('#container').hasClass('hidden')) {
                    $('#container').removeClass('hidden');
                } else {
                    $('#container').addClass('hidden');
                }
            });
          $('#header input[type=checkbox]').click(function(event) {
              if (event.stopPropagation) {    // standard
                   event.stopPropagation();
               } else {    // IE6-8
                    event.cancelBubble = true;
               }
          });     
  });

5

Під час використання jQuery не потрібно викликати функцію зупинки окремо.

Ви можете просто повернутися falseв обробник подій

Це зупинить подію та скасує бурбалку.

Також див. Event.preventDefault () vs. return false

З документів jQuery:

Ці обробники, отже, можуть запобігти спрацьовуванню делегованого обробника шляхом виклику event.stopPropagation()або повернення false.


1

Кредит @mehras для коду. Я просто створив фрагмент, щоб продемонструвати це, тому що думав, що це буде вдячно, і я хотів, щоб виправдати цю функцію.

$(document).ready(function() {
  $('#container').addClass('hidden');
  $('#header').click(function() {
    if ($('#container').hasClass('hidden')) {
      $('#container').removeClass('hidden');
    } else {
      $('#container').addClass('hidden');
    }
  });
  $('#header input[type=checkbox]').click(function(event) {
    if (event.stopPropagation) { // standard
      event.stopPropagation();
    } else { // IE6-8
      event.cancelBubble = true;
    }
  });
});
div {
  text-align: center;
  padding: 2em;
  font-size: 1.2em
}

.hidden {
  display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="header"><input type="checkbox" />Checkbox won't bubble the event, but this text will.</div>
<div id="container">click() bubbled up!</div>


Код, який фактично показує, як використовувати змінну подій, дякую.
Моше Бініелі

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