如何检测页面滚动到jQuery中的某个点?

Jas*_*son 34 jquery

想象一下这是我的页面:

<p>hello</p>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<p class="myPara">My Paragraph</p>
Run Code Online (Sandbox Code Playgroud)

当用户向下滚动到具有"myPara"类的段落而不是之前,我如何提醒消息?

And*_*ker 50

怎么样:

var target = $(".myPara").offset().top;
var interval = setInterval(function() {
    if ($(window).scrollTop() >= target) {
        alert("made it!");
        clearInterval(interval);
    }
}, 250);
Run Code Online (Sandbox Code Playgroud)

这是一个例子:http://jsfiddle.net/andrewwhitaker/24M3n/1/

您可能想要将事件处理程序附加到窗口滚动事件,但John Resig建议不要使用它(向下滚动到"最佳实践").

更新:正如@AbdulJabbarWebBestow指出的那样,每250毫秒不必要地运行一个函数可能是一个坏主意.这是一个更新的示例,仅在用户第一次滚动后250ms运行一次:

var target = $(".mypara").offset().top,
    timeout = null;

$(window).scroll(function () {
    if (!timeout) {
        timeout = setTimeout(function () {
            console.log('scroll');            
            clearTimeout(timeout);
            timeout = null;
            if ($(window).scrollTop() >= target) {
                alert('made it');
            }
        }, 250);
    }
});
Run Code Online (Sandbox Code Playgroud)

示例: http ://jsfiddle.net/24M3n/858/

  • @StefanoPochet**我不认为这是一个很好的答案**因为这个功能是在我们甚至不滚动时继续发射事件.你可以看看**console.log('Hello World');**就像这个setInterval(function(){console.log('Hello World');它是资源消耗任务. (3认同)
  • @StefanoPochet:实际上,这是使用`setInterval`的*完美时间.查看我在答案中链接的文章,了解为什么你不想直接附加到`.scroll`. (2认同)
  • @SteveMcLeod可能不是现在.也许这是6.5年前的事了?也许你发布一个现在更相关的答案对你有所帮助. (2认同)

Rei*_*gel 18

$(window).scroll(function(){
    console.log($('#myPara').offset().top < $(this).height() + $(this).scrollTop());
});
Run Code Online (Sandbox Code Playgroud)