为什么以下JavaScript脚本会打开一个新窗口,但无法向下滚动页面? (请注意,我在Firefox 4的Web控制台中运行了此脚本。)
w=window.open("http://stackoverflow.com");w.scrollTo(0,150);
如何在新的浏览器窗口中打开页面并指示该窗口滚动到特定位置?
答案 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)
该脚本不起作用,因为它违反了跨域安全性。请参阅this和this。 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现在可以工作。