Html 当URL包含片段时,iframe会导致父元素在Google Chrome上向上滚动

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,所有

在Google Chrome(37.0.2062.122,OSX/Windows)上,带有包含片段的URL的iframe会导致父元素向上滚动

这只发生在Chrome中(在Safari和Firefox中测试)

这里有一把小提琴显示了这个问题:(你必须点击
Run
两次。)

如您所见,包含iframe的整个
已向上滚动。页眉是隐藏的,因为它现在位于窗口上方,并且页面底部有一个意外的空白

如何避免这种情况

Bounty提供了一个非js解决方案或一个更简单的html文档来重现这个问题


不仅是chrome,所有浏览器都会有同样的问题,似乎该站点有大量的js脚本,不知道它会如何影响你放置iframe的站点,解决它的最简单方法是从链接中删除\up\u 8360397。 第二种方法是在iframe中禁用javascript。但是如果你不能自动向下滚动到你想要的帖子,你就必须手动设置滚动位置。

这里显示了两个bug

  • 当加载带有片段的iFrame时,JSFiddle会松开部分头部。其他答案和我的“旧答案”部分对此进行了讨论。一个github问题已经被提出
  • chrome上的iFrame处理碎片的能力很差。它们会导致在父对象上滚动。(为了公平起见,这可能是理想的行为)
  • 铬框架问题 运行此操作时,窗口将滚动,以便窗口中的片段位于页面顶部:
    正如其他答案已经提到的,这里的问题是针对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会使其父文档