【问题标题】:Detect what value to use for scroll positions javascript检测用于滚动位置javascript的值
【发布时间】:2016-01-05 02:08:05
【问题描述】:

我在jsfiddle 上摆弄着,发现了一个潜在的问题。在小提琴中,如果站点嵌入在 iframe 中(它位于 jsfiddle 上),我有一个记录器设置来跟踪滚动的位置。但是,我需要能够使用 javascript 检测我使用的哪个值适合在所有浏览器的 iframe 中跟踪滚动位置。我使用了这些值:

window.scrollTop

document.documentElement.scrollTop

document.body.scrollTop

小提琴的js:

window.addEventListener("scroll",
  function() {
    console.log(
      "window:" + window.scrollTop + 
      "; documentElement:" + document.documentElement.scrollTop + 
      "; body:"+ document.body.scrollTop
    );
  }
);

小提琴的 CSS:

html{ height : 300% }

使用 Chrome,我得到类似于以下内容的日志:

window:undefined; documentElement:0 (always 0); body:[some number] (variable number-actual scroll)

注意:为了响应 charlieftl 的 cmets,我需要编写一个脚本来检测我列出的三个值中的哪一个适合跟踪滚动位置。

此外,脚本的目的是根据网站是否为 iframed(嵌入式)来获得适当的滚动位置。当它不是适当的值时是 window.scrollTop,但在 iframe 中它似乎是 document.body.scrollTop。另外,我需要知道什么时候适合使用 document.documentElement.scrollTop。

注意:欢迎使用 jQuery 解决方案,但首选原生 javascript。

【问题讨论】:

  • 完全不清楚 iframe 的目标是什么或问题是什么
  • @charlietfl 解释一下。我问我如何检测使用哪个值。有什么困惑?
  • @charlietfl 真的吗?是这样吗?那为什么窗口会返回undefined
  • @espascarello 我认为你不明白。当网站被 iframed/嵌入时,我试图获取 iframe 的滚动位置。我使用window,因为我不确定 iframe 是否会被视为窗口。
  • @charlietfl 我喜欢我女儿比你回答得更快的方式。你们那些声望很高的人应该停止评论并开始回答,否则你就会被打败

标签: javascript jquery iframe cross-browser


【解决方案1】:

因为我很好,所以我在几个浏览器上测试了这个小提琴(除了 Opera,因为我无法下载它)。

我发现您的脚本在 IE 和 Firefox 中记录了 document.documentElement.scrollTop 的值。在 Chrome 中,它会记录 body.scrollTop 的值。 IE、Chrome 和 Firefox 都记录 undefinedwindow.scrollTop 值。

因此,window.scrollTop 对于 iframed 内容是无用的。但只是为了避免在 Opera 中出现这种情况,我编写了以下代码:

window.scrollTo(0,20);
document.documentElement.scrollTo(0,20);
document.body.scrollTo(0,20);

/* ^^these scroll values are only temporary */

if(isset(window.scrollTop) && window.scrollTop=20)
  alert("use window as object");

if(isset(document.documentElement.scrollTop) && document.documentElement.scrollTop=20)
  alert("use documentElement as object");

if(isset(document.body.scrollTop) && document.body.scrollTop=20)
  alert("use documentElement as object");

window.scrollTo(0,0);
document.documentElement.scrollTo(0,0);
document.body.scrollTo(0,0);

/* ^^default the scroll value back to normal state */

注意:但是,我会警惕使用窗口,因为它可能实际上是在引用父窗口而不是 iframe - 请不要引用我的话。我对 iframe 不是很熟悉,我只是在玩你的小提琴

【讨论】:

  • 我喜欢只有 28 点代表的 Kaye 能够在评论者 @charlietfl 和 epascarello 超过 50,000 人之前在这里回答。干得好凯!
  • @espacarello 也适合你
猜你喜欢
  • 2013-09-26
  • 2012-12-07
  • 1970-01-01
  • 2010-12-05
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2014-03-25
相关资源
最近更新 更多