【发布时间】:2018-10-29 15:12:55
【问题描述】:
我正在为 iOS 开发一个混合(web+native)应用程序。应用程序的 Web 部分是 WKWebView(位于 UINavigationController 上)中的 SPA。该网站有一个<select> 元素和一个onchange/onblur 处理程序。当用户点击<select> 元素时,会出现本机选择轮。然后,当用户点击本地选择器的 Done 按钮时,onchange 和 onblur 处理程序会立即被触发。这一切都按预期工作。
由于这是一个混合应用程序,有时应用程序会将视图控制器推送到 UINavigationController(在 Web 视图之上)。当该视图控制器被弹出并且焦点返回到 Web 视图时,一切似乎都像以前一样工作。
但是,<select> 元素现在只会在用户从元素上轻按 离开 时触发 onchange 和 onblur 事件。如果用户更新他们的选择并点击完成,选择器将关闭,但选择元素的值保持不变。只有在元素外部点击后,值才会更新,onchange/onblur 事件才会触发。
新的视图控制器何时被推送和弹出并不重要,即使它是在<select> 元素尚未创建之前。如果在 web 视图的生命周期中的任何时候它被新的视图控制器覆盖,这个 bug 将在 100% 的时间内发生,直到 web 视图被销毁。
示例代码(这里没什么特别的):
HTML:
<select id="mySelect">
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>
JS:
document.getElementById("mySelect").onchange = function() {
console.log("hello");
}
此问题仅在 iOS 11 和 12 中出现。它是 Mobile Safari 特有的错误吗?任何帮助将不胜感激。
【问题讨论】:
-
尝试使用
<select onchange="console.log('hello');"> -
不走运。 onchange 处理程序本身工作正常,只是 Safari 在点击其他内容之前不会触发它。即使没有 onchange 处理程序,错误仍然很明显,因为元素的值也不会改变。
-
这可能是一个错误,因为即使在 stackoverflow 中您也必须再次单击。至少在野生动物园
-
遇到同样的问题,但时断时续。知道为什么会发生这种情况或如何解决吗?我注意到即使是文本输入在按下完成后也不会失去焦点。
-
@Kevin_TA 遗憾的是,我还没有找到解决办法。我停止研究它,因为它是一个相对较低优先级的问题。如果我回到它并弄清楚它,我会发布一个答案。
标签: javascript html ios wkwebview