Javascript 如何节省对onscroll函数的jsdom调用
我正在努力实现的目标:Javascript 如何节省对onscroll函数的jsdom调用,javascript,jquery,Javascript,Jquery,我正在努力实现的目标: 如果用户从顶部(原点)滚动超过24px,请执行一次操作 如果用户在距顶部(原点)24px的范围内向后滚动,则将其反转一次 我有以下代码: $("#box").scroll(function(){ var ofs = $(".title").offset().top; if (ofs <= 24) // Do something else // Reverse that something }) $(“#框
- 如果用户从顶部(原点)滚动超过24px,请执行一次操作
- 如果用户在距顶部(原点)24px的范围内向后滚动,则将其反转一次
$("#box").scroll(function(){
var ofs = $(".title").offset().top;
if (ofs <= 24)
// Do something
else
// Reverse that something
})
$(“#框”)。滚动(函数(){
变量ofs=$(“.title”).offset().top;
如果(ofs您要做的是限制请求或称为“debounce”的操作。限制只允许在一段时间内对任何对象进行一定数量的调用,debounce只在操作停止后的某个时间调用函数
这是一个很好的解释链接:
有几个库可以为您执行此操作,如下划线和Lodash。您也可以使用自己的库,debounce的前提基本上如下所示:
var timer;
$('#box').scroll(function(){
//cancel and overwrite timer if it exists already
// set timer to execute doWork after x ms
})
function doWork(){
//do stuff
}
根据浏览器支持的不同,您还可以研究使用requestAnimationFrame
。大多数现代浏览器似乎都支持它,IE>=10您要做的是限制请求,或者使用一种称为“去盎司”的方法.节流只允许在一段时间内对任何对象进行一定数量的调用,而debounce只在操作停止后的某个时间调用该函数
这是一个很好的解释链接:
有几个库可以为您执行此操作,如下划线和Lodash。您也可以使用自己的库,debounce的前提基本上如下所示:
var timer;
$('#box').scroll(function(){
//cancel and overwrite timer if it exists already
// set timer to execute doWork after x ms
})
function doWork(){
//do stuff
}
根据浏览器支持的不同,您还可以研究如何使用requestAnimationFrame
。在大多数现代浏览器中,IE>=10在下面的代码中,每次用户滚动超过或低于25px阈值,这是if($box以上)中的条件之一
if语句将被调用
var $box = $('#box');
var $boxAboveBelow = true; // true above, false below
$box.on('scroll', function() { // Throttle this function if needed
var newAboveBelow = $box.scrollTop() < 25;
if (newAboveBelow !== $boxAboveBelow) {
$boxAboveBelow = newAboveBelow;
if ($boxAboveBelow) {
// If the user scrolls back within 24px of the top (origin), reverse that something once.
} else {
// If user has scrolled more than 24px from the top (origin), do something once.
}
}
})
var$box=$('#box');
var$boxOverLower=true;//上面为true,下面为false
$box.on('scroll',function(){//根据需要限制此函数
var newoverlower=$box.scrollTop()<25;
如果(newoverbelow!==$boxoverbelow){
$boxUpperLower=newUpperLower;
如果($如下){
//如果用户在距顶部(原点)24px的范围内向后滚动,则将其反转一次。
}否则{
//如果用户从顶部(原点)滚动超过24px,请执行一次操作。
}
}
})
如果需要只调用一次这些条件,可以设置布尔变量以记录是否调用过这些条件
var aboveCalled = false;
var belowCalled = false;
var $box = $('#box');
var $boxAboveBelow = true; // true above, false below
$box.on('scroll', function() { // Throttle this function if needed
var newAboveBelow = $box.scrollTop() < 25;
if (newAboveBelow !== $boxAboveBelow) {
$boxAboveBelow = newAboveBelow;
if ($boxAboveBelow) {
!aboveCalled && doScrollAboveStuff();
aboveCalled = true;
} else {
!belowCalled && doScrollBelowStuff();
belowCalled = true;
}
if (aboveCalled && belowCalled) {
$box.off('scroll'); // No need to keep listening, since both called
}
});
var-overcalled=false;
var belowCalled=false;
变量$box=$(“#box”);
var$boxOverLower=true;//上面为true,下面为false
$box.on('scroll',function(){//根据需要限制此函数
var newoverlower=$box.scrollTop()<25;
如果(newoverbelow!==$boxoverbelow){
$boxUpperLower=newUpperLower;
如果($如下){
!上称为&doscrollabovestuf();
上述=真实;
}否则{
!belowCalled&&doscorlbelowstuff();
belowCalled=true;
}
如果(上称和下称){
$box.off('scroll');//不需要继续侦听,因为两者都调用了
}
});
在下面的代码中,每当用户滚动超过或低于该25px阈值时,将调用if($boxoverlower)
if语句中的一个条件
var $box = $('#box');
var $boxAboveBelow = true; // true above, false below
$box.on('scroll', function() { // Throttle this function if needed
var newAboveBelow = $box.scrollTop() < 25;
if (newAboveBelow !== $boxAboveBelow) {
$boxAboveBelow = newAboveBelow;
if ($boxAboveBelow) {
// If the user scrolls back within 24px of the top (origin), reverse that something once.
} else {
// If user has scrolled more than 24px from the top (origin), do something once.
}
}
})
var$box=$('#box');
var$boxOverLower=true;//上面为true,下面为false
$box.on('scroll',function(){//根据需要限制此函数
var newoverlower=$box.scrollTop()<25;
如果(newoverbelow!==$boxoverbelow){
$boxUpperLower=newUpperLower;
如果($如下){
//如果用户在距顶部(原点)24px的范围内向后滚动,则将其反转一次。
}否则{
//如果用户从顶部(原点)滚动超过24px,请执行一次操作。
}
}
})
如果需要只调用一次这些条件,可以设置布尔变量以记录是否调用过这些条件
var aboveCalled = false;
var belowCalled = false;
var $box = $('#box');
var $boxAboveBelow = true; // true above, false below
$box.on('scroll', function() { // Throttle this function if needed
var newAboveBelow = $box.scrollTop() < 25;
if (newAboveBelow !== $boxAboveBelow) {
$boxAboveBelow = newAboveBelow;
if ($boxAboveBelow) {
!aboveCalled && doScrollAboveStuff();
aboveCalled = true;
} else {
!belowCalled && doScrollBelowStuff();
belowCalled = true;
}
if (aboveCalled && belowCalled) {
$box.off('scroll'); // No need to keep listening, since both called
}
});
var-overcalled=false;
var belowCalled=false;
变量$box=$(“#box”);
var$boxOverLower=true;//上面为true,下面为false
$box.on('scroll',function(){//根据需要限制此函数
var newoverlower=$box.scrollTop()<25;
如果(newoverbelow!==$boxoverbelow){
$boxUpperLower=newUpperLower;
如果($如下){
!上称为&doscrollabovestuf();
上述=真实;
}否则{
!belowCalled&&doscorlbelowstuff();
belowCalled=true;
}
如果(上称和下称){
$box.off('scroll');//不需要继续侦听,因为两者都调用了
}
});
因此,添加一个检查,查看代码是否已运行,如果是,则运行它,如果不是,则不运行它。debounce,如果正在运行的条件是最后一个运行的条件,则不要执行任何操作。下面是一个很好的答案,您可以将其用作对debounce
滚动函数的参考:您可以使用$(“选择器”)获取滚动位置.scrollTop()
,使用.offset()
将导致大量的减速,因为它必须重新绘制/重新计算页面以计算偏移量。因此,添加一个检查,查看代码是否已运行,如果是,则运行它,如果不是,则不要运行它。debounce,如果正在运行的条件是最后一个运行的条件,则不要执行任何操作。这里有一个很好的答案,您可以作为参考取消对debounce
的滚动功能:您可以使用$('selector').scrollTop()
,使用.offset()获得滚动位置
将导致大量的速度减慢,因为它必须重新绘制/重新计算页面以计算偏移量。感谢您的及时响应。这两种方法——我所采用的是节流法——都没有在这里优雅地解决这个问题。我发现自己希望可以使用——比如techn