微信小程序使用车牌号输入法的示例代码


Posted in Javascript onAugust 20, 2019

在做小程序时,做了一个关于车的项目,然后需要添加车辆信息、添加车牌号,使用车牌键盘输入,当时我把这个需求给砍了,然后在添加车辆信息时,老大看到数据库里我乱填的车牌号,又让我把他加上了^o^

1.效果图

微信小程序使用车牌号输入法的示例代码

微信小程序使用车牌号输入法的示例代码

2.相关代码使用组件形式实现键盘输入

组件代码index.wxml

<view class="carPlate" wx:if="{{show}}">
 <block wx:if="{{type==1}}">
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword1}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword2}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword3}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{cityKeyword4}}" wx:key="{{item}}" bindtap="handleClick" data-type="1" data-item="{{item}}">{{item}}</view>
  </view>
 </block>
 <block wx:else>
  <view class="wordList">
   <view class="wordItem" wx:for="{{keyNumber}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{wordList1}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{wordList2}}" wx:key="{{item}}" bindtap="handleClick" data-type="2" data-item="{{item}}">{{item}}</view>
   <view class="wordItem wordClear" bindtap="handleClick" data-item="delete">
    <image src="/images/input-clear.png" class="clearImg"></image>
   </view>
  </view>
  <view class="wordList">
   <view class="wordItem" wx:for="{{wordList3}}" wx:key="{{item}}" bindtap="handleClick" data-item="{{item}}">{{item}}</view>
   <view class="wordItem wordConfirm" bindtap="handleClick" data-item="confirm">确定</view>
  </view>
 </block>
</view>

index.css

.carPlate{
 position: fixed;
 padding: 12rpx 12rpx 30rpx;
 left: 0;
 bottom: 0;
 width: 100%;
 /* height: 150px; */
 font-size: 30rpx;
 background: #fff;
 box-sizing: border-box;
 border-top: 1px solid rgb(211, 207, 207);
 z-index: 200;
}
.wordList{
 display: flex;
 width: 100%;
 justify-content: space-between;
 align-items: center;
}
.wordItem{
 margin: 5rpx;
 width: 70rpx;
 height: 70rpx;
 line-height: 70rpx;
 text-align: center;
 border: 1px solid #eee;
 border-radius: 10rpx;
}
.wordConfirm{
 width: 130rpx;
 color: #fff;
 background: #473af0;
}
.wordClear{
 width: 100rpx;
}
.clearImg{
 width: 60rpx;
 height: 60rpx;
 vertical-align: middle;
}

index.js

Component({

 properties: {
  type: {
   type: Number,
   default: 1,
  },
  show: {
   type: Boolean,
   default: false,
  }
 },

 data: {
  cityKeyword1: '京沪浙苏粤鲁晋冀豫',
  cityKeyword2: '川渝辽吉黑皖鄂湘赣',
  cityKeyword3: '闽陕甘宁蒙津贵云',
  cityKeyword4: '桂琼青新藏港澳台',
  keyNumber: '1234567890',
  wordList1: 'QWERTYUIOP',
  wordList2: 'ASDFGHJKL',
  wordList3: 'ZXCVBNM',
 },

 methods: {
  handleClick(e) {
   let value = e.currentTarget.dataset.item;
   let type = e.currentTarget.dataset.type;
   switch(value) {
    case 'confirm':
     this.triggerEvent('confirm');
     break;
    case 'delete':
     this.triggerEvent('delete');
     break;
    default: 
     this.triggerEvent('change', { value, type });
   }
  }
 }
})

3.父组件引入

我想实现点击输入后有上拉的效果,开始我想使用offset来实现的,但是下班后洗衣服想了下,不太好实现,我就想到了我以前做购物车时,有用到transform,原理差不多,我就把他用上了

然后就是点击键盘外实现收起键盘,开始我想到的就是在父组件的最外层定义关闭事件,父级里面的盒子都使用catch方法阻止冒泡,但想下阻止冒泡好像又有点不合情理,就又把阻止冒泡给去掉了

父组件index.wxml

<view class="container" bindtap="handlePlateConfirm">
 <view class="translateView" style="transform: translateY({{translateSpace}}px)">
  <view class="list">
   <view class="item">
    <view class="label">*车牌号码</view>
    <view class="contentBox" catchtap="handleClick">
     <view class="inputBox" wx:if="{{carNo}}">{{carNo}}</view>
     <view class="promptText" wx:else>请输入车牌号</view>
    </view>
   </view>
  </view>
 </view>
</view>
<car-plate show="{{showPlateInput}}" bindchange="handlePlateChange" type="{{inputType}}" bindconfirm="handlePlateConfirm" binddelete="handlePlateDelete" />

父组件index.js

Page({
 data: {
  carNo: '',
  translateSpace: 0,
  inputType: 1, // 车牌输入类型,1简称,2数字或者字母,
  showPlateInput: false,
 },
 /* 用于点击弹出键盘输入,space为键盘弹出后向上拉取的距离 */
 handleClick(e) {
  /* 150为键盘的高度 */
  let space = -(e.currentTarget.offsetTop - 150);
  /* regExp用于判断当前已输入的车牌号是否是中文,并让键盘显示中文还是英文输入 */
  let regExp = /^[\u4e00-\u9fa5]+/;
  let inputType = 1;
  if(regExp.test(this.data.carNo)) {
   inputType = 2;
  }

  this.setData({
   translateSpace: space,
   showPlateInput: true,
   inputType
  })
 },
 /* 键盘输入操作 */
 handlePlateChange(e) {
  let value = e.detail.value;
  let type = e.detail.type;
  let carNo = this.data.carNo;
  carNo += value;

  if(type == 1) {
   this.setData({
    inputType: 2
   })
  }
  this.setData({
   carNo
  })
 },
 /* 点击键盘上的确定 */
 handlePlateConfirm() {
  /* isCarPlate用于判断输入的车牌号是否符合规范 */
  if (!this.isCarPlate(this.data.carNo)) {
   wx.showToast({
    title: '请输入正确的车牌号',
    icon: 'none',
    duration: 2000
   })
   return false;
  }
  this.setData({
   translateSpace: 0,
   showPlateInput: false,
   inputType: 1
  })
 },
 /* 用于键盘输入删除 */
 handlePlateDelete(e) {
  let carNo = this.data.carNo;
  carNo = carNo.substring(0, carNo.length - 1);
  if(carNo.length == 0) {
   this.setData({
    inputType: 1
   })
  }
  this.setData({
   carNo,
  })
 },
 /* 判断车牌号 */
 isCarPlate(value) {
  return /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test(value);
 }
})

父组件index.css

.container{
 height: 100vh;
 background: #fff;
}
.translateView{
 background: #eee;
}
.list{
 margin-bottom: 20rpx;
 background: #fff;
}
.list:last-child{
 margin: 0;
}
.item{
 display: flex;
 padding: 0 26rpx;
 width: 100%;
 height: 116rpx;
 box-sizing: border-box;
 align-items: center;
 border-bottom: 1px solid #eee;
}
.item:last-child{
 border: none;
}
.label{
 margin-right: 10rpx;
 width: 140rpx;
}
.contentBox{
 display: flex;
 width: calc(100% - 150rpx);
 height: 90rpx;
 align-items: center;
 justify-content: space-between;
}
.promptText{
 color: #c7c7c7;
}
.inputBox{
 width: 100%;
 height: 80rpx;
 line-height: 80rpx;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中的类继承
Nov 25 Javascript
jquery each()源代码
Feb 14 Javascript
Js点击弹出下拉菜单效果实例
Aug 12 Javascript
JavaScript和CSS交互的方法汇总
Dec 02 Javascript
js实现点击切换TAB标签实例
Aug 21 Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 Javascript
javascript汉字拼音互转的简单实例
Oct 09 Javascript
js 数字、字符串、布尔值的转换方法(必看)
Apr 07 Javascript
详解前端路由实现与react-router使用姿势
Aug 07 Javascript
微信小程序开发常见问题及解决方案
Jul 11 Javascript
vue监听dom大小改变案例
Jul 29 Javascript
使用react-virtualized实现图片动态高度长列表的问题
May 28 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 #Javascript
Vue实现购物车详情页面的方法
Aug 20 #Javascript
详解解决小程序中webview页面多层history返回问题
Aug 20 #Javascript
JavaScript使用表单元素验证表单的示例代码
Aug 20 #Javascript
vue悬浮可拖拽悬浮按钮的实例代码
Aug 20 #Javascript
JS中的算法与数据结构之链表(Linked-list)实例详解
Aug 20 #Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
Aug 20 #Javascript
You might like
php 采集书并合成txt格式的实现代码
2009/03/01 PHP
php获取文件大小的方法
2014/02/26 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
laravel实现简单用户权限的示例代码
2019/05/28 PHP
javascript比较文档位置
2008/04/08 Javascript
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
图片onload事件触发问题解决方法
2011/07/31 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
ECMA5数组的新增方法有哪些及forEach()模仿实现
2015/11/03 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
bootstrapValidator.min.js表单验证插件
2017/02/09 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
vue resource post请求时遇到的坑
2017/10/19 Javascript
手把手教你vue-cli单页到多页应用的方法
2018/05/31 Javascript
jQuery使用bind动态绑定事件无效的处理方法
2018/12/11 jQuery
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
js最全的数组的降维5种办法(小结)
2020/04/28 Javascript
jQuery实现全选按钮
2021/01/01 jQuery
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
python 实现对数据集的归一化的方法(0-1之间)
2018/07/17 Python
Python小工具之消耗系统指定大小内存的方法
2018/12/03 Python
python实现五子棋小程序
2019/06/18 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
使用python模拟高斯分布例子
2019/12/09 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
video下autoplay属性无效的解决方法(添加muted属性)
2020/05/19 HTML / CSS
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
ASICS印度官方网站:日本专业运动品牌
2020/06/20 全球购物
给老婆的婚前保证书
2014/02/01 职场文书
小学生环保倡议书
2014/05/15 职场文书
单位更名证明
2015/06/18 职场文书
python中Matplotlib绘制直线的实例代码
2021/07/04 Python
mysql脏页是什么
2021/07/26 MySQL