input点一下调自定义键盘,再点一下调系统键盘
isMask为true时表示“遮住”焦点。
1、获得焦点后主动blur(), 这样系统键盘就主动消失, 然后让自定义键盘显示,随后设isMask = false
2、每次都会执行到currentInput = target
3、再次点击的时候 currentInput === target, isMask === false, 所以只会走currentInput = target 和下面的滚动定位。 这样input就得到了焦点,就会调起系统键盘。
const focusFun = (e) => {
// currentInput默认为null, 第一次就会走这个分支
if (currentInput !== target) {
isMask = true;
}
if (isMask) {
document.activeElement.blur();
currentInput = target;
isShowCustomKeyboard = true;
isMask = false;
}
currentInput = target;
// 滚动到input, 不让键盘盖住
setTimeout(() => {
e.target.scrollIntoView({ block: 'center', inline: 'nearest' });
}, 300);
};
inputs[index].addEventListener('focusin', focusFun);
调起系统键盘后还要将自定义键盘关闭。
上面在input上监听的focusin会冒泡到body,下面这段事件监听也会执行到,但是document.activeElement是body而不是input了, isShowCustomKeyboard = false就没有执行到,原因就是上面的document.activeElement.blur()
这样第一次点击的时候,就不会执行到下面的isShowCustomKeyboard = false, 只会有上面的isShowCustomKeyboard = true,第二次点击的时候直接获得焦点, 系统默认调起系统键盘,并且此时currentInput === document.activeElement,隐藏自定义键盘。
document.body.addEventListener('focusin', ()=>{
setTimeout(() => {
if (currentInput === document.activeElement) {
isShowCustomKeyboard = false;
}
}, 100);
});
总上所述,第一次点击的时候isMask为true, 当一下, blur()了,马上置为isMask = false。 并显示自定义。因为立即blur()了,下面的body上的监听里当前input 就和document.activeElement对不上了。第二次点击isMask为false了,当前input和document.activeElement也能对上了。
那么自定义键盘切换到系统键盘呢?
就是马上隐藏自定义,并input focus()
isShowCustomKeyboard = false;
currentInput.focus();
通俗点:第一次主动blur(), 置为false, 第二次input才获得焦点