同一元素的两次单击事件

时间:2018-06-29 15:30:05

标签: javascript jquery

我遇到的情况是,我将click事件附加到元素的onClick属性上,并且还有一个click事件会在具有特定类的任何元素上触发。元素的onClick事件导致页面上的面板关闭。该类的onClick事件使页面滚动到页面下方的元素。

问题在于两者似乎同时触发,导致页面滚动到目标元素之外。这是一个代码示例:

$(document).ready(function() {
  $('.proceed').on("click", function() {
    $('html, body').animate({
      scrollTop: $(this).closest('.item-section').next().offset().top
    }, 2000);
  })
});

function openPanel() {
  var rb1 = $("#radioButton1").is(':checked');
  alert("Clicked");
  $('#containerBox1').toggle(rb1);
}
.item-section {
  height: 500px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="">
  <div class="item-section">
    <p>Choose a food</p>
    <input type="radio" id="radioButton1" name="food" value="pizza" onclick="openPanel()">Pizza<br>
    <div id="containerBox1" style="display: none;">
      <p>Choose a topping</p>
      <input type="radio" name="topping" value="pepperoni">Pepperoni<br>
      <input type="radio" name="topping" value="vegetarian">Vegetarian<br>
      <button class="proceed">Proceed to next section</button>
    </div>
    <input type="radio" name="food" value="burger" class="proceed">Burger<br>
    <input type="radio" name="food" value="fish" class="proceed">Fish
  </div>
  <div class="item-section">
    <p>Drink selection would be here</p>
  </div>
</form>

有人记住我的实际代码比提供的示例大得多,并且具有更多的类和按钮吗?

2 个答案:

答案 0 :(得分:0)

您可以尝试

  • .proceed点击处理程序提取到命名函数
  • .proceed点击处理程序中调用该命名函数
  • openPanel中,执行函数需要执行的所有操作,然后调用滚动处理程序,然后在事件上调用stopPropagation

换句话说,不允许两个单击处理程序为您的单选按钮触发,但要有一个单击处理程序来完成两个任务,然后停止传播。

答案 1 :(得分:0)

您不需要两个onclick事件。只需处理.proceed的那个,然后检查是否检查了rb1。

$(document).ready(function() {
    $('.proceed').on("click", function() {
        var rb1 = $("#radioButton1").is(':checked');
        if( rb1 ) {
            alert("Clicked");
            $('#containerBox1').toggle(rb1);
        }
        $('html, body').animate({
            scrollTop: $(this).closest('.item-section').next().offset().top
        }, 2000);
    })
});