Html 当URL包含片段时,iframe会导致父元素在Google Chrome上向上滚动
在Google Chrome(37.0.2062.122,OSX/Windows)上,带有包含片段的URL的iframe会导致父元素向上滚动 这只发生在Chrome中(在Safari和Firefox中测试) 这里有一把小提琴显示了这个问题:(你必须点击Html 当URL包含片段时,iframe会导致父元素在Google Chrome上向上滚动,html,google-chrome,iframe,jsfiddle,Html,Google Chrome,Iframe,Jsfiddle,在Google Chrome(37.0.2062.122,OSX/Windows)上,带有包含片段的URL的iframe会导致父元素向上滚动 这只发生在Chrome中(在Safari和Firefox中测试) 这里有一把小提琴显示了这个问题:(你必须点击Run两次。) 如您所见,包含iframe的整个已向上滚动。页眉是隐藏的,因为它现在位于窗口上方,并且页面底部有一个意外的空白 如何避免这种情况 Bounty提供了一个非js解决方案或一个更简单的html文档来重现这个问题 不仅是chrome,所有
Run
两次。)
如您所见,包含iframe的整个
已向上滚动。页眉是隐藏的,因为它现在位于窗口上方,并且页面底部有一个意外的空白
如何避免这种情况
Bounty提供了一个非js解决方案或一个更简单的html文档来重现这个问题
不仅是chrome,所有浏览器都会有同样的问题,似乎该站点有大量的js脚本,不知道它会如何影响你放置iframe的站点,解决它的最简单方法是从链接中删除\up\u 8360397。 第二种方法是在iframe中禁用javascript。但是如果你不能自动向下滚动到你想要的帖子,你就必须手动设置滚动位置。 这里显示了两个bug
正如其他答案已经提到的,这里的问题是针对JSFIDLE的。我可以通过简单地在StackOverflow代码段中包含相同的代码来轻松地向您展示这个问题:
iframe{
位置:绝对位置;
排名:0;
右:0;
底部:0;
左:0;
宽度:100%;
身高:100%;
}
问题在于没有将#包含在iframe url中,如果在示例中尝试使用下一个url,您将看到没有滚动:
因此,我查看了您显示的页面,看看是否有奇怪的地方:
如果您检查JS,它有如下内容:
var e = window,
g = document,
h = "documentElement",
k = "CriticalImages",
l = "scrollTop",
n = "prototype",
p = "body",
q = "getAttribute",
有一个叫做“scrollTop”的函数,我认为它是一个很好的研究对象
如果您进一步检查代码,您将看到JS在某一点上获得了offsetTop和offsetParent:
u = function(a, b) {
var c = b[q]("pagespeed_lazy_position");
if (c) return parseInt(c, 0);
var c = b.offsetTop,
d = b.offsetParent;
d && (c += u(a, d));
c = Math.max(c, 0);
b.setAttribute("pagespeed_lazy_position", c);
return c
},
结论:问题在于你试图在iframe中显示的页面,而不是fiddle、Chrome或url中的#
我希望这有帮助
编辑 在回顾了wiki示例之后,我发现有一些js(因此第一个答案是正确的) 要避免js出现这种情况,只需包括以下内容:
$( window.parent ).scroll(function(event) {
// debugger;
console.log('SCROLL',event);
var scrollTop=$(this).scrollTop();
if(scrollTop>0){
console.log('fix scroll');
$(this).scrollTop(0);
}
});
示例:我将尝试查看导致问题的js。复制脚本 找到了一种复制错误的最小方法:(单击“load iframe”后,您可以看到错误发生) 它还使用以下代码在JSFIDLE之外发生:
<!doctype html>
<html>
<head>
<style>
body, html {
padding: 0;
border: 0;
margin: 0;
height: 100%;
overflow: hidden;
}
#header {
height: 50px;
background: blue;
}
#content {
position: absolute;
top: 50px;
right: 0;
bottom: 0;
left: 0;
}
#overflow {
position: absolute;
height: 50px;
bottom: -50px;
}
</style>
<script>
function loadIframe() {
var ifr = document.createElement('iframe');
ifr.src = 'https://en.wikipedia.org/wiki/Stack_overflow#See_also';
var content = document.getElementById('content');
while (content.firstChild) {
content.removeChild(content.firstChild);
}
content.appendChild(ifr);
}
window.onload = function () {
document.getElementById('btn').onclick = loadIframe;
};
</script>
</head>
<body>
<div id=header>
<button id=btn>load iframe</button>
</div>
<div id=content>
</div>
<div id=overflow>
overflow
</div>
</body>
</html>
正文,html{
填充:0;
边界:0;
保证金:0;
身高:100%;
溢出:隐藏;
}
#标题{
高度:50px;
背景:蓝色;
}
#内容{
位置:绝对位置;
顶部:50px;
右:0;
底部:0;
左:0;
}
#溢出{
位置:绝对位置;
高度:50px;
底部:-50px;
}
函数loadIframe(){
var ifr=document.createElement('iframe');
ifr.src=https://en.wikipedia.org/wiki/Stack_overflow#See_also';
var content=document.getElementById('content');
while(content.firstChild){
content.removeChild(content.firstChild);
}
内容。附加子项(ifr);
}
window.onload=函数(){
document.getElementById('btn')。onclick=loadIframe;
};
加载iframe
溢流
你能发布一个显示问题的屏幕截图吗?对我来说,Chrome和Firefox都会将iframe滚动到ID为#up8360397的内容。抱歉,刚刚添加了一个。所以问题是,加载时它会从页面的一半开始?不完全是这样,当iframe加载并滚动到片段时,主体会向上推,并且由于其溢出被隐藏,它会消失在视口之外。将overflow设置为scroll以查看到底发生了什么除了JSFIDLE之外,您在其他任何地方都有这个问题吗?例如,在jsbin上似乎不会发生这种情况。所以我认为这可能只是JSFIDLE上的一个bug。到目前为止,我还没有在Chrome之外复制它。这就是为什么我仍然在寻找解决方法或等待Chrome中的修复。我还发现a)它只在Chrome中出现,b)只在iframe中运行javascript时出现。我必须同意这个答案,由于某种原因,iframe在jsFiddle中总是给我带来问题,有时在CodePen中也会出现问题。@Adjit我相信这是因为它们对iframe内容进行了一些与安全相关的处理,增加了一些限制并导致了各种错误。这就是我从github上读到的一些问题。对了,OP的问题JSFIDLE是特定于Chrome还是仅仅特定于Chrome?@Adjit他只提到了Chrome,但它似乎是特定于JSFIDLE+Chrome的。@arnaud576875你说得对,我更新了我的答案以更清楚。有两个bug,而不是一个。这不是一个JSFIDLE bug。iframe会使其父文档