H5车牌输入选择器

前言

公司的业务背景是个大型园区,不可避免的要接触太多与车辆收费相关的业务,于是就有了这个车牌输入选择器。对于车牌,用户手动输入的是不可信的,而且车牌第一位的地区简称打字输入实在是太麻烦,所以界定用户的输入内容,才能让双方都更加方便。

预览: pxsgdsb.github.io/licensePlat... (请使用移动端打开)

github:github.com/pxsgdsb/lic...

gitee:gitee.com/PxStrong/li...

实现

因为车牌内容是固定的,所以直接写死在元素内。但是,为了提高组件的复用性,需要做一些简单的封装

js 复制代码
; (function ($) {
function LicensePlateSelector() {
    // 输入框元素
    this.input_dom = `<ul class="plate_input_box">
        <li class="territory_key" data-type="territory_key"></li>
        <li style="margin-right:.8rem;"></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li data-end="end"></li>
        <li data-cls="new_energy" data-end="end" class="new_energy">
            <span>新能源</span>
        </li>
    </ul>`
    // 键盘元素
    this.keyboard_dom = `...省略`
}
/**
 * 初始化 车牌选择器
 * @param {string} config.elem  元素
 * @param {string} config.value  默认填充车牌
 * @param {number} config.activeIndex   默认选中下标 (从0开始)
 * @param {function} inputCallBack  输入事件回调
 * @param {function} deleteCallBack  键盘删除事件回调
 * @param {function} closeKeyCallBack  关闭键盘事件回调
 */
LicensePlateSelector.prototype.init = function (config) {
    config = {
        elem: config.elem,
        value: config.value || "",
        activeIndex: config.activeIndex || false,
        inputCallBack: config.inputCallBack || false,
        deleteCallBack: config.deleteCallBack || false,
        closeKeyCallBack: config.closeKeyCallBack || false,
    }
    this.elemDom = $(config.elem);
    this.elemDom.append(this.input_dom);
    this.elemDom.append(this.keyboard_dom);
    // 监听输入
    this.watchKeyboardEvents(function(val){ 
        // 键盘输入回调
        if(config.inputCallBack){config.inputCallBack(val);}
    },function(){
        // 键盘删除事件回调
        if(config.deleteCallBack){config.deleteCallBack();}
    },function(){
        // 关闭键盘事件回调
        if(config.closeKeyCallBack){config.closeKeyCallBack();}
    })
    // 输入默认车牌
    if (config.value) {
        this.elemDom.find(".plate_input_box li").each(function (index) {
            if (config.value[index]) {
                $(this).text(config.value[index])
            }
        })
    }
    // 选中默认下标
    if(config.activeIndex){
        this.elemDom.find(".plate_input_box li").eq(config.activeIndex).click();
    }
};
})(jQuery);

watchKeyboardEvents()函数用于在元素创建完成后创建事件监听

js 复制代码
/**
* 监听键盘输入
* @param {function} inputCallBack  输入事件回调
* @param {function} deleteCallBack  键盘删除事件回调
* @param {function} closeKeyCallBack  关闭键盘事件回调
*/
LicensePlateSelector.prototype.watchKeyboardEvents = function(inputCallBack,deleteCallBack,closeKeyCallBack) {
        let _this = this
        // 输入框点击
        _this.elemDom.find(".plate_input_box li").click(function (event) {
            // 显示边框
            $(".plate_input_this").removeClass("plate_input_this");
            $(this).addClass("plate_input_this")
            // 弹出键盘
            // 关闭别的键盘
            $(".territory_keyboard").css("display","none")
            $(".alphabet_keyboard").css("display","none")
            if ($(this).attr("data-type") && $(this).attr("data-type") == "territory_key") {
                if (_this.elemDom.find(".territory_keyboard").css("display") == "none") {
                    _this.elemDom.find(".alphabet_keyboard").animate({ bottom: "-50rem" }).hide()
                    _this.elemDom.find(".territory_keyboard").show().animate({ bottom: 0 })
                }
            } else {
                if (_this.elemDom.find(".alphabet_keyboard").css("display") == "none") {
                    _this.elemDom.find(".territory_keyboard").animate({ bottom: "-50rem" }).hide()
                    _this.elemDom.find(".alphabet_keyboard").show().animate({ bottom: 0 })
                }
            }
            // 点击新能源
            if ($(this).attr("data-cls") == "new_energy") {
                $(this).empty().removeClass("new_energy").attr("data-cls", "")
            }
            event.stopPropagation();    //  阻止事件冒泡
        })

        // 地域键盘输入事件
        ......
    }

使用时html只需要创建一个根元素,js输入配置项,自动渲染组件。

html 复制代码
<div id="demo"></div>
<script>
let licensePlateSelector = new LicensePlateSelector();
// 初始化
licensePlateSelector.init({
    elem: "#demo",  // 根元素id
    value: "湘A",   // 默认填充车牌
    activeIndex: 2,    // 默认选中下标 (从0开始,不传时,默认不选中)
    inputCallBack:function(val){ // 输入事件回调
        console.log(val);
        let plate_number = licensePlateSelector.getValue(); // 获取当前车牌
        console.log(plate_number);
    },
    deleteCallBack:function(){ // 键盘删除事件回调
        let plate_number = licensePlateSelector.getValue(); // 获取当前车牌
        console.log(plate_number);
    },
    closeKeyCallBack:function(){ // 关闭键盘事件回调
        console.log("键盘关闭");
    },
})
</script>

参数

参数 类型 必填 说明 示例值
elem String 指定元素选择器 "#demo"
value String 默认填充车牌 "湘A"
activeIndex number 当前输入框下标,从0开始,不传时,默认不选中 2
inputCallBack function 输入事件回调函数,返回参数:当前输入的值
deleteCallBack function 键盘删除事件回调函数
closeKeyCallBack function 关闭键盘事件回调函数

方法

getValue 获取当前车牌

js 复制代码
let plate_number = licensePlateSelector.getValue();

setValue 设置车牌

js 复制代码
licensePlateSelector.setValue("粤A1E9Q3");

clearValue 清空车牌

js 复制代码
licensePlateSelector.clearValue();

END

如果觉得对你还有些用,顺手点一下star吧。

相关推荐
橙子家5 小时前
浏览器缓存之【身份与会话管理】:Cookies 和 Private state tokens
前端
最新资讯动态6 小时前
HDC 2026 | 对话鲸鸿动能:存量时代,品牌如何夺回营销“主动权”?
前端
最新资讯动态6 小时前
游戏出海,从产品走向体系
前端
最新资讯动态6 小时前
20人团队跑出百万DAU、大厂也来抢量:谁在鸿蒙生态跑出加速度
前端
最新资讯动态7 小时前
千万开发者背后,鸿蒙商业化的B面
前端
爱勇宝9 小时前
AI 时代:智商决定起点,情商决定走多远
前端·ai编程
kyriewen9 小时前
用了半年 Claude Code 后,我尝试关掉它写了一周代码——结果比想象中严重
前端·javascript·ai编程
IT_陈寒10 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
徐小夕10 小时前
万字拆解 JitWord:企业级实时协同文档底层架构 + 大模型 AI 融合完整实践
前端·vue.js·github
一份执念10 小时前
uni-app 小程序分包限制处理与主包体积优化实战
前端·微信小程序