混合app禁止切换输入法英文键盘方案

前言

在此介绍的是h5的部分,非原生,原生可以直接属性禁止。

需求

禁止中文出现在input中。(如果你认为不显示出来中文,那么请往下看)

效果:只显示英文键盘。

遇到的问题

1.在三星低版本上会出现:比如说输入f,然后输入n,下次输入f的时候,会出现fnf。这个可以清楚缓存禁止。

2.如果你的app在多个国家运行,那么你禁止中文输入往往是不够的,因为别人认为他们明明输入了,但是没有显示出来。如何能够只让它显示英文键盘呢?

解决

那么问题就回到了如何让它只显示英文键盘上。这时候我想到的就是password输入框。

这时候遇到的问题就是password输入框,全是***,显示不了正常文。

解决是拿到password的输入内容显示出来。

.flickerPosition
{
  position: absolute;
  left: 0px;
}
function showtxt(e)
{
  document.getElementById('showtxt').innerHTML=e.srcElement.value;
  console.log();
}
<div class="main">
<div class="showtxt flickerPosition" id="showtxt">
  //显示input信息的地方
</div>
<input type="password" oninput="showtxt(event)" style='color:rgba(255, 255, 255, 0);caret-color:black;'>
</div>

我的开始的思想是让input里面的内容不显示出来,然后在它上面覆盖一层div,显示内容。

但是这么做是有问题的。

问题如下:

光标的位置不对,造成的原因很简单,是因为*的占用的位置比字母下,所以光标往往就在我们输入的最后一个位置的左边。

那么如何解决呢?

问题出在光标上,那么就解决光标, 光标我不要了,自己实现光标。

*{
  margin: 0px;
  padding: 0px;
}
.flicker {
  -webkit-animation: twinkling 1s infinite ease-in-out
}

.flickerPosition
{
  position: absolute;
  left: 0px;
}
@-webkit-keyframes twinkling {
  0% {
	opacity: 0;
  }

  100% {
	opacity: 1;
  }
}
@keyframes twinkling {
  0% {
	opacity: 0;
  }

  100% {
	opacity: 1;
  }
}
.flickerPosition,input{
  font-size: 16px;
  padding: 5px 0px 5px 5px; 
  display: inline-block;
}
.flickerPosition{
  font-size:0px;
}
.showtxt
{
  font-size: 16px;
}
<div class="main">
<div class="flickerPosition" >
  <span class="showtxt" id="showtxt">
  </span>
  <span class="flicker" style="font-size: 18px;visibility: hidden;">
  |
</span>
</div>
<input type="password" oninput="showtxt(event)" style='color:rgba(255, 255, 255, 0);' onfocus="outhtml(event)" onblur="inhtml(event)">
</div>
function outhtml(e) {
  var flicker= document.getElementsByClassName('flicker')[0];
  flicker.style.visibility='visible';
}
function inhtml(e) {
  var flicker= document.getElementsByClassName('flicker')[0];
  flicker.style.visibility='hidden';
}

效果:

思路非常简单,就是实现光标的效果,让它在input focus的时候出现,blur 的时候消失。

请往下看下去,因为涉及到兼容问题。

在ios中,低版本的光标无法用color,或者caret-color 透明。

兼容应该在让这个password不出现在我们的视野中。

<div class="main">
<div class="flickerPosition">
  <span class="showtxt" id="showtxt">
  </span>
  <span class="flicker" style="font-size: 18px;visibility: hidden;">
	|
  </span>
</div>
<input type="password" id="target" oninput="showtxt(event)" onfocus="outhtml(event)" onblur="inhtml(event)" 
  style='color:rgba(255, 255, 255, 0);position:absolute;left: -9999px;'>
<input type="text"  onfocus="changeFocusTarget()" name="username">
</div>

转移焦点。

function changeFocusTarget()
{
   document.getElementById('target').focus();
}

完整版

我当时写的demo,仅供参考。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    * {
      margin: 0px;
      padding: 0px;
    }

    .flicker {
      -webkit-animation: twinkling 1s infinite ease-in-out
    }

    .flickerPosition {
      position: absolute;
      left: 0px;
    }

    @-webkit-keyframes twinkling {
      0% {
        opacity: 0;
      }

      100% {
        opacity: 1;
      }
    }

    @keyframes twinkling {
      0% {
        opacity: 0;
      }

      100% {
        opacity: 1;
      }
    }

    .flickerPosition,
    input {
      font-size: 16px;
      padding: 5px 0px 5px 5px;
      display: inline-block;
    }

    .flickerPosition {
      font-size: 0px;
    }

    .showtxt {
      font-size: 16px;
    }
  </style>
  <script>
    function showtxt(e) {
      document.getElementById('showtxt').innerHTML = e.srcElement.value;
      console.log();
    }
    function outhtml(e) {
      var flicker= document.getElementsByClassName('flicker')[0];
      flicker.style.visibility='visible';
      e.srcElement.style.visibility = 'hidden';
    }
    function inhtml(e) {
      var flicker= document.getElementsByClassName('flicker')[0];
      flicker.style.visibility='hidden';
    }
    function changeFocusTarget()
    {
       document.getElementById('target').focus();
    }
  </script>
</head>

<body>
  <div class="main">
    <div class="flickerPosition">
      <span class="showtxt" id="showtxt">
      </span>
      <span class="flicker" style="font-size: 18px;visibility: hidden;">
        |
      </span>
    </div>
    <input type="password" id="target" oninput="showtxt(event)" onfocus="outhtml(event)" onblur="inhtml(event)" 
      style='color:rgba(255, 255, 255, 0);position:absolute;left: -9999px;'>
    <input type="text"  onfocus="changeFocusTarget()" name="username">
  </div>
</body>
</html>

总结

该方案,在ios和android 混合app上暂时没有发现问题。然后呢,虽然看起来麻烦,但是在vue或者angular中实现非常简单,而且可以做成组件。

posted @ 2020-04-13 14:02  敖毛毛  阅读(351)  评论(0编辑  收藏  举报