在JavaScript中,如何在新的浏览器窗口中打开页面并滚动到特定位置?

时间:2011-05-18 19:20:27

标签: javascript browser scroll

为什么以下JavaScript脚本会打开一个新窗口,但无法向下滚动页面? (请注意,我在Firefox 4的Web控制台中运行了此脚本。)

w=window.open("http://stackoverflow.com");w.scrollTo(0,150);

如何在新的浏览器窗口中打开页面并指示该窗口滚动到特定位置?

6 个答案:

答案 0 :(得分:5)

我发现了一些有趣的东西......

我一直都知道你可以滚动到一个带名字的锚 - 事实上,这就是我们所教的方式。但我只是试图滚动到一个带有id的div并且它有效!

因此,例如,如果目标网页的div为id =“bobo”,那么链接http://www.example.com/index.php/home#bobo对我来说很有效。

也许这对我来说是一种不稳定的行为。如果可能的话,我觉得我之前会听到这个。但我所知道的是,我试图做同样的事情,无论出于何种原因,它都在起作用。

FWIW,我正在使用的链接是http://www.religionnews.com/index.php?/rnsblog#blog

答案 1 :(得分:2)

如果您拥有这两个域,则可以使用window.postMessage将滚动位置传达给另一个窗口。
在一个页面中,您可以创建postMessage,在另一个页面中添加一个事件侦听器。 / p>

如果您需要支持旧版浏览器,可以使用window.name在Windows之间传输一些数据。

如果您不拥有这两个域名,那么由于SOP,您运气不佳。 它是浏览器中的内置保护,可以避免跨域滥用。

答案 2 :(得分:1)

您正试图在窗口准备好之前滚动。请注意以下工作:

w=window.open("http://stackoverflow.com");
setTimeout(function() { w.scrollTo(0,150) }, 1000);

最好在w.onload或DOM ready函数中执行滚动,但我似乎无法使其工作。

答案 3 :(得分:1)

该脚本不起作用,因为它违反了跨域安全性。请参阅thisthis。 Chrome报告了类似的错误:

> w=window.open("http://stackoverflow.com");
DOMWindow
84Unsafe JavaScript attempt to access frame with URL http://stackoverflow.com/ from frame with URL chrome://newtab/. Domains, protocols and ports must match.
> w.scrollTo(0,150);
89Unsafe JavaScript attempt to access frame with URL http://stackoverflow.com/ from frame with URL chrome://newtab/. Domains, protocols and ports must match.
TypeError: Object [object DOMWindow] has no method 'scrollTo'

答案 4 :(得分:0)

最初回答 here,如果页面支持 iframe 嵌入,您可以打开一个嵌入页面的文档,然后滚动文档而不是嵌入的页面。问题是我们无法获得页面的高度,所以我们只是劫持滚动事件,使文档在接近底部时变得更高:

data:text/html,<html><body style="margin:0; padding:0;"><iframe id='i' src='http://forecast.weather.gov/MapClick.php?CityName=Las+Vegas&state=NV&site=VEF&textField1=36.175&textField2=-115.136&e=0' width=100% frameborder=0 margin=0 scrolling=no style="height: calc(100vh + 170px + 200px);"></iframe></body><script>window.scrollTo(0, 170);window.onscroll = function(e) {if((window.innerHeight + window.scrollY) >= document.body.offsetHeight - 200) {document.getElementById('i').style.height = window.innerHeight + window.scrollY + 200;}};</script></html>

答案 5 :(得分:-1)

Derek对于跨域安全性是否正确,阻止您这样做。所以一个答案是通过加载chrome来禁用域安全性: Chrome - 禁用网络安全 这个来自这个chrome实例,运行你的javascript。子窗口将继承加载开关,您的scrollTo现在可以工作。