10

scrollIntoView我正在寻找一种方法来对我的用户浏览器的功能进行实时测试。这不是“ caniuse ”检查;而是我想要优雅的退化。我正在使用 jQuery,并且想使用一个preventDefault()如果 scrollIntoView 是功能性的。

我开始:

        if (window.scrollIntoView) {
            e.preventDefault();
            $('p#result').text('scrollIntoView is available');
        } else {
            $('#result').text('scrollIntoView is not available');
        }

但我看到那window.scrollIntoViewundefined在检查员身上。但是,因为scrollIntoView有效(在我的 Chrome 和 FireFox 版本中),它不应该是未定义的。我还有哪些其他选项可以查看用户的浏览器是否支持该功能?

4

5 回答 5

26

检查 scrollIntoView 是否仅支持布尔值 true / false 或者还支持平滑滚动的行为也可能很方便。

var isSmoothScrollSupported = 'scrollBehavior' in document.documentElement.style;
if(isSmoothScrollSupported) {
    element.scrollIntoView({behavior: "smooth", block: "end", inline: "nearest"});    
} else {
    element.scrollIntoView(false);
}
于 2018-06-27T19:34:59.437 回答
10

我发现至少对于 WaterFox 浏览器(可能还有更多),scrollBehavior 确实存在于 document.documentElement.style 中,正如Stefan van de Vooren所建议的那样,但浏览器会抛出以下错误:

TypeError: 'block' member of ScrollIntoViewOptions 'center' is not a valid 
value for enumeration ScrollLogicalPosition.

一个简单的 try-catch 语句为我们解决了这个问题:

try {
   element.scrollIntoView({
     behavior: "smooth",
     block: "center"
   });
} catch (error) {
   //fallback to prevent browser crashing
   element.scrollIntoView(false);
}
于 2018-09-18T20:09:22.847 回答
7

方法适用于元素,因此您可以检查document.documentElement.scrollIntoView.

于 2017-10-24T20:42:42.500 回答
0

我无法通过单元测试轻松验证这些检查,而不必实现奇怪的覆盖机制,将单元测试端暴露于它不应该真正知道的逻辑。

根据@DrewJex 的回答,我最终完全根据浏览器的行为编写了一些东西,这也更容易测试。

const scrollIntoView = (element, params = true) => {
  try {
    element.scrollIntoView(params);
    return true;
  } catch (e) {
    return false;
  }
};

const scrollTo = (element, params = {}) => {
  try {
    window.scrollTo({ ...params, top: element.offsetTop });
    return true;
  } catch (e) {
    return false;
  }
};

export const scrollToElement = (element) =>
  scrollIntoView(element, { behavior: 'smooth' }) ||
  scrollIntoView(element) ||
  scrollTo(element, { behavior: 'smooth' }) ||
  scrollTo(element);
于 2021-12-20T10:58:18.547 回答
0

你可以像这样检查它:


if (typeof document.body.scrollIntoView === 'function') {
  // Do smth.
  yourNode.scrollIntoView();
}
于 2019-11-18T13:42:20.253 回答