gpt4 book ai didi

javascript - 在 iframe 中调用 element.focus() 将父页面滚动到 Safari iOS10 中的随机位置

转载 作者:行者123 更新时间:2023-12-03 13:01:29 25 4
gpt4 key购买 nike

iOS 10.1.1 上的 Safari 在将焦点设置在 iframe 内的元素上时似乎存在错误。

当我们调用 element.focus()在 iframe 内的元素上,Safari 将立即向下滚动父页面并将焦点元素移出屏幕(而不是将焦点元素滚动到 View 中)。

但是,只有当元素位于比设备屏幕高度高的 iframe 中时才会发生这种情况(较短的 iframe 也可以)。

因此,如果有两个元素,一个在 iframe 顶部,另一个在页面下方,第一个将很好地聚焦,但第二个将在我们设置焦点时跳出屏幕。

在我看来,Safari 是 尝试将元素滚动到 View 中,但数学是错误的,它们最终滚动到页面下方的随机位置。在 iOS9 中一切正常,所以我认为这是 iOS10 中的一个新错误。

是某种防止父页面滚动的方法还是某种避免此错误的其他方法?

我整理了一个单页要点,在 iOS 10 设备或模拟器上复制了该问题。

这是一个您可以在手机上实际使用的 URL: goo.gl/QYi7OE

这是一个 plunker,因此您可以检查桌面行为:https://embed.plnkr.co/d61KtGlzbVtVYdZ4AMqb/

还有那个 plunker 的要点版本:https://gist.github.com/Coridyn/86b0c335a3e5bf72e88589953566b358

这是 gist 的可运行版本(上面的缩短的 URL 指向此处):
https://rawgit.com/Coridyn/86b0c335a3e5bf72e88589953566b358/raw/62a792bfec69b2c8fb02b3e99ff712abda8efecf/ios-iframe-bug.html

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes" />

<script>
document.addEventListener('DOMContentLoaded', function(){
document.querySelector('#frame').srcdoc = document.querySelector('#frameContent').innerHTML;
});
</script>
</head>
<body>
<iframe id="frame" frameborder="1"
style="width: 100%; height: 1200px;"
width="100%" height="1200">
</iframe>

<!--
To keep this a one-page example, the content below will be inserted into the iframe using the `srcdoc` attribute.

The problem occurs in iOS10 regardless of using `srcdoc` or `src` (and regardless of same-domain or cross-domain content).
-->
<script id="frameContent" type="text/template">
<div>
<style>
.spacer {
padding-top: 400px;
padding-bottom: 400px;
}
.green-block {
width: 20px;
height: 20px;
background-color: green;
}
.red-block {
width: 20px;
height: 20px;
background-color: red;
}
</style>

<div class="green-block" tabindex="0"></div>

<p>Scroll down and press the 'Focus Green' or 'Focus Red' button.</p>

<h2>'Focus Green'</h2>
<p><b>Expected:</b> should set focus on '.green-block' and scroll to the top of the page.</p>
<p><b>Actual:</b> sets focus but does not scroll page.</p>

<h2>'Focus Red'</h2>
<p><b>Expected:</b> should set focus on '.red-block' and not scroll page (because element is already on-screen).</p>
<p><b>Actual:</b> sets focus and scrolls down to the bottom of the host page.</p>

<hr/>

<p class="spacer">1 Filler content to force some visible scrolling 1</p>

<div class="red-block" tabindex="0"></div>

<div>
<button type="button" onclick="document.querySelector('.green-block').focus();">Focus Green</button>
<p>'Focus Green' should go to top of page, but on iOS10 the view doesn't move.</p>
</div>
<div>
<button type="button" onclick="document.querySelector('.red-block').focus();">Focus Red</button>
<p>'Focus Red' should stay here, but on iOS10 the view scrolls to the bottom of the page</p>
</div>

<p class="spacer">20 Filler content to force some visible scrolling 20</p>
<p>Bottom of iframe</p>

</div>
</script>

</body>
</html>

我们发现的东西:
  • 该问题发生在 iOS 10+ 的 Safari 和 Chrome
  • 问题发生在 Safari iOS 9.3.2 上(行为与桌面浏览器一致,如预期的那样)
  • 该问题仅在关注 时发生非输入 HTML 元素,例如DIV、SPAN、 anchor 标签等;关注 INPUT元素工作正常
  • 桌面 Safari 工作正常
  • 滚动的是父页面,而不是 iframe(iframe 的大小为 100%,以避免在框架内滚动)
  • 我们尝试在父页面上调用 preventDefault :window.onscroll = (event) => event.preventDefault();但这不起作用,因为 the scroll event is not cancelable
  • scroll父页面上引发的事件似乎来自 Safari/Webkit 本身,因为调用堆栈中没有其他函数(使用 DevTools 和 Error.stack 检查时)
  • 最佳答案

    我在 iOS 上滚动跳跃时遇到了类似的问题。它发生在我的所有 iOS 版本上,8、9 和 10。

    在真正的 iOS 10 设备上测试你的 plunker 并没有给我带来问题。我不确定我是否正确测试。

    你能在 iOS 上试试这个版本的 plunker 吗? https://embed.plnkr.co/NuTgqW/

    我的问题的解决方法是确保 iframe 内容中的 body 和 html 标记具有定义的 100% 高度和宽度,以及溢出滚动。这能够强制 iframe 的尺寸。它阻止了滚动跳跃。

    让我知道它是否有帮助。

    关于javascript - 在 iframe 中调用 element.focus() 将父页面滚动到 Safari iOS10 中的随机位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40487279/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com