页面底部的iframe:避免页面自动滚动

问题描述 投票:0回答:9

我在页面上从中间到底部有一个

iframe
。当我加载页面时,它滚动到底部。我尝试过
body onload window.scroll(0,0)
但效果很丑,因为它先向下滚动,然后立即向上滚动。

页面自动滚动到底部并带有

iframe
,是什么原因?

javascript iframe scroll
9个回答
34
投票

这只是一个随机的,但可能会做这样的事情:

<iframe style="display: none;" onload="this.style.display='block';" src="..."></iframe>

我们的想法是,如果远程页面上有一些您无法控制的焦点窃取脚本,浏览器将不会聚焦隐藏元素。并且您的 onload 很可能会在焦点更改脚本后触发。

或者,另一种可能更可靠的选择:

<iframe style="position: absolute; top: -9999em; visibility: hidden;" onload="this.style.position='static'; this.style.visibility='visible';" src="..."></iframe>

这里我们基本上是说隐藏框架并将其垂直移动到页面上的负偏移量。当它尝试将元素聚焦在框架内时,它应该向上滚动页面,然后加载后将 iframe 放回其预期位置。

当然,在不了解更多信息的情况下,很难确定哪些权衡是可以的,而且这两种选择的条件都有点激进,所以 YMMV。

我希望有帮助:)


2
投票

我想出了一个效果很好的“黑客”。如果您不希望网页滚动到除顶部之外的任何地方,请使用此选项:

// prevent scrollTo() from jumping to iframes
var originalScrollTo = window.scrollTo;

window.scrollTo = function scrollTo (x, y) {
  if (y === 0) {
    originalScrollTo.call(this, x, y);
  }
}

如果您想完全禁用自动滚动,只需将该函数重新定义为无操作即可:

window.scrollTo = function () {};

1
投票

这似乎运作良好:

<iframe src="http://iframe-source.com" onLoad="self.scrollTo(0,0)"></iframe>

0
投票

类似的方法,但使用类..我向 iFrame 的“iframe_display”父级 div 添加了一个类,其样式内部为visibility:hidden。在页面加载时,我使用 jQuery 删除该类

.iframe_display{visibility:hidden}

$(function(){
    $('#iframe_wrapper').removeClass('iframe_display');
});

这会将焦点从 iFrame 上移开,并在页面加载时停止向下滚动到 iFrame


0
投票

Leandro 提供并由 Spokey 编辑的

src="about:blank"
技巧对我有用,但我想分享我之前使用过的解决方法。

我发现的一个临时解决方案是将 iframe 嵌入到页面最上面的元素(导航、标题等)中,这样即使浏览器想要跳转到焦点,它也会“跳转”到顶部元素。这仍然会导致稍微可察觉的跳跃,这可能会让您烦恼。

为了确保 iframe 在您选择将其放置在页面顶部附近时保持隐藏状态,我应用了

style="visibility:hidden; height: 0px; width: 0px;"
的内联样式。我想你也可以使用
z-index
组合。


0
投票

这是我提出并在 Chrome 中测试的解决方案。

我们有一个由 div 元素包裹的 iframe。为了简单起见,我删除了与调整 iframe 大小相关的类名。这里重点是iframe加载完成后会调用onMyFrameLoad函数。

<div class="...">
    <iframe onload="onMyFrameLoad()" class="..." src="..."></iframe>
</div>

然后在你的js文件中,你需要这个;

function noscroll() {
  window.scrollTo(0, 0);
}
// add listener to disable scroll
window.addEventListener('scroll', noscroll);
function onMyFrameLoad() {
  setTimeout(function () {
    // Remove the scroll disabling listener (to enable scrolling again)
    window.removeEventListener('scroll', noscroll);
  }, 1000);
}

这样,所有的滚动事件都会失效,直到iframe加载完毕。 iframe 加载后,我们等待 1 秒以确保所有滚动事件(来自 iframe)均无效/消耗。 如果您的 iframe 源速度很慢,这不是解决问题的理想方法。那么你就必须通过增加 setTimeout 函数中的等待时间来等待更长的时间。

我从https://davidwells.io/snippets/disable-scrolling-with-javascript/

得到了最初的概念

0
投票

我尝试了不同的解决方案,但没有一个对我有效。最后我在文档的

<head>
中实现了以下脚本:

<script>
  document.addEventListener('DOMContentLoaded', function(){
    
    var iframe = document.getElementById("YourIframeId");
    
    iframe.style.position="fixed";
    iframe.style.visibility="hidden";
    
    iframe.onload = function() {
      iframe.style.position="initial";
      iframe.style.visibility="initial";
    };
  });
</script>

解析 DOM 后,我隐藏 iframe 并将其设置为

position:fixed
。这样它就会显示在页面顶部。为此不需要额外的 CSS。我不使用
display: none
,因为虽然它可以防止滚动,但当我将其设置回
display:block;
时,我的 iframe 内容在某些浏览器(Chrome)中无法正确加载。

在 iframe 加载的那一刻,它会触发滚动,甚至在您将滚动位置设置回顶部之前,因此您会看到页面向下滚动然后再向上滚动,因此这也不是一个好的解决方案。就我而言,我只是将其设置回其初始位置和可见性。

因此,使用此代码,当触发滚动到 iframe 时,iframe 在页面顶部不可见,之后它会立即返回到其原始位置,因此不会出现不需要的滚动。

请注意,这可能意味着当您向下滚动并刷新页面时,您将返回到顶部,而不是在当前滚动位置刷新。


0
投票

我们也有同样的问题。当 html 网页加载时,它在刷新或使用 Chrome、Opera、Firefox、IE 等加载期间停留在页面顶部,但几乎在加载/刷新结束时,滚动条被下拉到许多 iframe photobucket 画廊之一,网页的中间甚至更下方。我们尝试了 StackOverflow 中的大量代码来阻止它,强制滚动条停留在网页顶部。这是有问题的网站http://loveforlife.com.au。渴望找到补救措施。


-1
投票

简单。在

about:blank
中使用
src
就像

<iframe id="idName" name="idName" src="about:blank" style="display:none"></iframe>
© www.soinside.com 2019 - 2024. All rights reserved.