全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

angularjs利用directive实现移动端自定义软键盘的示例

最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样。先看一下实现之后的效果:

实现的效果就是当点击页面中需要弹出软键盘的时候软键盘弹出,浮在页面的中间,和模态框一样的效果,可以在软键盘中输入任何数字,附带的功能有小数点、退格、清空、确定等功能。当在键盘上点击数字的时候页面中的表单中实时的添加对应的数字,上图中可以看到。

产品经理那边给的原因是iPad屏幕本来就小,如果软键盘弹出的话会占用一半的屏幕,影响产品的美观,无奈只能想办法搞定。

自定义的软键盘使用angularJS的directive的自定义指令来做到的,angularJS的directive这里不做解释,如果不清楚的话可以去angular官网看看。用的是自定义一个属性(restrict:'A'),这样封装过之后在需要用到软键盘的时候只需要在<input>中加入自定义的属性即可调出软键盘,使用起来非常简单,自定义的directive如下:

angular.module('ng-calculator', []).directive('calculator', ['$compile',function($compile) {
  return {
    restrict : 'A',
    replace : true,
    transclude : true,
    template:'<input/>',

    link : function(scope, element, attrs) {
      var keylist=[1,2,3,4,5,6,7,8,9,0,'.'];
      var calculator = '<div class="ngcalculator_area"><div class="bg"></div>'
        +'<div class="calculator">'
        +'<div class="title close">'+attrs.title+'</div><div class="inputarea">'
        +'<input type="text" id="text" ng-tap="getInput()" class="'+attrs.class+'" ng-model="' +attrs.ngModel+'">'
        +'</div><div class="con">'
        +'<div class="left">';
      $.each(keylist,function(k,v){
        calculator += '<div class="keyboard num" value="'+v+'">'+v+'</div>';
      });

      calculator += '</div>'
        +'<div class="right">'
        +'<div class="keyboard blueIcon backstep"></div>'
        +'<div class="keyboard blueIcon cleanup">清空</div>'
        +'<div class="keyboard ensure ensure">确<br>定</div>'
        +'</div>'
        +'</div>'
        +'</div>'
        +'</div>';
      calculator = $compile(calculator)(scope);
      element.bind('focus',function(){
        document.body.appendChild(calculator[0]);
        document.activeElement.blur();
      });

      $(calculator[0]).find("input").focus(function(){
        document.activeElement.blur();
      });
      //关闭模态框
      $(calculator[0]).find(".close").click(function(){
        calculator[0].remove();
        var callback = attrs.callback;
        if(typeof callback!="undefined"){
          scope[callback]();
        }
      });
      $(calculator[0]).find(".bg").click(function(){
        calculator[0].remove();
      });
      //退格
      $(calculator[0]).find(".backstep").click(function(){
        if(typeof $(calculator[0]).find("input").val()=="undefined"){
          $(calculator[0]).find("input").val("");
        }
        $(calculator[0]).find("input").val($(calculator[0]).find("input").val().substring(0,$(calculator[0]).find("input").val().length-1)).trigger('change');
      });
      //清空
      $(calculator[0]).find(".cleanup").click(function(){
        $(calculator[0]).find("input").val("").trigger('change');
      });
      //点击数字
      $(calculator[0]).find(".num").click(function(){
        var val = $(calculator[0]).find("input").val();
        var filter = attrs.filter;
        if(typeof filter!="undefined"){
          val = scope[filter](val,$(this).attr("value"));
        }else{
          val = val+''+$(this).attr("value");
        }
        $(calculator[0]).find("input").val(val).trigger('change');
      });
      //确认
      $(calculator[0]).find(".ensure").click(function(){
        calculator[0].remove();
        var callback = attrs.callback;
        if(typeof callback!="undefined"){
          scope[callback]();
        }
      });
      //点击效果
      $(calculator[0]).find(".keyboard").click(function(){
        $(this).addClass("keydown");
        var that = this;
        setTimeout(function(){
          $(that).removeClass("keydown");
        },100)
      });
      var position = {
        startX:0,
        startY:0
      };
      calculator[0].getElementsByClassName("title")[0].addEventListener('touchstart', function(e) {
        e.preventDefault();
        var transform = $(calculator[0]).find(".calculator").css("transform").match(/translate\((.*),(.*)\)/);
        if(transform==null){
          position.startX = e.targetTouches[0].clientX;
          position.startY = e.targetTouches[0].clientY;
        }else{
          position.startX = e.targetTouches[0].clientX-parseInt(transform[1]);
          position.startY = e.targetTouches[0].clientY-parseInt(transform[2]);
        }
      }, false);
      calculator[0].getElementsByClassName("title")[0].addEventListener('touchmove', function(e) {
        e.preventDefault();
        var moveX = e.targetTouches[0].clientX-position.startX;
        var moveY = e.targetTouches[0].clientY-position.startY;
        $(calculator[0]).find(".calculator").css("transform","translate("+moveX+"px,"+moveY+"px)");
      }, false);
    }
  };
}]);

dom中调用如下:

<input type="text" placeholder="按价格搜索" ng-model="spaAndHairSeaInPrice" title="按价格搜索" calculator>

可以看到只是定义了一个 calculator 属性,然后在dom中只需要加入 calculator 即可使用软键盘。

我的软键盘亮点:
1、calculator 调用的时候表单获取焦点,有人会问移动端设备在获取到焦点的时候会弹出软键盘,那岂不是会出来两个键盘呢?实际不然,directive中对此做了处理:

即在获取到焦点的同事失去焦点,这样就能完美的避免设备自带的键盘。

2、数字键盘中的数据和页面的表单中的数据实时联动起来是通过ng-model实现的,在获取焦点的时候directive中会获取到ng-model的值并赋给页面中的表单,这样就能实现数据联动起来,让软键盘更加完美,可参考第一张图。

3、为了让软键盘点击的时候更加逼真,在自定义的directive中对按钮元素进行了处理,当点击按钮的时候给当前被点击的元素添加一个class,效果带阴影效果的按钮往下移动了几像素,看起来有点击的效果,产品和UI没有给我这个需求,是我自己自由发挥的,哈哈。

4、在项目中用到自定义的这个软键盘的时候有些需要在点击键盘的确定按钮之后需要进行一些数据处理,于是后来在directive的确定安妮中中加了一个回调,我们可以在点击确定之后调用这个回调,可以达到确定数字之后紧接着自动去执行需要执行的事件。只需要在dom中加上callback="functionItem()"即可。

当然如果是英文字母的话也可以用这种方法,只需要在初始的数组中写上英文字母布局排好即可,异曲同工而已。

以上是我写的简单的移动端数字键盘,希望对看到的人有所帮助。

如果有不足的地方还望指正大家相互交流,如果有更好的方法也请告诉我一下,作为一只程序猿,我要码无止境的优化我的代码。

以上这篇angularjs利用directive实现移动端自定义软键盘的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# angularjs  # directive  # JavaScript利用键盘码控制div移动  # js实现上下左右键盘控制div移动  # JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例  # 原生js实现键盘控制div移动且解决停顿问题  # js实现键盘控制DIV移动的方法  # js实现键盘操作实现div的移动或改变的原理及代码  # 键盘上下键移动选择table表格行的js代码  # javascript下用键盘控制层的移动的代码  # javascript利用键盘控制小方块的移动  # 自定义  # 弹出  # 表单  # 只需  # 要在  # 清空  # 就能  # 给大家  # 可以看到  # 自带  # 回调  # 英文字母  # 的人  # 的是  # 安妮  # 我要  # 给我  # 一只  # 也就  # 模态 


相关文章: 建站三合一如何选?哪家性价比更高?  高端企业智能建站程序:SEO优化与响应式模板定制开发  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  建站为何优先选择香港服务器?  建站之星价格显示格式升级,你的预算足够吗?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何规划企业建站流程的关键步骤?  如何在局域网内绑定自建网站域名?  音响网站制作视频教程,隆霸音响官方网站?  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  建站之星安装提示数据库无法连接如何解决?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  盘锦网站制作公司,盘锦大洼有多少5G网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  成都网站制作报价公司,成都工业用气开户费用?  如何通过商城自助建站源码实现零基础高效建站?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  如何在腾讯云服务器快速搭建个人网站?  如何在IIS中新建站点并配置端口与物理路径?  C#怎么创建控制台应用 C# Console App项目创建方法  Android滚轮选择时间控件使用详解  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  建站主机选购指南:核心配置优化与品牌推荐方案  如何确认建站备案号应放置的具体位置?  电商网站制作公司有哪些,1688网是什么意思?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  教学网站制作软件,学习*后期制作的网站有哪些?  安云自助建站系统如何快速提升SEO排名?  长沙企业网站制作哪家好,长沙水业集团官方网站?  C++中引用和指针有什么区别?(代码说明)  制作证书网站有哪些,全国城建培训中心证书查询官网?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  如何通过可视化优化提升建站效果?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  如何实现建站之星域名转发设置?  南京网站制作费用,南京远驱官方网站?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  如何将凡科建站内容保存为本地文件?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何选择适配移动端的WAP自助建站平台?  如何在腾讯云免费申请建站?  网站制作需要会哪些技术,建立一个网站要花费多少?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  佛山网站制作系统,佛山企业变更地址网上办理步骤? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。