iOS Safari/Chrome 不会向上滚动以在无线电输入上显示验证错误消息

2024-01-11

我正在为需要移动设备友好的客户设置一份调查问卷。

当表单提交/验证并且问题未得到回答时,它会滚动到第一个无效字段 - 无论是文本输入还是无线电输入。这仅适用于桌面浏览器和 Android。

在 iOS Safari/Chrome 上,文本输入按应有的方式工作,就像在桌面浏览器和 Android 上一样。

但对于无线电输入,它会重点关注尚未回答的问题并显示验证错误消息,但如果焦点问题不在当前显示中,则不会向上滚动到焦点问题。

这个问题已被问到 https://stackoverflow.com/questions/52060637,但从未得到答复。 有解决方法吗?

        <form name="myForm" id="myForm"method="post">  
            <div class="form-row" id="info">
                <div class="col-md-3 mb-3">
                    <label for="name">Name</label>
                    <input type="text" class="form-control" id="name" placeholder="Name" value="Tony Stark" required>
                </div> <!-- NAME -->
                <div class="col-md-3 mb-3">
                    <label for="company">Company</label>
                    <input type="text" class="form-control" id="company" placeholder="Company" value="Stark Industries">
                </div> <!-- COMPANY -->
                <div class="col-md-3 mb-3">
                    <label for="address">Address</label>
                    <input type="text" class="form-control" id="address" placeholder="Address" value="10880 Malibu Point" required>
                </div> <!-- ADDRESS -->
                <div class="col-md-3 mb-3">
                    <label for="address2">Apt / Suite / Other (Optional)</label>
                    <input type="text" class="form-control" id="address2" placeholder="Apt / Suite / Other">
                </div> <!-- ADDRESS2 -->
            </div>

            <div class="form-row" id="citystzip">
                <div class="col-md-6 mb-3">
                    <label for="city">City</label>
                    <input type="text" class="form-control" id="city" placeholder="City" value="Malibu" required>
                </div> <!-- CITY -->

                <div class="col-md-3 mb-3">
                    <label for="state">State</label>
                    <select class="form-control" id="state" placeholder="State" value="CA" required>
                        <option value="AL">AL</option>
                        <option value="AK">AK</option>
                        <option value="AZ">AZ</option>
                        <option value="AR">AR</option>
                        <option value="CA">CA</option>
                        <option value="CO">CO</option>
                        <option value="CT">CT</option>
                        <option value="DE">DE</option>
                        <option value="DC">DC</option>
                        <option value="FL">FL</option>
                        <option value="GA">GA</option>
                        <option value="HI">HI</option>
                        <option value="ID">ID</option>
                        <option value="IL">IL</option>
                        <option value="IN">IN</option>
                        <option value="IA">IA</option>
                        <option value="KS">KS</option>
                        <option value="KY">KY</option>
                        <option value="LA">LA</option>
                        <option value="ME">ME</option>
                        <option value="MD">MD</option>
                        <option value="MA">MA</option>
                        <option value="MI">MI</option>
                        <option value="MN">MN</option>
                        <option value="MS">MS</option>
                        <option value="MO">MO</option>
                        <option value="MT">MT</option>
                        <option value="NE">NE</option>
                        <option value="NV">NV</option>
                        <option value="NH">NH</option>
                        <option value="NJ">NJ</option>
                        <option value="NM">NM</option>
                        <option value="NY">NY</option>
                        <option value="NC">NC</option>
                        <option value="ND">ND</option>
                        <option value="OH">OH</option>
                        <option value="OK">OK</option>
                        <option value="OR">OR</option>
                        <option value="PA">PA</option>
                        <option value="RI">RI</option>
                        <option value="SC">SC</option>
                        <option value="SD">SD</option>
                        <option value="TN">TN</option>
                        <option value="TX">TX</option>
                        <option value="UT">UT</option>
                        <option value="VT">VT</option>
                        <option value="VA">VA</option>
                        <option value="WA">WA</option>
                        <option value="WV">WV</option>
                        <option value="WI">WI</option>
                        <option value="WY">WY</option>
                    </select>
                </div> <!-- STATE -->
                <div class="col-md-3 mb-3">
                    <label for="zip">Zip</label>
                    <input type="text" class="form-control" id="zip" placeholder="Zip" value="90265" required>
                </div> <!-- ZIP -->
            </div>

            <div class="form-row" id="contact">
                <div class="col-md-7 mb-3">
                    <label for="email">Email</label>
                    <input type="email" class="form-control" id="email" placeholder="Email" value="[email protected] /cdn-cgi/l/email-protection" required>
                </div> <!-- EMAIL -->

                <div class="col-md-5 mb-3">
                    <label for="phone">Phone Number</label>
                    <input type="tel" class="form-control" id="phone" placeholder="Phone Number" value="678-136-7092" required>
                </div> <!-- PHONE -->
            </div>


        <h1>Please answer all survey questions and click submit at the bottom to submit <br>your updated information and survey answers.</h1>
            <legend>1. Question 1</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation1" name="question1" value="1a" required>
                <label class="custom-control-label" for="customControlValidation1">1a</label>
            </div>
            <div class="custom-control custom-radio mb-3">
                <input type="radio" class="custom-control-input" id="customControlValidation2" name="question1" value="1b" required>
                <label class="custom-control-label" for="customControlValidation2">1b</label>
            </div>

            <legend>2. Question 2</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation3" name="question2"  value="2a" required>
                <label class="custom-control-label" for="customControlValidation3">2a</label>
            </div>
            <div class="custom-control custom-radio mb-3">
                <input type="radio" class="custom-control-input" id="customControlValidation4" name="question2" value="2b" required>
                <label class="custom-control-label" for="customControlValidation4">2b</label>
            </div>

            <legend>3. Question 3</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation5" name="question3" value="3a" required>
                <label class="custom-control-label" for="customControlValidation5">3a</label>
            </div>
            <div class="custom-control custom-radio mb-3">
                <input type="radio" class="custom-control-input" id="customControlValidation6" name="question3" value="3b" required>
                <label class="custom-control-label" for="customControlValidation6">3b</label>
            </div>

            <legend>4. Question 4</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation7" name="question4" value="4a" required>
                <label class="custom-control-label" for="customControlValidation7">4a</label>
            </div>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation8" name="question4" value="4b" required>
                <label class="custom-control-label" for="customControlValidation8">4b</label>
            </div>


            <legend>5. Question 5</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation9" name="question5" value="5a" required>
                <label class="custom-control-label" for="customControlValidation9">5a</label>
            </div>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation10" name="question5" value="5b" required>
                <label class="custom-control-label" for="customControlValidation10">5b</label>
            </div>

            <legend>6. Question 6</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation11" name="question6" value="6a" required>
                <label class="custom-control-label" for="customControlValidation11">6a</label>
            </div>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation12" name="question6" value="6b" required>
                <label class="custom-control-label" for="customControlValidation12">6b</label>
            </div>

            <legend>7. Question 7</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation13" name="question7" value="7a" required>
                <label class="custom-control-label" for="customControlValidation13">7a</label>
            </div>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation14" name="question7" value="7b" required>
                <label class="custom-control-label" for="customControlValidation14">7b</label>
            </div>

            <legend>8. Question 8</legend>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation15" name="question8" value="8a" required>
                <label class="custom-control-label" for="customControlValidation15">8a</label>
            </div>
            <div class="custom-control custom-radio">
                <input type="radio" class="custom-control-input" id="customControlValidation16" name="question8" value="8b" required>
                <label class="custom-control-label" for="customControlValidation16">8b</label>
            </div>

由于OP仍在寻找解决方法,并且我也在积极寻找解决方案,因此这是我当前的解决方法:

首先,我测试是否使用 iPhone/iPad(请检查下面的注释),然后将 EventListeners 附加到监视焦点事件的单选和复选框输入。由于焦点已正确设置在第一个无效输入上,因此唯一要做的就是将该输入滚动到可见区域。

if (/^iPad|iPhone$/.test(navigator.platform)) {
    var inputs = form.querySelectorAll('input[type="radio"], input[type="checkbox"]');
    inputs.forEach(i => {
        i.addEventListener('focus', function (e) {
            e.target.scrollIntoView({
                block: 'center',
                behavior: "smooth"
            });
        })
    })
}

Note:从 iPadOS 开始(/^iPad|iPhone$/.test(navigator.platform))似乎不再起作用了。在网络上区分 iPadOS 和 macOS https://stackoverflow.com/questions/56578799/tell-ipados-from-macos-on-the-web列出了此问题的解决方案,但由于我目前没有能够运行 iPadOS 的 iPad,所以我还无法测试它们。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS Safari/Chrome 不会向上滚动以在无线电输入上显示验证错误消息 的相关文章

  • Facebook 登录 - 如果存在用户帐户(并且未安装应用程序)登录失败

    我刚刚在测试我的应用程序时发现了这个问题 它真的开始让我烦恼 那么环境是这样的 没有安装 Facebook 应用程序 用户登录 iOS 系统帐户 在设置 gt Facebook 下 当我的应用程序第一次尝试对用户进行身份验证时 它会提供这面
  • 获取 NSLayoutConstraints 关联视图

    我试图循环遍历视图约束 我向 view1 添加了 顶部 尾部 前导和高度约束 top trailing 和leading 是主ViewControllers 视图 如果我循环查看 view1 的约束 我只会看到高度约束 for constr
  • OCUnit 无法识别导入的文件

    我正在我的 iPhone 应用程序上使用 XCode 3 2 3 和 iOS 4 0 上的 OCUnit 进行单元测试 我已成功设置测试环境以适当地通过和失败基本测试 但是当我导入自己的文件 在本例中为 UserAccount h 时 它无
  • AVAssetExportSession 前置摄像头方向错误

    我仅在前置摄像头中使用 AVAssetExportSession 导出的视频方向错误 我按照这个教程https stackoverflow com a 35368649 3764365 https stackoverflow com a 3
  • UIKeyboardFrameBeginUserInfoKey 和 UIKeyboardFrameEndUserInfoKey

    在管理键盘中文档 http developer apple com iphone library documentation StringsTextFonts Conceptual TextAndWebiPhoneOS KeyboardMa
  • 如何在没有 Apple 开发者帐户的设备上运行应用程序

    我找到了几个网站 其中提供了有关如何完成此操作的信息 但似乎没有一个网站适用于 Xcode 10 1 或 iOS 12 1 我尝试过的那些似乎都不起作用 我试过这个 创建一个空的 swift 项目 单视图应用程序 将签名团队设置为我的个人团
  • 如何重置(即取消缩放)UIScrollView?

    我有一个 UIScrollView 其中包含图像和分段控件 该控件允许用户在 ScrollView 内切换图像 如果我只是将图像交换到 UIImageView 内部 它将以放大状态显示新图像 如何将 UIScrollView 重置回未放大状
  • 从 iframe 关闭父弹出窗口

    在domain1 com 上 我有一个链接 可以打开domain2 com 的弹出窗口 弹出窗口中有一个 iframe 也托管在 domain2 com 上 在 iframe 中 我试图关闭弹出窗口 我似乎对如何做到这一点感到困惑 在 if
  • 如何在html中创建字体选择栏

    我想创建一个下拉菜单 在其中我们可以看到所有可用的字体 并且可以选择我们选择的任何字体 我还想创建一个字体颜色选择小部件 存在大量的字体样式 我想知道如何获取所有这些字体以及如何创建一个小部件 用户可以使用该小部件选择他选择的颜色 为了创建
  • 捕获 SwiftUI 中的错误

    我在某些视图中有一个按钮 它调用 ViewModel 中可能引发错误的函数 Button action do try self taskViewModel createInstance name self name catch Databa
  • 在 Chrome 上使用 html5 显示垂直视频

    我正在构建一个简单的page http jsfiddle net JVZGZ 使用 html5 视频标签显示从我的 iPhone 上传的视频 如果您使用 chrome 观看它 您可能会看到该视频是水平呈现的 尽管它不是水平呈现的 尝试下载它
  • 为什么 html 中的 AngularJS 错误没有显示在控制台中?

    Here s a fiddle http jsfiddle net 6y7odxmj 3 用于说明 当 ng click 指令 例如 调用未在控制器的 scope 或其父级 上定义的函数时 它会默默地失败 当我尝试调试网页时 这种行为令人抓
  • 如何在jsp中使用javascript动态创建下拉框?

    我正在尝试动态创建下拉框 就像当我单击添加按钮时它必须创建新的下拉框 下拉列表还包含动态值 例如需要当前年份并且必须显示最多五年 请建议我这样做 谢谢 这是我尝试过的代码 JavaScript 代码 function Add var nam
  • iOS 13:MPMediaPickerController - 内部错误/找不到请求的应用程序扩展

    看来一般MPMediaPicker在 ios13 ipad air 2 iphone SE 上不再工作 从那里复制的示例 1 1 没有显示媒体选择器https developer apple com documentation mediap
  • 验证动态添加的输入字段

    我用过this http docs jquery com Plugins Validation以下表单的 jquery 验证插件
  • 当用户输入/删除时,使文本字段中的提示消失/重新出现[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁知道我怎样才能在我的搜索栏中做出
  • GWT - 让 CellTable 单元格使用 HTML?

    我有一个 CellTable 我想将 HTML 代码放入单元格中 以下代码不起作用 空格已从输出中删除 TextColumn
  • IE9 中的 HTML5 视频两侧显示黑色边框

    我在我的网站中使用 HTML5 视频标签 该视频在所有浏览器中都能完美播放 但在 IE9 中它显示黑色边框 黑色扩展名 就像通常情况下 当播放器的大小大于视频的大小时 视频播放器会在其两侧显示一些黑色扩展 这是我们使用的解决方案 对于视频
  • 如何以编程方式伪造 UIButton 的触摸事件?

    我正在编写一些单元测试 并且由于这个特定应用程序的性质 重要的是我要达到尽可能高的水平UI链尽可能 因此 我想做的是以编程方式触发按钮按下 就好像用户按下了按钮一样GUI 是的 是的 我could只需致电IBAction选择器 但同样 这个
  • CoreGraphics 在 iPhone4 上比在 3G/3GS 上慢

    我有一个用 CoreGraphics 绘制的图表 该图表可以水平滚动 并且当我们滚动它时就会绘制它 问题是 在 3G 3GS 上 滚动的速度和性能良好 但在 iPhone 4 上却比预期慢 我认为这是与 iPhone 4 的高分辨率有关的问

随机推荐

  • 自定义表达式中的 Spotfire IF 语句 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 If Len case SPEC gt 0 case SPEC case type 当我尝试上面的公式时 我收到错误 gt 作为无
  • 符号查找错误(linux - c++)

    我正在研究多代理系统 例如Robocup soccerrSim2d在 Gnu linux 上 我的 distb 是 Ubuntu 11 10 内核 3 2 gcc 4 6 我安装了librcsc http sourceforge jp pr
  • Spring中依赖资源发生变化时重新加载类

    您知道 Eclipse 如何在更新 Tomcat 所依赖的资源文件 例如 spring 上下文文件 时自动重新加载在 Tomcat 中运行的类 这样您就不必重新启动 Tomcat 了 如何使类依赖于资源文件 以便 Eclipse 在资源文件
  • 比较 2 个 Dictionary 实例

    我想比较两个的内容Dictionary
  • 从github下载最新代码到Android Studio

    How to sync我当地的安卓工作室项目上有最新的代码github 我想下载所有最新的更改但我不希望我的本地更改被覆盖 如果存在冲突 它应该要求我解决这些特定文件 有办法实现这一点吗 我想下载所有最新的更改 但我不想要我的本地 更改被覆
  • `forSome { val `? 的示例

    Scala 语言规范指定的语法存在主义类型 https scala lang org files archive spec 2 13 03 types html existential types as Type InfixType Exi
  • Blazor 格式化数字的输入类型

    有人知道如何将数字类型格式化为 100 10 吗 目前 如果该值为 100 10 它将显示为 100 1 尝试了 bind value format with C2 0 0 我是 Blazor 的新手 所以如果有人能指出我正确的方向 我将不
  • 为什么这个流不返回任何元素?

    我尝试将以下代码编写为流 AbstractDevice myDevice null for AbstractDevice device session getWorkplace getDevices if device getPluginc
  • R Shiny:从模块内更改选项卡

    我有一个带有多个选项卡的闪亮应用程序 我希望选项卡内有操作按钮 允许用户切换选项卡 我找到了以下页面 https www titanwolf org Network q e6b187b8 6cad 4ece ad16 7ec73ed2f75
  • Selenium 挂起实例化 FirefoxDriver

    我尝试开始使用 selenium 今天下载了当前版本 并复制了他们的示例 该示例打开浏览器并执行谷歌搜索 然而 程序永远挂在第一行WebDriver driver new FirefoxDriver 我安装了 Firefox 13 Thre
  • NSXMLParser 泄漏

    我有以下泄漏的代码 Instruments 表示 泄漏的是 rssParser 对象 我 刷新 了 XML 提要 它运行了该块 然后泄漏了 file h interface TestAppDelegate NSObject
  • 使用 pandas 从宽到长的数据集

    有很多类似标题的问题 但我无法解决我的数据集遇到的问题 Dataset ID Country Type Region Gender IA01 Raw IA01 Class1 IA01 Class2 IA02 Raw IA02 Class1
  • 如何在 Flutter 中获取图像的 RGB 值?

    我正在为我的对象检测服务器创建一个移动客户端 我已经有一个完美工作的 python 客户端 它将图像作为输入 通过 HTTP 请求将其发送到服务器 并接收预测作为 json 响应 我正在尝试在 Dart 中实现同样的目标 而我对 Dart
  • BigQuery 最大分区数达到 2000 而不是 2500

    根据BigQuery 文档 https cloud google com bigquery quotas partitioned tables 分区表可以有2500个分区 每个分区表的最大分区数 2 500 Yet bq query des
  • golang插件如何验证包的版本?

    我正在尝试使用 golang 插件 但在调用时总是出现运行时错误plugin Open plugin Open plugin was built with a different version of package 我确信该插件是使用相同
  • 在 Rust 中的多个函数调用中保持变量处于活动状态

    我正在尝试在 Rust 中记忆递归 collat z 序列函数 但是我需要记忆值的哈希图来在单独的函数调用中保留其内容 有没有一种优雅的方法可以在 Rust 中做到这一点 或者我是否必须在 main 中声明 hashmap 并每次将其传递给
  • 如何在 Kotlin 上绕过 NetworkOnMainThreadException

    嗨 我从 kotlin 开始 现在 Android Studio 3 0 支持它 但我不知道如何在另一个线程中执行简单的网络请求 在java中很容易 new Thread new Runnable Override public void
  • Numpy 安装工具链损坏:无法链接简单的 C 程序

    System Windows 10 Python 3 7 Numpy 1 15 1 VS 2017 我不认为这是重复的 因为以下拟议的决议已失败 对于自制软件 不适用 Numpy 安装运行时错误 工具链损坏 无法链接简单的 C 程序 htt
  • JavaScript setTimeOut 似乎没有像我预期的那样工作

    这是一个简单的 JavaScript 文件 我在 Chrome localhost 下运行 所发生的情况是 DIV 背景颜色没有设置为绿色 然后设置为红色 而是直接设置为红色 第一个 setTimeout 似乎被忽略了
  • iOS Safari/Chrome 不会向上滚动以在无线电输入上显示验证错误消息

    我正在为需要移动设备友好的客户设置一份调查问卷 当表单提交 验证并且问题未得到回答时 它会滚动到第一个无效字段 无论是文本输入还是无线电输入 这仅适用于桌面浏览器和 Android 在 iOS Safari Chrome 上 文本输入按应有