阻止iframe在调用焦点时滚动父文档



我有一个iframe,它调用someElement.focus。当这种情况发生时,父级滚动显示iframe。如何阻止父对象滚动?实际上,我希望iframe本身滚动,以便在iframe中,正确的元素滚动到iframe自身的空间中,但父页面应该不受影响。

const lines = new Array(100).fill(0).map((e,i) => i).join('n')
const script = 'script';
const frameContent = `
<style>
pre { font-size: 60pt; }
</style>
<body>
<pre>${lines}</pre>
<input type="text" id="target">
</body>
<${script}>
document.querySelector('#target').focus();
</${script}>
`;

document.querySelector('pre').textContent = lines;
const iframe = document.querySelector('iframe');
iframe.src = URL.createObjectURL(new Blob([frameContent], {type: 'text/html'}));
<style>
pre { font-size: 60pt; }
}
</style>
<div>you should see this element</div>
<pre></pre>
<iframe></iframe>
<div>you should NOT be scrolled to see this element</div>

调用焦点会将输入区域移动到屏幕上,这对我来说是有道理的,但同时,任何随机的iframe都可以通过调用焦点使父页面按需跳转到它,这对我们来说是没有意义的。

是否可以防止iframe影响父级?

设置焦点时可以尝试传递选项:

document.querySelector('#target').focus({preventScroll: true});

preventScroll选项在HTMLElement.focus((.上的MDN文档中有描述

请注意,这可能只适用于同源iframe。

浏览器应用的限制可能会阻止preventScroll选项在跨来源/第三方iframe中得到遵守。

最新更新