zoukankan      html  css  js  c++  java
  • 混合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中实现非常简单,而且可以做成组件。

  • 相关阅读:
    mysql时间戳转换成可读时间格式
    浅谈依赖注入与控制反转
    win下安装wget以及使用wget
    Mysql 压力测试工具 mysqlslap
    PHP Web木马扫描器
    PHP双向队列,双端队列代码
    20款响应式bootstrap后台模板源码下载
    15款fullpage.js鼠标滚动页面动画展示特效
    20款网页常用的返回顶部代码
    21款大气的全屏图片切换代码
  • 原文地址:https://www.cnblogs.com/aoximin/p/12678219.html
Copyright © 2011-2022 走看看