tes*_*ing 14 javascript infinite-scroll angularjs
我遇到以下代码的一些奇怪的行为.
function linkFunc(scope, element, attribute) {
var page = angular.element($window);
page.bind('scroll', function() {
var windowHeight = "innerHeight" in window ? window.innerHeight : document.documentElement.offsetHeight;
var body = document.body, html = document.documentElement;
var docHeight = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
var windowBottom = windowHeight + window.pageYOffset;
if (windowBottom >= docHeight) {
scope.$apply(attribute.myDirective);
}
});
}
Run Code Online (Sandbox Code Playgroud)
以上是一段代码,用于检测页面底部是否到达,如果到达它将调用任何绑定的函数 myDirective
主要问题是大多数时候延迟加载工作,并myDirective成功调用.但是有些时候延迟加载不起作用,我无法重现这个bug.
我尝试了不同的屏幕大小,不同的浏览器,但似乎这个bug只是随机发生的.
也许有人之前发生过这种情况,可以指出方向吗?
编辑:
更多信息
经过一些实验,我能够重现这个bug.
基本上,当在浏览器中的百分比缩放< 100 %,window.pageY返回一个十进制值,该值是不准确的略微引起windowBottom由处于关闭状态0.1,以0.9
例如.
console.log(windowBottom); // 1646.7747712336175
console.log(docHeight); // 1647
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样?
编辑2:
上述行为也是非确定性的,但小数部分为真.
\n\n0.1 + 0.2 !== 0.3
\n这不仅在 JavaScript 中是一种奇怪的现象,在 JavaScript 中也是如此。it\xe2\x80\x99实际上是计算机科学中的一个普遍问题,它影响了许多语言。其输出为 0.30000000000000004。
\n这与机器精度问题有关。当 JavaScript 尝试执行上面的行时,它将这些值转换为其二进制等效值。\n这就是问题开始的地方。0.1 并不是真正的 0.1,而是它的二进制等价物,这是一个接近(但不相同)的值。本质上,一旦你写下这些值,它们就注定会失去精度。您可能只想要两个简单的小数,但正如 Chris Pine 所说,您得到的是二进制浮点算术。有点像想要将您的文本翻译成俄语,但却变成白俄罗斯语。相似,但不一样。
\n
你可以在这里阅读更多。如果不深入浏览器源代码,我猜你的问题源于此。
\n