<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        angularjs利用directive實現(xiàn)移動端自定義軟鍵盤的示例

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:29:15
        文檔

        angularjs利用directive實現(xiàn)移動端自定義軟鍵盤的示例

        angularjs利用directive實現(xiàn)移動端自定義軟鍵盤的示例:最近公司項目的需求上要求我們iPad項目上一些需要輸入數(shù)字的地方用我們自定義的軟鍵盤而不是移動端設(shè)備自帶的鍵盤,剛接到需求有點懵,因為之前沒有做過,后來理了一下思路發(fā)現(xiàn)這東西也就那樣。先看一下實現(xiàn)之后的效果: 實現(xiàn)的效果就是當點擊頁面中需要彈出
        推薦度:
        導(dǎo)讀angularjs利用directive實現(xiàn)移動端自定義軟鍵盤的示例:最近公司項目的需求上要求我們iPad項目上一些需要輸入數(shù)字的地方用我們自定義的軟鍵盤而不是移動端設(shè)備自帶的鍵盤,剛接到需求有點懵,因為之前沒有做過,后來理了一下思路發(fā)現(xiàn)這東西也就那樣。先看一下實現(xiàn)之后的效果: 實現(xiàn)的效果就是當點擊頁面中需要彈出

        最近公司項目的需求上要求我們iPad項目上一些需要輸入數(shù)字的地方用我們自定義的軟鍵盤而不是移動端設(shè)備自帶的鍵盤,剛接到需求有點懵,因為之前沒有做過,后來理了一下思路發(fā)現(xiàn)這東西也就那樣。先看一下實現(xiàn)之后的效果:

        實現(xiàn)的效果就是當點擊頁面中需要彈出軟鍵盤的時候軟鍵盤彈出,浮在頁面的中間,和模態(tài)框一樣的效果,可以在軟鍵盤中輸入任何數(shù)字,附帶的功能有小數(shù)點、退格、清空、確定等功能。當在鍵盤上點擊數(shù)字的時候頁面中的表單中實時的添加對應(yīng)的數(shù)字,上圖中可以看到。

        產(chǎn)品經(jīng)理那邊給的原因是iPad屏幕本來就小,如果軟鍵盤彈出的話會占用一半的屏幕,影響產(chǎn)品的美觀,無奈只能想辦法搞定。

        自定義的軟鍵盤使用angularJS的directive的自定義指令來做到的,angularJS的directive這里不做解釋,如果不清楚的話可以去angular官網(wǎng)看看。用的是自定義一個屬性(restrict:'A'),這樣封裝過之后在需要用到軟鍵盤的時候只需要在<input>中加入自定義的屬性即可調(diào)出軟鍵盤,使用起來非常簡單,自定義的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();
         });
         //關(guān)閉模態(tài)框
         $(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');
         });
         //點擊數(shù)字
         $(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中調(diào)用如下:

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

        可以看到只是定義了一個 calculator 屬性,然后在dom中只需要加入 calculator 即可使用軟鍵盤。

        我的軟鍵盤亮點:
        1、calculator 調(diào)用的時候表單獲取焦點,有人會問移動端設(shè)備在獲取到焦點的時候會彈出軟鍵盤,那豈不是會出來兩個鍵盤呢?實際不然,directive中對此做了處理:

        即在獲取到焦點的同事失去焦點,這樣就能完美的避免設(shè)備自帶的鍵盤。

        2、數(shù)字鍵盤中的數(shù)據(jù)和頁面的表單中的數(shù)據(jù)實時聯(lián)動起來是通過ng-model實現(xiàn)的,在獲取焦點的時候directive中會獲取到ng-model的值并賦給頁面中的表單,這樣就能實現(xiàn)數(shù)據(jù)聯(lián)動起來,讓軟鍵盤更加完美,可參考第一張圖。

        3、為了讓軟鍵盤點擊的時候更加逼真,在自定義的directive中對按鈕元素進行了處理,當點擊按鈕的時候給當前被點擊的元素添加一個class,效果帶陰影效果的按鈕往下移動了幾像素,看起來有點擊的效果,產(chǎn)品和UI沒有給我這個需求,是我自己自由發(fā)揮的,哈哈。

        4、在項目中用到自定義的這個軟鍵盤的時候有些需要在點擊鍵盤的確定按鈕之后需要進行一些數(shù)據(jù)處理,于是后來在directive的確定安妮中中加了一個回調(diào),我們可以在點擊確定之后調(diào)用這個回調(diào),可以達到確定數(shù)字之后緊接著自動去執(zhí)行需要執(zhí)行的事件。只需要在dom中加上callback="functionItem()"即可。

        當然如果是英文字母的話也可以用這種方法,只需要在初始的數(shù)組中寫上英文字母布局排好即可,異曲同工而已。

        以上是我寫的簡單的移動端數(shù)字鍵盤,希望對看到的人有所幫助。

        如果有不足的地方還望指正大家相互交流,如果有更好的方法也請告訴我一下,作為一只程序猿,我要碼無止境的優(yōu)化我的代碼。

        以上這篇angularjs利用directive實現(xiàn)移動端自定義軟鍵盤的示例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        angularjs利用directive實現(xiàn)移動端自定義軟鍵盤的示例

        angularjs利用directive實現(xiàn)移動端自定義軟鍵盤的示例:最近公司項目的需求上要求我們iPad項目上一些需要輸入數(shù)字的地方用我們自定義的軟鍵盤而不是移動端設(shè)備自帶的鍵盤,剛接到需求有點懵,因為之前沒有做過,后來理了一下思路發(fā)現(xiàn)這東西也就那樣。先看一下實現(xiàn)之后的效果: 實現(xiàn)的效果就是當點擊頁面中需要彈出
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 最近免费字幕中文大全视频| 国产成人 亚洲欧洲| 免费看a级黄色片| 亚洲成AV人综合在线观看| 国产午夜亚洲精品不卡| 国产精品麻豆免费版| 亚洲中文字幕在线第六区| 亚洲色欲啪啪久久WWW综合网| 中文字幕人成无码免费视频| 亚洲AV日韩AV永久无码久久| 暖暖在线视频免费视频| 666精品国产精品亚洲| 国产免费牲交视频免费播放| 亚洲综合精品香蕉久久网| 国产一级片免费看| 国产国拍亚洲精品福利 | 日韩免费福利视频| 羞羞视频在线免费观看| 亚洲中文字幕伊人久久无码| 国内永久免费crm系统z在线| 亚洲综合在线视频| 久久久久久国产a免费观看不卡 | 久久久久亚洲精品日久生情| 成人免费观看一区二区| 久久夜色精品国产亚洲| 59pao成国产成视频永久免费| 亚洲综合精品伊人久久| 亚洲福利视频一区二区| 亚洲av无码专区在线电影| 一个人免费高清在线观看| 国产精品亚洲一区二区三区| 亚洲国产成人高清在线观看| 亚洲一级毛片免费观看| 美女羞羞视频免费网站| 亚洲av永久无码精品国产精品| 一本岛高清v不卡免费一三区| jizzjizz亚洲日本少妇| 亚洲AV电影院在线观看| 国产男女猛烈无遮档免费视频网站| 一级毛片在线免费视频| 91亚洲自偷在线观看国产馆|