首先,在 mozilla 中实现了一个原生属性,并且只有 mozilla scrollLeftMax(也是 scrollTopMax)。看这里:https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollLeftMax
这是我写的 polyfill,它将使该属性可用于 IE8+ 和 所有其他浏览器。只需将其添加到您的 js 文件或代码的顶部即可。
这里是 polyfill 代码:
(function(elmProto){
if ('scrollTopMax' in elmProto) {
return;
}
Object.defineProperties(elmProto, {
'scrollTopMax': {
get: function scrollTopMax() {
return this.scrollHeight - this.clientHeight;
}
},
'scrollLeftMax': {
get: function scrollLeftMax() {
return this.scrollWidth - this.clientWidth;
}
}
});
}
)(Element.prototype);
使用示例:
var el = document.getElementById('el1');
var max = el.scrollLeftMax;
这里的支持取决于defineProperties() 支持。这是 IE8+(对于 IE8,该方法仅支持 DOM 元素,我们的 polyfill 使用和方法就是这种情况)。
在此处查看支持的浏览器的完整列表:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#compatNote_1
基本上就够了。
如果没有,您可以直接添加单独的功能。并且您将获得对 IE6+ 和所有其他浏览器 的支持。 (现在将取决于运营商的支持。恰好是 IE6+)
这是一个示例,我选择在名称末尾添加一个“i”。 scrollLeftMaxi() 和 scrollTopMaxi()
(function (elmProto) {
elmProto.scrollTopMaxi = function () {
return this.scrollTop - this.clientHeight;
};
elmProto.scrollLeftMaxi = function () {
return this.scrollLeft - this.clientWidth;
};
})(Element.prototype);
使用示例:
var element = document.getElementById('el');
var leftMax = element.scrollLeftMaxi();
var topMax = element.scrollTopMaxi();
console.log(leftMax);
console.log(topMax);
上面的代码创建元素原型的属性并分配我们定义的函数。当调用scrollLeftMaxi()。遍历原型链,直到到达Element.prototype。它会在哪里找到财产。知道遵循原型链。以及如何检查属性。如果在链中的不同位置有两个同名的属性。意外的行为是意料之中的。这就是为什么新名称scrollLeftMaxi 比较合适的原因。 (如果我保持与原生 Mozilla 相同,则原生不会被覆盖,并且它们在链中的两个不同位置,并且原生优先。并且原生不是函数类型。一个属性它后面有一个getter,就像我们对上面的polyfill所做的那样,如果我将它作为一个函数调用。会触发一个错误,说它不是一个函数。所以如果不更改名称,我们将在mozilla中遇到这个问题。那是举个例子)。
如果您愿意,请看这里 getter 的工作原理:
https://www.hongkiat.com/blog/getters-setters-javascript/
这是一个 fiddle 测试,它表明我们得到了与 mozilla 中的 native 属性相同的结果(确保在 mozilla 中进行测试)
(function(elmProto) {
elmProto.scrollTopMaxi = function() {
return this.scrollHeight - this.clientHeight;
};
elmProto.scrollLeftMaxi = function() {
return this.scrollWidth - this.clientWidth;
};
})(Element.prototype);
// here we will test
var container = document.getElementById('container');
// here a comparison between the native of mozilla and this one
console.log("scrollLeftMaxi = " + container.scrollLeftMaxi());
console.log("scrollLeftMax = " + container.scrollLeftMax);
#container {
height: 500px;
width: 700px;
overflow: auto;
border: solid 1px blue;
}
#inner {
height: 2000px;
width: 1500px;
background: #928ae6;
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<div id="container">
<div id="inner"></div>
</div>
</body>
</html>
如何将它与 jquery 一起使用:
var max = $('#element')[0].scrollLeftMax; // when using the polyfill
var max = $('#element')[0].scrollLeftMaxi(); // when using the other alternative more support IE6+