【问题标题】:JavaScript window.scrollTo AlternativeJavaScript window.scrollTo 替代方案
【发布时间】:2016-02-22 18:18:39
【问题描述】:

我正在为特定网站编写特定的 javascript 插件。

在我的一种方法中,我想使用window.scrollTo,但不幸的是,网站所有者已经覆盖了该函数的本机功能(也是 window.scroll)。

所以我正在考虑两种可能的解决方案:

  1. 编写我自己的myScrollTo 实现
  2. 以某种方式检测本机函数是否被覆盖并调用本机函数。

如果您对此有任何想法,我将很高兴听到他们的声音:)

谢谢。

【问题讨论】:

  • 还有window.scroll,基本相同。它也被覆盖了吗?
  • @Prinzhorn 也被覆盖 :(

标签: javascript


【解决方案1】:

你可以创建一个 iframe 并使用它的窗口实例来获得scrollTo 的本机实现。以下代码应该可以工作

var iframe = document.createElement('iframe');
iframe.style.display = 'none';
document.body.appendChild(iframe);
window.altScrollTo = iframe.contentWindow.scrollTo;

现在你应该可以像下面这样使用它了

aScrollTo.call(window, 0, 600)

【讨论】:

    【解决方案2】:

    这不是完美的解决方案,但适合我当前的需求。

    首先,我将检查本机函数是否被这段有用的代码覆盖:

    function isFuncNative(f) {
           return !!f && (typeof f).toLowerCase() == 'function' 
           && (f === Function.prototype 
           || /^\s*function\s*(\b[a-z$_][a-z0-9$_]*\b)*\s*\((|([a-z$_][a-z0-9$_]*)(\s*,[a-z$_][a-z0-9$_]*)*)\)\s*{\s*\[native code\]\s*}\s*$/i.test(String(f)));
    }
    

    来源:https://stackoverflow.com/a/7536972/3009194

    然后我会尝试替代方案:window.scroll 因为window.scroll() and window.scrollTo() 之间没有区别

    最后,如果这个也被覆盖,我想我会使用document.body.scrollTop

    是的,我知道,body 有可能不是滚动元素。 不幸的是,document.scrollingElement 仍然是草稿,大多数浏览器都不支持。

    所以最终的代码将如下所示:

       function myScroll(left, top) {
           if (isFuncNative(window.scrollTo)) {
               window.scrollTo(left, top);
           } else if (isFuncNative(window.scroll)) {
               window.scroll(left, top);
           } else {
               document.body.scrollLeft = left;
               document.body.scrollTop = top;
           }
       }
    
       myScroll(0,150);
    

    【讨论】:

      猜你喜欢
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-14
      • 2017-04-05
      • 2014-02-10
      • 1970-01-01
      相关资源
      最近更新 更多