Как остановить событие кипящий на CheckBox мыши

голоса
149

У меня есть флажок, что я хочу, чтобы выполнить какое-либо действие Ajax на событие щелчка, однако флажок также внутри контейнера с его собственным поведением мыши, что я не хочу работать, когда флажок щелкнули. Этот пример иллюстрирует то, что я хочу сделать:

<html lang=en>
    <head>
        <title>Test</title>
        <script type=text/javascript src=http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js></script>
        <script type=text/javascript>
        $(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
            });
        });
        </script>
        <style type=text/css>
        #container.hidden #body {
            display:none;
        }
        </style>
    </head>
    <body>
        <div id=container>
            <div id=header>
                <h1>Title</h1>
                <input type=checkbox name=test />
            </div>
            <div id=body>
                <p>Some content</p>
            </div>
        </div>
    </body>
</html>

Тем не менее, я не могу понять, как остановить событие пузырится, не вызывая поведение по умолчанию щелчка (флажок становится проверить / сняты), чтобы не работать.

Оба следующих остановить событие пузырится, но не изменить состояние флажка:

event.preventDefault();
return false;
Задан 22/07/2009 в 10:55
источник пользователем
На других языках...                            


8 ответов

голоса
30

Используйте метод stopPropagation:

event.stopPropagation();
Ответил 22/07/2009 в 11:06
источник пользователем

голоса
272

замещать

event.preventDefault();
return false;

с

event.stopPropagation();

event.stopPropagation ()

Останавливает барботирование события для родительских элементов, предотвращая любые родительские обработчики из уведомления о событии.

event.preventDefault ()

Предотвращает браузер от выполнения действия по умолчанию. Используйте метод isDefaultPrevented знать, был ли этот метод никогда не вызывается (на этот объект события).

Ответил 22/07/2009 в 11:06
источник пользователем

голоса
5

Как уже упоминалось, попробуйте stopPropagation().

И есть второй обработчик попробовать: event.cancelBubble = true;Это конкретный обработчик IE, но он поддерживается , по крайней мере , FF. Не очень много знаю об этом, так как я не использовал его сам, но это может быть стоит выстрел, если все остальное терпит неудачу.

Ответил 22/07/2009 в 11:12
источник пользователем

голоса
25

Не забывайте IE:

if (event.stopPropagation) {    // standard
        event.stopPropagation();
    } else {    // IE6-8
        event.cancelBubble = true;
}
Ответил 16/12/2012 в 10:50
источник пользователем

голоса
4

Это отличный пример для понимания событий кипящих концепций. На основании приведенных выше ответов, окончательный код будет выглядеть , как указано ниже. Если пользователь нажмет на флажке распространения событий в «заголовок» родительский элемента будет остановлено с помощью 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;
               }
          });     
  });
Ответил 27/07/2015 в 10:13
источник пользователем

голоса
5

При использовании JQuery вам не нужно вызывать функцию остановки отдельно ..

Вы можете только return falseв обработчике события

Это остановит событие и отменить бульканье ..

Также см:

event.preventDefault () против возврата ложной

Из документов JQuery:

Эти обработчики, таким образом, может предотвратить делегированное обработчик от запуска путем вызова event.stopPropagation () или возвращение ложным.

Ответил 17/08/2015 в 10:36
источник пользователем

голоса
0

Кредит @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>

Ответил 19/04/2017 в 20:39
источник пользователем

голоса
-1

В angularjs это должно работы:

event.preventDefault(); 
event.stopPropagation();
Ответил 22/05/2017 в 09:08
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more