Javascript iPhone上滚动事件内部的SetInterval-为什么此代码不起作用?

Javascript iPhone上滚动事件内部的SetInterval-为什么此代码不起作用?,javascript,iphone,events,scroll,setinterval,Javascript,Iphone,Events,Scroll,Setinterval,请看一下我使用的Zepto代码顺便说一句 正如你所看到的,我有一个页脚元素,我正试图将它固定在iPhone屏幕的底部。我知道有一些库可以帮助我们像iscroll4一样轻松地实现这一点,但我试着看看是否可以让它变得更简单 事实证明,上面的代码不能正常工作。当我实际滚动页面时,出于某种原因,setInterval没有执行,而是在后台堆积起来,以便同时运行每个调用 最后,它没有完成我希望它做的事情,也就是在滚动过程中设置页脚的动画,而不仅仅是在滚动之后。有人知道如何以类似的方式实现这种效果吗 谢谢 当

请看一下我使用的Zepto代码顺便说一句

正如你所看到的,我有一个页脚元素,我正试图将它固定在iPhone屏幕的底部。我知道有一些库可以帮助我们像iscroll4一样轻松地实现这一点,但我试着看看是否可以让它变得更简单

事实证明,上面的代码不能正常工作。当我实际滚动页面时,出于某种原因,setInterval没有执行,而是在后台堆积起来,以便同时运行每个调用

最后,它没有完成我希望它做的事情,也就是在滚动过程中设置页脚的动画,而不仅仅是在滚动之后。有人知道如何以类似的方式实现这种效果吗

谢谢

当您将一个方法传递给setInterval或任何其他函数时,它将被错误的this值调用。JavaScript参考中详细解释了这个问题


在外部回调中,这将是您关心的DOM元素,但在setInterval回调中,这将是窗口。请记住,这是一个关键字,而不是一个变量,并且是高度上下文敏感的

通常的方法是在变量中获取该值,然后使用该变量而不是该变量:


类似的问题也适用于JavaScript中的所有回调,请始终确保您知道这是什么,并抓住它的值,并在它不是您想要的值时在该值上构建一个闭包。

True!事实上,我知道我遗漏了这一点,但忘了补充。问题是,如果事件修复了这一点,它不会像预期的那样工作。setInterval函数仍然保持不变,直到它停止滚动执行每个函数调用…我已将代码更改为不依赖于事件,一直执行setTimeOut,问题就在这里。也许这是软件的一个限制,没有办法绕过它,这会很糟糕吗?@Eber:这把小提琴做的是你所期待的吗?不是真的。。。事实证明,iOS在滚动时会阻止任何DOM修改,所以这确实是不可能的:@Eber:如果您用console.log替换append并打开Mobile Safari日志会怎么样?
var timer = false;

$(window).bind('touchstart touchmove scroll', function (e) {
    if (timer === false) {
        timer = setInterval(function () {
            $('footer').css('top', (this.pageYOffset + this.innerHeight - 40) + 'px');
            console.log('Adjusted...');
        }, 100);
    }
}).bind('touchend', function () {
    clearInterval(timer);
    timer = false;
    console.log('Cleaned it up...');
});
if(timer === false) {
    var self = this; // "_that" is also a common name for the variable.
    timer = setInterval(function () {
        $('footer').css('top', (self.pageYOffset + self.innerHeight - 40) + 'px');
        console.log('Adjusted...');
    }, 100);
}