使用 JavaScript 滚动 iframe?

IT技术 javascript iframe scroll
2021-02-08 10:21:23

我使用 JavaScript 动态加载 iframe。加载后,如何让它向下滚动特定数量的像素(即在 iframe 中的页面加载后,如何让 iframe 自行滚动到页面的指定区域?)

6个回答

您可以使用该onload事件来检测 iframe 何时完成加载,然后您可以在 iframe 的 contentWindow 上使用scrollTo函数,从左侧和顶部 (x, y) 滚动到定义的像素位置:

var myIframe = document.getElementById('iframe');
myIframe.onload = function () {
    myIframe.contentWindow.scrollTo(xcoord,ycoord);
}

您可以在此处查看工作示例

注意:如果两个页面都位于同一个域中,这将起作用。

那么如果页面不在同一个域中,这将不起作用吗?
2021-03-15 10:21:23
您可以通过在 iframe 上加倍来规避同源策略。您的主页将 iframe 嵌入您自己服务器上的填充页面。shim 页面反过来只是嵌入了外部页面的 iframe。母版页可以滚动填充页,因为它们位于同一来源。丑陋,但它的工作原理。
2021-03-23 10:21:23
检查你的小提琴,它似乎不起作用。iframe 的滚动条没有移动 :( screencast.com/t/MEvAiJA6yMCb
2021-03-27 10:21:23
@Chief17 - 没错,它会违反 Javascript 的相同域策略。
2021-04-02 10:21:23
如果您事先知道要在 iframe 中显示的内容的尺寸,则可以将 iframe 放在一个包含 div 中,在其上设置 overflow: hidden,然后将 iframe 相对定位在其中。类似的效果,没有javascript。
2021-04-09 10:21:23

受到纳尔逊评论的启发,我做了这个。

关于在源自外部域的文档上使用.ScrollTo() 的 javascript 同源策略的解决方法。

非常简单的解决方法是创建一个虚拟 HTML 页面,在其中托管外部网站,然后在加载后在该页面上调用 .ScrollTo(x,y)。然后你唯一需要做的就是有一个框架或 iframe 来打开这个网站。

还有很多其他方法可以做到这一点,这是迄今为止最简单的方法。

*注意高度必须大以容纳滚动条最大值。

--home.html

<html>
<head>
<title>Home</title>
</head>

<frameset rows="*,170">
<frame src=body.htm noresize=yes frameborder=0 marginheight=0 marginwidth=0 scrolling="no">
<frame src="weather.htm" noresize=yes frameborder=0 marginheight=0 marginwidth=0 scrolling="no">
</frameset>
</html>

--weather.html

<html>
<head>
<title>Weather</title>
</head>

<body onLoad="window.scrollTo(0,170)">

<iframe id="iframe" src="http://forecast.weather.gov/MapClick.php?CityName=Las+Vegas&state=NV&site=VEF&textField1=36.175&textField2=-115.136&e=0" height=1000 width=100% frameborder=0 marginheight=0 marginwidth=0 scrolling=no>
</iframe>

</body>
</html>
这个答案和上面的答案结合起来非常聪明。
2021-03-18 10:21:23
有没有可能用这个动态改变weather.htm的src?例如“www.google.com”或“www.yahoo.com”等?
2021-04-07 10:21:23

NelsonChris评论的启发,我找到了一种使用 adiv和 an解决同源策略的方法iframe

HTML:

<div id='div_iframe'><iframe id='frame' src='...'></iframe></div>

CSS:

#div_iframe {
  border-style: inset;
  border-color: grey;
  overflow: scroll;
  height: 500px;
  width: 90%
}

#frame {
  width: 100%;
  height: 1000%;   /* 10x the div height to embrace the whole page */
}

现在假设我想通过滚动到该位置来跳过 iframe 页面的前 438 个(垂直)像素。

JS解决方案:

document.getElementById('div_iframe').scrollTop = 438

jQuery 解决方案:

$('#div_iframe').scrollTop(438)

CSS 解决方案:

#frame { margin-top: -438px }

(单独每个解决方案就足够了,CSS 的效果有点不同,因为您无法向上滚动以查看 iframe 页面的顶部。)

我无法让它发挥作用。它所做的只是滚动 div,而 div 内的 iframe 什么也不做。你能在 jsfiddle 中演示吗?你能解释一下 438 常数吗?
2021-03-22 10:21:23
我觉得 iframe 的任何东西都是 hacky,但为了演示一个想法,我使用这个答案来创建这个演示jsfiddle.net/1b5s489z 在按钮单击时加载 iframe,隐藏目标内容的标题(使用 css margin-top)并滚动到使用 js 解决方案在文档中设置一个点。
2021-03-27 10:21:23
@whiteshooz,确切地说,滚动停留在 div 中,其中包含整个 iframe 和页面。这样我就可以通过 div 而不是 iframe 滚动页面,而不会违反同源策略(仅适用于 iframe)。438 是我想要滚动的初始高度,在这个例子中(我将编辑我的答案,感谢您的评论)。
2021-04-08 10:21:23

使用scrollTop框架内容属性将内容的垂直滚动偏移设置为特定数量的像素(如 100):

<iframe src="foo.html" onload="this.contentWindow.document.documentElement.scrollTop=100"></iframe>
有什么横向的
2021-03-14 10:21:23
对于水平,使用 scrollLeft 而不是 scrollTop
2021-03-20 10:21:23
谢谢!我为 waaaay 工作了太多时间,试图让它发挥作用!
2021-03-20 10:21:23

一个 jQuery 解决方案:

$("#frame1").ready( function() {

  $("#frame1").contents().scrollTop( $("#frame1").contents().scrollTop() + 10 );

});