2

我想在 div 滚动到视口时启动一个函数。我的问题是,每次我继续滚动时都会再次触发/启动该功能。

HTML:

<div class="box"></div>

JS:

 $(document).ready(function() {

    function start() {
        alert("hello");
    }

    $(window).scroll(function() {
      if ( $(window).scrollTop() >= $('.box').offset().top - ($(window).height() / 2)) {
        $(".box").addClass("green");
        start();
      } else {
        $(".box").removeClass("green");
      }
    });
  });

总结一下:当 div 滚动到视口中时,应该启动函数“start”。但它不应该再次触发,在它被触发一次之后。

小提琴

4

4 回答 4

5

您可以设置一个标志,如:

var started = false;
function start() {
  if(!started) {
    alert("hello");
  }
  started = true;
}
于 2019-09-16T17:24:34.483 回答
1

  $(document).ready(function() {
  	
    var started = 0;
function start() {
  if(started==0) {
    alert("Alert only once");
  }
  started = 1;
}
  
    $(window).scroll(function() {
      if ( $(window).scrollTop() >= $('.box').offset().top - ($(window).height() / 2)) {
        $(".box").addClass("green");
        start();
      } else {
      	$(".box").removeClass("green");
      }
    });
  });
*{margin:0;}
.box { background: red; height: 200px; width: 100%; margin: 800px 0 800px 0; }
.green { background: green; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<br />

<center>
    
  <br />
  <h1>scroll down</h1>
  </center>

<div class="box"></div>

于 2019-09-19T05:21:57.027 回答
0

有很多方法可以解决这个问题。您可以只删除事件侦听器(因为您使用的是 jQuery,所以我将使用onandoff方法):

 $(window).on('scroll', function() {
  if ( $(window).scrollTop() >= $('.box').offset().top - ($(window).height() / 2)) {
    $(".box").addClass("green");
    start();
  } else {
    $(".box").removeClass("green");
  }
  $(window).off('scroll');
});
于 2019-09-16T17:18:38.447 回答
0

如果您希望在启动方法满足其要求后停止窗口滚动方法..您可以这样做

  $(document).ready(function() {

  var toggleScroll = false;

    function start() {
        alert("hello");
    }

    $(window).one("scroll", checkToggleScroll);

    function checkToggleScroll(){

        if ( $(window).scrollTop() >= $('.box').offset().top - ($(window).height() / 2)) {
          $(".box").addClass("green");
          toggleScroll = true;
          start();
        } else {
          $(".box").removeClass("green");
        }

        if(!toggleScroll){
          $(window).one("scroll", checkToggleScroll);
        }
    }

  });
于 2019-09-16T17:44:23.763 回答