我在页面上从中间到底部有一个
iframe
。当我加载页面时,它滚动到底部。我尝试过 body onload window.scroll(0,0)
但效果很丑,因为它先向下滚动,然后立即向上滚动。
页面自动滚动到底部并带有
iframe
,是什么原因?
这只是一个随机的,但可能会做这样的事情:
<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。
我希望有帮助:)
我想出了一个效果很好的“黑客”。如果您不希望网页滚动到除顶部之外的任何地方,请使用此选项:
// 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 () {};
这似乎运作良好:
<iframe src="http://iframe-source.com" onLoad="self.scrollTo(0,0)"></iframe>
类似的方法,但使用类..我向 iFrame 的“iframe_display”父级 div 添加了一个类,其样式内部为visibility:hidden。在页面加载时,我使用 jQuery 删除该类
.iframe_display{visibility:hidden}
$(function(){
$('#iframe_wrapper').removeClass('iframe_display');
});
这会将焦点从 iFrame 上移开,并在页面加载时停止向下滚动到 iFrame
Leandro 提供并由 Spokey 编辑的
src="about:blank"
技巧对我有用,但我想分享我之前使用过的解决方法。
我发现的一个临时解决方案是将 iframe 嵌入到页面最上面的元素(导航、标题等)中,这样即使浏览器想要跳转到焦点,它也会“跳转”到顶部元素。这仍然会导致稍微可察觉的跳跃,这可能会让您烦恼。
为了确保 iframe 在您选择将其放置在页面顶部附近时保持隐藏状态,我应用了
style="visibility:hidden; height: 0px; width: 0px;"
的内联样式。我想你也可以使用 z-index
组合。
这是我提出并在 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/
得到了最初的概念我尝试了不同的解决方案,但没有一个对我有效。最后我在文档的
<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 在页面顶部不可见,之后它会立即返回到其原始位置,因此不会出现不需要的滚动。
请注意,这可能意味着当您向下滚动并刷新页面时,您将返回到顶部,而不是在当前滚动位置刷新。
我们也有同样的问题。当 html 网页加载时,它在刷新或使用 Chrome、Opera、Firefox、IE 等加载期间停留在页面顶部,但几乎在加载/刷新结束时,滚动条被下拉到许多 iframe photobucket 画廊之一,网页的中间甚至更下方。我们尝试了 StackOverflow 中的大量代码来阻止它,强制滚动条停留在网页顶部。这是有问题的网站http://loveforlife.com.au。渴望找到补救措施。
简单。在
about:blank
中使用 src
就像
<iframe id="idName" name="idName" src="about:blank" style="display:none"></iframe>