【发布时间】:2017-06-29 16:08:17
【问题描述】:
当我是reinventing the wheel for fun and profit 时,我发现了一个似乎只发生在 Android Chrome 中的有趣行为。
我在用户键入时格式化文本输入,这意味着设置输入值,丢失插入符号位置。没问题 - 只需跟踪插入符号的位置,并在您更改输入事件回调中的值(调整添加/删除的字符)后将其设置回来。
效果很好!除了 Android Chrome (Android 7, Chrome 58.0.3029.83) - 我设置了插入符号的位置,观察了我期望的插入符号的位置 - 然后在 keyup 事件上它被神奇地移动了 - after 输入事件但是 在按键事件之前。
跟踪插入符号位置
您可以在this (exceedingly simplified) fiddle 中亲自查看。我什至在屏幕上输出相关数据,这样您就不必连接调试器来查看它。
键入“abcd”并获得:
数字是 this.selectionStart 中的插入符号位置
D = keyDown,I = 输入,C = 位置更改为,U =向上键
D: 0 | I: 0 | C: 1 | U: 1
D: 1 | I: 1 | C: 2 | U: 2
D: 2 | I: 2 | C: 3 | U: 3
D: 3 | I: 3 | C: 5 | U: 4 //<- This 4 is the culprit
其他所有经过测试的浏览器(IE11、iOS Safari、桌面 Chrome)都会为您提供:
D: 0 | I: 1 | C: 1 | U: 1
D: 1 | I: 2 | C: 2 | U: 2
D: 2 | I: 3 | C: 3 | U: 3
D: 3 | I: 4 | C: 5 | U: 5
那里有我错过的活动吗? It's not in the docs 我可以找到,虽然我知道虚拟键盘有点笨拙。我很想知道发生这种情况的确切位置这样我就可以对其进行核对。
也试过了
beforeinput、compositionstart 和 compositionend 事件。唯一被触发的是compositionstart,在keydown 和input 事件之间。它显示了我当时希望看到的插入符号位置。
在 Android Chrome 中键入“abcd”然后按退格键可以:
D: 4 | I: 3 | C: 5 | U: 5
似乎表明在这种情况下移动插入符号的任何东西都没有这样做。
不寻找解决方法。解决方法是在 keyup 事件中再次设置插入符号。我想看看是否有人知道一个不太错误的答案。
【问题讨论】:
-
您确定您为 android chrome 显示的值是您实际看到的吗?你说你看到
D: 0 | I: 1 | C: 1 | U: 1但我看到D: 0 | I: 0 | C: 1 | U: 1 -
@Clonkex 非常确定。你用的是什么版本的android和chrome?第四排你得到了什么?
-
@Clonkex 哇,现在不太确定了。更新中...
-
编辑了我的答案并尝试了解决方法。希望这对您有用,但我认为必须有更好的方法来进行电话号码自动格式化。
标签: javascript android google-chrome events