Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何节省对onscroll函数的jsdom调用_Javascript_Jquery - Fatal编程技术网

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