前端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()"即可。

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

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

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

每天进步一丢丢。



				
时间: 2024-08-02 02:47:30

前端angularJS利用directive实现移动端自定义软键盘的方法的相关文章

AngularJS 利用directive集成JQuery ZTree

前段时间一直在看AngularJS的资料,感觉是个很好的框架,很想有机会尝试用它做点什么. JQuery ZTree是国内非常不错的JQuery插件,功能齐全,文档和API也非常的友好,之前项目上常用此插件. AngularJS功能虽然非常强大,但UI上提供的插件不像JQuery那么多,而且只能通过directive定义扩展的UI插件,虽然国外已经提供了一些基于directive的Tree功能实现,但毕竟不像ZTree那样强大,而且Tree是做项目中很长用的一个基本功能. 因此,花了一点时间做了

Android自定义软键盘

前不久由于项目的需要,要做一个自定义的软键盘,我也上网看了很多,都觉得很繁琐,所以想自己动手实现个.以备不时之需把.我选择了参考百度钱包的软键盘,看起来还不错: 下面一起来实现它: 1.写一个键盘控件,这个实现起来比较简单,就不多说了 public class SoftInputBoard extends RelativeLayout implements View.OnClickListener{ private Scroller mScroller; private int mScreenH

android安卓屏蔽禁用系统输入法,自定义软键盘,解决EditText光标问题demo

目前很多的输入法都有自动提示补全功能,在一些应用场景里不适用,需要禁用系统输入法,自定义软键盘,EditText的光标问题是比较头疼的,网上的说法很多,然而大部分都是解决不了问题的.以下是本人做的一个demo供网友参考. 直接上代码: xml软键盘:         <android.inputmethodservice.KeyboardView             android:id="@+id/keyboard_view"             android:lay

Android 中自定义软键盘

Android 中自定义软键盘    图一为搜狗输入法.图二为自定义密码键盘.图三为自定义密码键盘 java源文件 package com.keyboarddemo; import android.content.Context; import android.graphics.Paint; import android.graphics.Rect; import android.text.method.PasswordTransformationMethod; import android.u

Android使用xml自定义软键盘效果(附源码)

Android使用xml自定义软键盘效果原理: 1,软键盘其实是个控件,使用android.inputmethodserver.KeyboardView类定义. 2,主布局中使用帧布局,当我们需要显示软键盘时设置为可见,不需要时设置为不可见. 3,编写xml文件,定义键盘内容.使用xml文件填充KeyBoardView布局 4,设置EditText的监听事件. 完成键盘开发. 上效果图: 1,源码研究android.inputmethodserver.KeyboardView: /* * Cop

android开发(45) 自定义软键盘(输入法)

概述 在项目开发中遇到一个需求,”只要数字键盘的输入,仅仅有大写字母的输入,某些输入法总是会提示更新,弹出广告等“,使得我们需要自定义输入. 关联到的知识 KeyboardView      一个视图对象,展示了键盘.它需要关联到一个 Keyboard对象才能展示. Keyboard              键盘对象,通过加载xml的配置获得键盘的排列. xml 文件键盘描述     一个xml文件,放置在 xml 资源文件夹下,描述了 显示的键盘按钮,和排列,键盘宽度和高度等. 具体实现 准

移动端监控软键盘弹出、收起事件

1.原理: 根据可视化窗口的改变来判断 var winHeight = $(window).height(); //获取当前页面高度 $(window).resize(function () { var thisHeight = $(this).height(); if ( winHeight - thisHeight > 50 ) { //键盘弹出 } else { //键盘收起 } })

移动端定制软键盘样式 配置input属性的type属性

1.当你的input输入的数据为链接地址时type属性可改为 type=url 最下面一栏就会出现.com 提高用户体验 2.当你的input输入的数据为email时type属性可改为 type=email 最下面一栏就会出现@符号 3.当你的input输入的数据为电话时type属性可改为 type=tel 软键盘就会显示这个样子. 4.当你的input输入的数据为电话时type属性可改为 type=number 显示介个样子

移动端Android软键盘遮住输入框解决!

在使用vue的情况下,在输入框中添加 <textarea class="textarea" @click="isAndroid" :maxlength="30" :rows="1" placeholder="订单备注(30字以内)" v-model="remark"></textarea> isAndroid(){if(/Android [4-6]/.test(n