HTML+layui表单校验范围值,根据条件显示隐藏某输入框

html 复制代码
<div class="layui-form layuimini-form" style="margin-top: 20px;">
    <div class="layui-tab-item">
                <fieldset class="layui-elem-field">
        <div class="layui-form-item layui-form-text">
                        <label class="layui-form-label required" style="width: 150px"><span style="color: red;">*</span>计费方式:</label>
                        <div class="layui-input-inline" style="width: 150px">
                            <select class="layui-btn layui-btn-primary" lay-verify="required" id="devicePayModeID"
                                    name="devicePayModeID" lay-filter="devicePayModeID">
                                <option value="0" selected>计时实时扣费</option>
                                <option value="1">计量实时扣费</option>
                            </select>
                        </div>
                        <label class="layui-form-label required" style="width: 150px"><span style="color: red;">*</span>控制模式:</label>
                        <div class="layui-input-inline" style="width: 150px">
                            <select class="layui-btn layui-btn-primary" lay-verify="required" id="deviceConModeID"
                                    name="deviceConModeID" lay-filter="deviceConModeID">
                                <option value="0" selected>常出</option>
                                <option value="1">预扣</option>
                            </select>
                        </div>
<div class="dynamic-fields">
                            <!-- 预扣模式显示 -->
                            <div id="preAmountBlock" class="layui-input-inline" style="width: 150px;display: none">
                                <label class="layui-form-label required"><span style="color: red;">*</span><span
                                        id="preAmountUnit">预扣费单位:</span></label>
                                <div style="margin-left: 110px;width: 160px;">
                                    <input type="number" lay-affix="number" step="0.1" min="\" lay-precision="2"
                                           id="preAmount" lay-filter="preAmount"
                                           name="preAmount" placeholder="" value="" lay-verify="required|preAmountCheck"
                                           class="layui-input">
                                </div>
                            </div>
 </fieldset>
                <fieldset class="layui-elem-field">
                    <legend>基础参数</legend>
                    <div class="layui-form-item layui-form-text">
                        <label class="layui-form-label required" style="width: 200px"><span style="color: red;">*</span><span
                                id="minimumUnitUnit">最小计费:</span></label>
                        <div class="layui-input-inline" style="width: 290px">
                            <input type="number" lay-affix="number" step="1" min="1" id="minimumUnit"
                                   name="minimumUnit" placeholder="请填写最小计费单位"  lay-verify="required|minUnit"  value="0"
                                   class="layui-input">
                        </div>
 </fieldset>

JS

html 复制代码
layui.use(function () {
    var form = layui.form;
    // 页面加载时立即执行
    var payMode = $('#devicePayModeID').val();
    var conMode = $('#deviceConModeID').val();
    if (payMode !== undefined && conMode !== undefined) {
        console.log("初始化加载", payMode, conMode);
        LoadUnit(conMode, payMode);
    }
    // select 事件
    form.on('select(devicePayModeID)', function (data) {
        var payMode = $('#devicePayModeID').val();
        var conMode = $('#deviceConModeID').val();
        console.log("conMode", conMode, "payMode", payMode);
        LoadUnit(conMode, payMode);
    });
    // select 事件
    form.on('select(deviceConModeID)', function (data) {
        var payMode = $('#devicePayModeID').val();
        var conMode = $('#deviceConModeID').val();
        console.log("conMode", conMode, "payMode", payMode);
        LoadUnit(conMode, payMode);
    });

});
// 自定义验证规则
layui.form.verify({
    cardTypeRequired: function(value, item) {
        // 获取 xmSelect 当前选中的值
        var selected = cardTypeSelect.getValue();
        if (!selected || selected.length === 0) {
            return '请选择至少一种卡片类型';
        }
    },
    preAmountCheck: function(value, item) {
        var conMode = $('#deviceConModeID').val();
        if (conMode !== '1') return true; // 非预扣模式不校验
        var minimumUnit = parseFloat($('#minimumUnit').val());
        var preAmount = parseFloat(value);

        // 检查是否为有效数字
        if (isNaN(preAmount) || isNaN(minimumUnit)) {
            return '请输入有效的数字';
        }

        // 核心校验:预扣费 >= 2 * 最小计费单位
        if (preAmount < 2 * minimumUnit) {
            return '预扣费金额必须不小于最小计费单位的2倍(当前最小单位:' + minimumUnit + ')';
        }
    },
    minRate: function(value, item) {
        var num = parseFloat(value);
        if (isNaN(num) || num < 0.01) {
            return '费率不能小于 0.01 元';
        }
    },
    minUnit: function(value, item) {
        // 实时从页面获取当前支付模式
        var payMode = $('#devicePayModeID').val(); // ✅ 安全:DOM 查询
        const baseMin = payMode === '0' ? 1 : 100;
        const unit = payMode === '0' ? '秒' : '毫升';
        const v = parseFloat(value);
        if (isNaN(v)) {
            return '请输入有效数字';
        }
        if (v < baseMin) {
            return '最小计费单位不能小于' + baseMin + unit;
        }
        if (payMode == '0' && v > 60) {
            return '计时实时扣费下,预扣金额为1~60!';
        }
    }
});
$('#minimumUnit').on('input', function() {
    // 可选:如果 preAmount 已填写且不满足新规则,给出提示或清空
    var conMode = $('#deviceConModeID').val();
    var payMode = $('#devicePayModeID').val(); // ✅ 安全:DOM 查询

    if (conMode !== '1') return true; // 非预扣模式不校验
        var minUnit = parseFloat($(this).val()) || 0;
        var preAmt = parseFloat($('#preAmount').val()) || 0;
        if (preAmt > 0 && preAmt < 2 * minUnit) {
            layer.tips('当前预扣费小于最小单位的2倍!', '#preAmount', {tips: [2, '#FF5722']});
        }
});
var cardTypeSelect = xmSelect.render({
    name: 'cardTypeSelect',
    el: '#cardTypeSelect',
    toolbar: {
        show: true,
    },
    data: []
});
$.ajax({
    url: "/cardType/getList",
    type: "GET",
    dataType: 'json',
    async: false,
    success: function (res) {
        cardTypeSelect.update({
                data: res.data.map(item => ({
                    name: item.cardTypeName,
                    value: item.cardTypeID
                }))
        });
    },

});

// 获取区域选择数据
GetAreaSelect('deviceAreaID');
// 获取设备商户选择数据
GetDeviceMerchantSelect('deviceMerchantID');
var url = "/waterDevice/edit";

function LoadUnit(conMode, payMode) {
    // 强制解除输入框禁用状态
    $('#preAmount').prop('disabled', false);
    // 获取单位文本
    const unit = payMode === '0' ? '秒' : '毫升';
    const isPreMode = conMode === '1';
    // 切换默认值
    const minVal  = payMode === '0' ? '1' : '100';
    // 动态更新 min 属性
    $('#minimumUnit').attr('min', ''); // 关键:同步更新 min 属性
    // 切换显示/隐藏逻辑
    $('#preAmountBlock').toggle(isPreMode);

    // 更新单位显示
    $('#minimumUnitUnit').text(`最小计费单位(${unit}):`);
    $('#firstLevelLimitUnit').text(`一阶限制值(${unit}):`);
    $('#secondLevelLimitUnit').text(`二阶限制值(${unit}):`);
    $('#thirdLevelLimitUnit').text(`三阶限制值(${unit}):`);
    $('#fourthLevelLimitUnit').text(`四阶限制值(${unit}):`);

    // 动态更新预扣模式下的单位显示
    if (isPreMode) {
        $('#preAmountUnit').text(`预扣费单位(${unit}):`);
        $('#preAmount').attr('placeholder', `请输入${unit}数`);

        // 预扣模式:启用输入框 + 恢复必填校验
        $('#preAmount').prop('disabled', false).attr('lay-verify', 'required|preAmountCheck');

    }else{
        // 清空值,避免残留值触发校验
        $('#preAmount').val('');
        // 关闭残留的提示框.prop('disabled', true)
        $('#preAmount').val('').removeAttr('lay-verify');
        layer.closeAll('tips');
    }
}
相关推荐
加油乐1 天前
react基础概念合集
前端·react.js
小白探索世界欧耶!~1 天前
用iframe实现单个系统页面在多个系统中复用
开发语言·前端·javascript·vue.js·经验分享·笔记·iframe
bl4ckpe4ch1 天前
用可复现实验直观理解 CORS 与 CSRF 的区别与联系
前端·web安全·网络安全·csrf·cors
阿珊和她的猫1 天前
Webpack中import的原理剖析
前端·webpack·node.js
AI前端老薛1 天前
webpack中loader和plugin的区别
前端·webpack
一只爱吃糖的小羊1 天前
从 AnyScript 到 TypeScript:如何利用 Type Guards 与 Type Predicates 实现精准的类型锁死
前端·javascript·typescript
0思必得01 天前
[Web自动化] BeautifulSoup导航文档树
前端·python·自动化·html·beautifulsoup
脾气有点小暴1 天前
Git指令大全(常见版)
前端·git
QUST-Learn3D1 天前
geometry4Sharp Ray-Mesh求交 判断点是否在几何体内部
服务器·前端·数据库