在 Mobile Safari 下拉列表项选择框中使用“下一步”时,select/dropdown 的 onchange() JS 事件的奇怪行为

2023-12-27

这是一个很难说清楚的问题,而且我是移动网络开发的新手,所以请耐心听我说:

在我的网页上,我有 3 个嵌套下拉列表(区域、城镇、街道)。

嵌套如下,当其上方的下拉列表中的选择发生更改时,每个下拉列表的项目都会被修改。例如选择一个Area改变了Town and Street列出并选择一个Town改变了Street list.

我在下拉菜单的 onchange() javascript 事件中使用 XMLHTTPRequests 来获取并填充其他下拉菜单。这在 Android 和桌面浏览器上运行良好。

在移动 Safari 上,当触摸下拉菜单时,会显示一个列表,用户可以在其中选择项目。此外,选择框还具有“上一个/下一个/自动填充/完成”按钮,用于导航到其他表单元素。

因此,用户触摸第一个下拉列表,选择一个值并按“下一步”按钮。这会导致两个问题:

First,在此操作中,第一个下拉列表的 oncange() 事件未可靠触发!有时会火有时不火。

如果选择区域后,用户触摸网页上的其他位置或按“完成”按钮,则 onchange() 会正常触发,城镇和街道也会正常填充。

Second,按下“下一步”按钮时进入焦点的元素是下拉列表,其元素在获取后需要更改。当上一个下拉列表的 onchange() 确实被触发时,要么列表没有更新,要么选择框中的项目变成蓝色,并且所有项目都有一个勾号,表明它们都已被选中。

据我所知,如果我可以禁用选择框中的下一个/上一个按钮,或者以某种方式修复 onchange() 的触发方式,并且下一个焦点下拉列表项在焦点处于焦点时重新填充,则问题将得到解决。

这是代码(简化):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no" />

    <title></title>
</head>
<body onload="AppStart();">
    <form action="#">
    Area:
    <select id="ddlArea">
        <option value="">-- Select Area -- </option>
        <option value="1">Area 1</option>
        <option value="2">Area 2</option>
        <option value="3">Area 3</option>
        <option value="4">Area 4</option>
        <option value="5">Area 5</option>
    </select>
    <br />
    Town:
    <select id="ddlTown">
        <option value="">Please wait ...</option>
    </select>
    <br />
    Street:
    <select id="ddlStreet">
        <option value="">-- Select Area or Town -- </option>
    </select>
    <br />
    Unit:
    <select id="ddlUnit">
        <option value="">-- No Street Selected -- </option>
    </select>

    <script type="text/javascript">

        var ddlArea, ddlTown, ddlStreet, ddlUnit;
        function AppStart() {
            ddlArea = document.getElementById("ddlArea");
            ddlTown = document.getElementById("ddlTown");
            ddlStreet = document.getElementById("ddlStreet");
            ddlUnit = document.getElementById("ddlUnit");

            ddlArea.onchange = areaChanged;
            ddlTown.onchange = townChanged;
            ddlStreet.onchange = streetChanged;

            setTimeout(function() { updateTown(""); }, 250);
        }

        var areaId = "", townId = "", streetId = "", unitId = "";
        function areaChanged(e) {
            areaId = ddlArea.options[ddlArea.selectedIndex].value
            ddlClear(ddlTown, createOption("Please Wait...", ""));
            ddlClear(ddlStreet, createOption("Please Wait...", ""));
            ddlClear(ddlUnit, createOption("-- No Street Selected --", ""));
            setTimeout(function() { updateTown(areaId); }, 500);
            setTimeout(function() { updateStreet(areaId, ""); }, 700);
        }

        function townChanged(e) {
            townId = ddlTown.options[ddlTown.selectedIndex].value
            ddlClear(ddlStreet, createOption("Please Wait...", ""));
            ddlClear(ddlUnit, createOption("-- No Street Selected --", ""));
            setTimeout(function() { updateStreet(areaId, townId); }, 400);
        }

        function streetChanged(e) {
            streetId = ddlStreet.options[ddlStreet.selectedIndex].value
            ddlClear(ddlUnit, createOption("Please Wait...", ""));
            setTimeout(function() { updateUnit(streetId); }, 600);
        }

        function updateTown(areaID) {
            ddlClear(ddlTown, createOption("-- Select Town --", ""));
            var items = isNaN(parseInt(areaID)) ? 10 : parseInt(areaID);
            if (areaID == "") areaID = "ALL";
            for (var i = 0; i < items; i++) {
                ddlTown.appendChild(createOption("Town " + (i+1) + ", Area " + areaID, i));
            }
        }

        function updateStreet(areaID, townID) {
            ddlClear(ddlStreet, createOption("-- Select Street --", ""));
            var items1 = isNaN(parseInt(areaID)) ? 10 : parseInt(areaID);
            var items2 = isNaN(parseInt(townID)) ? 10 : parseInt(townID);
            var items = items1 + items2;
            if (areaID == "") areaID = "ALL";
            if (townID = "") townId = "ALL";
            for (var i = 0; i < items; i++) {
                ddlStreet.appendChild(createOption("Street " + (i + 1) + ", Area " + areaID + ", Town " + townID, i));
            }
        }

        function updateUnit(streetID) {
            ddlClear(ddlUnit, createOption("-- Select Unit --", ""));
            var items = isNaN(parseInt(streetID)) ? 10 : parseInt(streetID);
            if (streetID == "") streetID = "ALL";
            for (var i = 0; i < items; i++) {
                ddlUnit.appendChild(createOption("Unit " + (i + 1) + ", Street " + streetID, i));
            }
        }

        function ddlClear(Dropdown, option) {
            while (Dropdown.options.length > 0) {
                try { Dropdown.options[0] = null; } catch (e) { };
            }
            if (option != null) {
                Dropdown.appendChild(option);
            }
        }

        function createOption(text, value) {
            var oOption = document.createElement("OPTION");
            oOption.innerHTML = text;
            oOption.value = value;
            return oOption;
        }

    </script>

    </form>
</body>
</html>

Help. :/


我的网站上也遇到了同样的问题。我能够通过手动轮询来修复它selectedIndex选择控件上的属性。这样,当您“检查”列表中的项目时,它就会立即触发。这是我为此编写的 jQuery 插件:

$.fn.quickChange = function(handler) {
    return this.each(function() {
        var self = this;
        self.qcindex = self.selectedIndex;
        var interval;
        function handleChange() {
            if (self.selectedIndex != self.qcindex) {
                self.qcindex = self.selectedIndex;
                handler.apply(self);
            }
        }
        $(self).focus(function() {
            interval = setInterval(handleChange, 100);
        }).blur(function() { window.clearInterval(interval); })
        .change(handleChange); //also wire the change event in case the interval technique isn't supported (chrome on android)
    });
};

您可以像使用“change”事件一样使用它。例如:

$("#mySelect1").quickChange(function() { 
    var currVal = $(this).val();
    //populate mySelect2
});

Edit:当您点击选择新值时,Android 不会聚焦选择,但它也不会出现与 iPhone 相同的问题。因此,也通过连接旧的来修复它change event.

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

在 Mobile Safari 下拉列表项选择框中使用“下一步”时,select/dropdown 的 onchange() JS 事件的奇怪行为 的相关文章

  • 使用 Gmail 上下文小工具访问附件

    我想将电子邮件及其附件从 Gmail Google Apps 保存到另一个数据库以实现类似 CRM 的功能 然而 根据docs http code google com apis gmail gadgets contextual 提取器无法
  • 将 Json 数据返回给 Ajax 调用

    我在 MVC 中有一个方法 我将其发布到它 并且我需要返回一些数据以进行处理 这是我发布到的 MVC 方法 返回值是 json 数据 HttpPost public JsonResult GetCalculateAmortizationSc
  • setTimeout 用于加载下拉列表中的项目

    我在用setTimeout克服 中提到的缓慢处理脚本警告 禁用 Internet Explorer 中的长时间运行脚本消息 https stackoverflow com questions 4460263 disabling the lo
  • 我可以在滚动时固定表格的 tableHeaderView 位置吗?

    我有一个表视图 并在其 tableHeaderView 上附加了一个 UISegmentedControl 如何使 tableHeaderView 固定 以便即使在滚动表视图时也始终可以在同一位置查看 UISegmentedControl
  • Modal UIViewController 在 iPad 上总是全屏显示。为什么?

    我试图在 iPad 上创建一个简单的模式对话框 无论是小设置 UIModalPresentationFormSheet 还是大设置 UIModalPresentationPageSheet 但无论我做什么 它们都会全屏显示 带有标题栏 模态
  • 我可以用一个简单的函数制作一个迭代器吗? (没有生成器或 Symbol.iterator)

    我一直在尝试使用普通函数创建一个迭代器 而不使用生成器或使用Symbol iterator用于学术目的的协议 为此 我创建了一个函数 它返回一个带有next参数 但尝试将其作为iterable的论证for of循环会产生不需要的结果 这是到
  • 光标:IE 8 和 9 中的自动行为

    我想要的是为整个正文标记指定cursor pointer 这样页面的背景是可点击的 但我也希望页面的其余部分像以前一样工作 所以我尝试为div设置cursor auto 其中包含这一页 在 FF Chrome 和 safari 中 它工作得
  • 使用淘汰赛动态显示/隐藏元素

    我有一个表 有四列 即代码 名称 数量和价格 其中 我想动态更改数量列的内容 元素 通常 它应该显示其中显示数量的元素 当用户单击元素时 我想显示该元素 以便用户可以编辑数量 我正在尝试按照 示例2 来实现淘汰赛文档链接 http knoc
  • 获取输入图像类型选择的图片并加载到图像标签中

    所以 我有一个用于上传 img 文件的输入框 我想要做的是从该数据 或选定的源 中获取数据并将其路由到图像标签的 src 属性中 像这样的东西 http jsfiddle net QC2c4 http jsfiddle net QC2c4
  • UpdatePanel 启动脚本未执行

    我正在编写一个在 SharePoint 网站中使用的 ASP NET Web 部件 并尝试使用 UpdatePanel 来呈现查询结果 我想使用 JQuery 插件来修改从异步回发返回的表 但我无法让启动脚本在异步更新上执行 我发现这个帖子
  • Lightbox:如何翻译“Image x of x”文本?

    我使用 Lightbox 2 作为图像集 当我的网站的访问者单击该集中的缩略图时 它将显示 图像的放大版本 下面是 描述 取自 a 标题属性 其下方 文本 Image x of x 例如 Image 1 of 12 有谁知道在哪里翻译 更改
  • 在 Windows 上静默安装 Qt55 Enterprise

    编辑 在 Qt 支持的帮助下 我已经解决了如何自动化 Qt 企业安装程序的这两个部分 下面是脚本调用 我正在尝试在 Windows 8 1 和 Windows 10 上静默安装 Qt 5 5 1 Enterprise 使用 script 开
  • Firefox 上的 jquery 焦点未设置

    我想将焦点设置到我的文本区域 以下是我的代码 this textInput val show focus 但它不起作用 实际上 当我按下鼠标按钮时 它会出现 但是当我松开鼠标时 它会从文本区域中删除 因此 经过大量搜索后 我发现 setTi
  • iphone:使用 iOS 5 和 Xcode 4.2 提交应用程序? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个在
  • jQuery 模板插件:如何创建双向绑定?

    我开始使用 jQuery 模板插件 微软创建的 但现在我面临这个问题 模板用于绑定到对象数组的一堆表单 当我更改其中一个表单上的某些内容时 我希望更新绑定的对象 但我不知道如何自动执行该操作 这是一个简单的例子 现实生活中的模板和对象要复杂
  • Dojo“正在加载”消息

    我是 Dojo 新手 所以我需要一些帮助 我的一些链接需要一段时间 当用户单击时 页面开始加载需要几秒钟 我想添加一条 正在加载 消息 我可以用 旧时尚方式 来做 但我想学习新的 更简单 更智能的 Dojo 方式 具体如何工作现在并不重要
  • redux - 如何存储和更新键/值对

    我正在使用 redux 和 React js 我想存储简单的键 值对 但无法获得正确的减速器语法 在这种情况下 每个键 值对将保持与外部系统的连接 这是正确的做法吗 我刚开始使用 redux 所以这有点神秘 export default s
  • 从现在起测量时间间隔

    任何人都知道或可以提供一些与 timeIntervalSinceNow 方法相关的示例代码 我需要类似的东西 time2 当应用程序进入前台时 time1 当应用程序进入后台时 time3 时间差 这样我就可以使用这个数字 以秒为单位的首选
  • 使用 javascript 从亚马逊 URL 中抓取 ASIN

    假设我有一个像这样的亚马逊产品 URL http www amazon com Kindle Wireless Reading Display Generation dp B0015T963C ref amb link 86123711 2
  • 尽管 getBoundingClientRect() 是假的,但如何将事件坐标转换为 SVG 坐标?

    我正在尝试根据鼠标的位置在 SVG 元素上动态绘制内容 不幸的是 我很难将 mousemove 事件中的鼠标坐标转换为 SVG 元素的坐标空间 这是我一直在测试的一个有缺陷的函数 CylinderDemo prototype handleM

随机推荐

  • python:从自定义概率函数中随机采样[重复]

    这个问题在这里已经有答案了 我有一个带有概率密度函数的分段四次分布 p x c x a 2 if 0 x
  • ASP.NET MVC - 如何在强类型文本区域中设置默认值?

    我试图让 TextArea 具有默认值 这可以正常工作在TextBoxFor但不适用于TextAreaFor 我错过了一些非常明显的东西吗 您可以在创建模型时在控制器操作中指定 Description 属性的值 并将该模型传递给视图 pub
  • iSeries AS400 ODBC 连接的文件 DSN

    如何使用 iSeries ODBC 驱动程序创建文件 dsn 以连接到 AS400 系统 iSeries ODBC 驱动程序允许配置许多设置 在哪里可以找到可在文件 DSN 中设置的所有属性的列表 Driver iSeries Access
  • HTML 文本框无法输入内容

    我需要帮助 我页面中的表单如下所示 但是当我单击文本框时 光标不会出现并且无法输入
  • 使用“file.copy”通过网络复制文件比“system(mv ...)”慢得多

    当我通过公司网络访问文件时 R 变得非常缓慢 我遇到了一些问题 所以我回去做了一些测试 我惊讶地发现 Rfile copy 命令是much比使用等效文件复制慢system mv 这是一个已知问题还是我在这里做错了什么 这是我的测试 我有三个
  • Clang 构建非常慢并且中途挂起

    我正在开始编写自己的 clang 工具 这些是我到目前为止所遵循的步骤 查看 llvm 7 0 发行版 查看 clang 7 0 版本 建造 使用带有以下标志的 ninja 构建 clang 和 llvm 没有这些标志就一直挂在我身上 DL
  • 产量有限制的子组合

    我正在使用 python 3 我正在使用的函数如下 def sub combinations segment if len segment 1 yield segment else for j in sub combinations seg
  • 在 Swift 包管理器中添加对二进制目标的依赖项

    我想创建一个带有具有子依赖项的二进制目标的 Swift 包 由于二进制目标不支持开箱即用的子依赖项 因此我创建了一个包装器目标 该目标既依赖于二进制框架又依赖于所述的其他依赖项here https stackoverflow com a 6
  • 如何将 NSNumber 转换为 NSString

    所以我有一个NSArray myArray 与NSNumbers and NSStrings 我需要它们在另一个UIView所以我就这样 void tableView UITableView tableView didSelectRowAt
  • 将div类中的信息提取到json对象(或数据框)

    对于表中的每一行页面 我想单击 ID 例如 第 1 行的 ID 是 270516746 并将信息 每行没有相同的标题 提取 下载到某种形式的 python 对象中 最好是 json 对象 或数据框 json 可能更容易 我已经到了可以到达我
  • “CHOICE_MODE_MULTIPLE_MODAL”网格视图的最大可选数量

    我创建了一个 GridviewCHOICE MODE MULTIPLE MODAL在安卓中 一切都运转良好 但根据要求 我必须为可选项目设置限制 假设 gridview 的最大可选项目限制是 3 个项目 达到限制后 用户无法再选择并会显示一
  • 为 Windows CE 编译 Boost 1.47

    实际上有一些关于人们尝试为 Windows CE 构建 Boost 库的信息 但没有人报告成功 甚至没有给出这样做所需的步骤 对于两个最新版本 1 46 和 1 47 发行说明提到他们的测试编译器之一是 Visual C Windows M
  • 如何在Python中检查EOF? [复制]

    这个问题在这里已经有答案了 如何在 Python 中检查 EOF 我在代码中发现了一个错误 其中分隔符后的最后一个文本块未添加到返回列表中 或者也许有更好的方式来表达这个功能 这是我的代码 def get text blocks filen
  • JQuery 透视对话框覆盖

    有几个 JQuery 插件可以放置模式对话框并在对话框中显示 dom 元素 但我正在寻找一个对话框叠加层 它可以显示屏幕的某些部分 并且这些区域应该是可访问的 而其他元素应该被阻止 我已经整理了一个简单的插件来执行此操作 不确定您的要求范围
  • 在 matplotlib 中绘制 unix 时间戳

    我想用 python 的 matplotlib 模块制作一个通用值与时间图 我的时间是 unix 时间 但我希望它们以可读的格式显示在绘图的 x 轴上 我已阅读有关使用日期时间对象进行绘图的答案 但此方法似乎删除了小时 分钟 秒信息和全天的
  • Hibernate 和 JPA“mappedBy”与关系和级联的所有者

    背景 假设我们有双向OneToOne关系 有User and Address实体 User有很多Addresses CREATE SEQUENCE IF NOT EXISTS hibernate sequence CREATE TABLE
  • 使用 Jquery 插件提交表单时如何验证“.(点)”后的电子邮件

    我正在尝试验证一个表单 该表单的电子邮件地址的 prop 设置为 true 如下所示 myform validate rules field required true email true 我检查了 jquery 插件http jquer
  • 如何在 mxGraph 中使用曲线边缘样式

    mxGraph 的最新版本添加了曲线作为边缘样式 我预计这是一种边缘路由风格 但事实似乎并非如此 谁能给我展示一个带有弯曲边缘的图表的小例子吗 它实际上是边缘的形状样式 style graph getStylesheet getDefaul
  • 本地测试时如何轻松启用azure功能https

    我想在 Windows 上本地测试 Azure Function Http 触发器 我使用 azure function core tools 运行命令 例如func start port 5007 useHttps 然后我收到错误 自动证
  • 在 Mobile Safari 下拉列表项选择框中使用“下一步”时,select/dropdown 的 onchange() JS 事件的奇怪行为

    这是一个很难说清楚的问题 而且我是移动网络开发的新手 所以请耐心听我说 在我的网页上 我有 3 个嵌套下拉列表 区域 城镇 街道 嵌套如下 当其上方的下拉列表中的选择发生更改时 每个下拉列表的项目都会被修改 例如选择一个Area改变了Tow