Остановить распространение событий для нескольких встроенных функций JS

У меня есть такой тип кода:

<button onclick="fn1();fn2();fn3()">Clic</button>

Я тестирую что-то в fn1 и если это правда, я не хочу, чтобы fn2 и fn3 назывались. Я использовал event.stopPropagation() в fn1 (в кроссбраузерном режиме и с передачей события в функцию), но другие функции все равно вызываются.

Кто-нибудь может помочь?


person MuyBien    schedule 19.09.2014    source источник
comment
Почему бы вам просто правильно не подключить три прослушивателя событий вместо одного?   -  person Bergi    schedule 19.09.2014


Ответы (4)


попробуй это:

<html>
<head>
  <script>
    function fn1() {
        alert('fn1()');
        return false;
    }

    function fn2() {
        alert('fn2()');
        return true;
    }

    function fn3() {
        alert('fn3()');
        window.location.assign("http://www.google.com");
    }
  </script>
</head>
<body>
    <button onclick="fn1()&&fn2()&&fn3()">Click</button>
</body>
</html>

все функции должны возвращать логическое значение, а затем использовать логические операторы && внутри onclick

<button onclick="fn1()&&fn2()&&fn3()">Click</button>

как вы можете видеть, если fn1() возвращает false, f2() и f3() не выполняются.

person Joao Aguas    schedule 19.09.2014
comment
Спасибо. Это работает. Единственный плохой момент в том, что вам нужно вернуть true, чтобы запустить следующую функцию... Но это работает хорошо. Спасибо. - person MuyBien; 25.09.2014

Это не очень хорошая практика, но есть способ. Вы можете генерировать свои собственные исключения только для того, чтобы остановить выполнение. Я повторяю это снова, это не очень хорошая практика

<script type="text/javascript">
function one(){
    var a = 1;
    console.log('one');
    if(a == 1){
        throw new RangeError("Sorry, but you are too young for this movie");
    }
}
function two(){
    console.log('two');
}
</script>

<button onclick="one();two();">Click me.</button>
person andrex    schedule 19.09.2014
comment
Привет Андрей. Спасибо, но это правда, что немного сложно запустить ошибку ^^ - person MuyBien; 25.09.2014

Вы можете изменить свою функцию fn1, чтобы она возвращала результат проверки, которую вы выполняете. Затем вы можете изменить атрибут onclick на:

if (!fn1()) { fn2(); fn3(); };

Я также рекомендую вместо этого ознакомиться с .addEventListener(). использования атрибута onclick.

person Jonathan Steinbeck    schedule 19.09.2014

Вы можете просто иметь условие if на кнопке, подобное упомянутому ниже:

<button onclick="if(!fn1()){fn2();fn3()}">Click</button>

Рабочая скрипта

person V31    schedule 19.09.2014
comment
В вашем JSFiddle, если вы измените onclick с помощью ‹button onclick=if(fn1()){fn2();fn3()}›Click‹/button›, fn2 и fn3 по-прежнему не запускаются, даже если return true в фн1... - person MuyBien; 25.09.2014
comment
привет @Fred: условие if(!fn1()) и оно возвращает true в скрипке, поэтому оно не будет выполнять fn2 и fn3, и если мы изменим return на false, оно выполнит их как требование - person V31; 25.09.2014
comment
@fred позвольте мне изменить возврат и добавить скрипку в этот комментарий: jsfiddle.net/uhwgfzqd/1 - person V31; 25.09.2014
comment
@Fred: эта скрипка с html-разметкой вашей кнопки, которая идет на fn2 и fn3, поскольку это правда jsfiddle.net /uhwgfzqd/2 - person V31; 25.09.2014
comment
Да ОК, я внес изменения... Вероятно, я ошибся... ОК :) - person MuyBien; 26.09.2014
comment
^^ может быть. Это правда, что для работы, как я ожидаю, не обязательно иметь return true во второй функции... но я думаю, что это менее понятно. Могу ли я принять 2 ответа на вопрос? - person MuyBien; 29.09.2014
comment
@Fred: Вы не можете, если вы считаете, что это неподходящее решение, вам не следует его принимать ... иначе вы можете изменить ответ. - person V31; 29.09.2014