layui的laydate.render()多次渲染的问题

本文介绍了一种根据用户选择的“上午”或“下午”时间范围,动态调整可选时间的网页表单组件实现方法。通过移除并重新加载laydate组件,实现了上午与下午不同时间段的选择限制。

描述:根据“上午”、“下午”的不同选择,限制可选时间的组件显示不同内容

<div class="main-head">
        <p><span>在线预定</span></p>
    </div>
    <div class="main-reserve">
        <form action="#" method="post" id="food-reserve" class="layui-form">
            <ul>
                <li>
                <div class="layui-inline">
                    <div class="layui-input-inline">
                        <select name="modules" lay-verify="required" onchange="selectFood()" lay-search="">
                            <option value="0" selected>请选择时间范围</option>
                            <option value="1">上午</option>
                            <option value="2">下午</option>
                        </select>
                    </div>
                </div></li>
                
                <li>
                        <label class="layui-form-label">时间</label>
                        <div class="layui-input-inline" id="timeInput">
                            <input type="text" class="layui-input" id="test-limit3" name="time" autocomplete="off">
                        </div>
                </li>
            </ul>
            <div class="layui-form-item">
                <div class="layui-input-block">
                    <button class="layui-btn" lay-submit="" lay-filter="demo1">立即提交</button>
                    <button type="reset" class="layui-btn layui-btn-primary">重置</button>
                </div>
            </div>

        </form>
    </div>

laydate.render()只会渲染一次,若要多次渲染,可以移除元素,重新加载

<script>
    var form;
    layui.use(['laydate','form'], function(){
        var laydate = layui.laydate;
        form = layui.form; //只有执行了这一步,部分表单元素才会自动修饰成功
        
        form.on('select', function(data){
            //获取被选中的option标签
            var flag = data.value;
            if (flag == 1) {
            /* 移除元素,重新加载 */
                $("#test-limit3").remove();
                $("#timeInput").html('<input type="text" class="layui-input" id="test-limit3" name="time" autocomplete="off">');
                //限定可选时间
                laydate.render({
                    elem: '#test-limit3'
                    ,type: 'time'
                    ,min: '10:30:00'
                    ,max: '12:00:00'
                    ,btns: ['clear', 'confirm']
                });
            } else if (flag == 2){
                $("#test-limit3").remove();
                $("#timeInput").html('<input type="text" class="layui-input" id="test-limit3" name="time" autocomplete="off">');
                //限定可选时间
                laydate.render({
                    elem: '#test-limit3'
                    ,type: 'time'
                    ,min: '14:00:00'
                    ,max: '22:00:00'
                    ,btns: ['clear', 'confirm']
                });
            } else {
                alert("请选择时间范围");
            }
        });
    });

</script>
### 动态渲染 laydate 组件并添加事件监听的实现方式 在使用 Layui 框架时,动态渲染 `laydate` 组件并为其添加事件监听需要结合 JavaScript 和 Layui 的 API。以下是详细的实现方法: #### 1. 动态渲染 laydate 组件 动态渲染 `laydate` 组件可以通过重新生成 HTML 元素并调用 `laydate.render()` 方法实现。根据引用[^2],如果直接重新渲染无法生效,则需要先删除原有元素再插入新的 HTML 元素。 ```javascript layui.use(['form', 'laydate'], function() { var form = layui.form; var laydate = layui.laydate; // 监听单选按钮事件 form.on('radio(radio1)', function(data) { if (data.value == 0) { // 删除原有元素 $("#createTime").remove(); // 插入新的 HTML 元素 var html = '<input type="text" value="" name="createTime" id="createTime" placeHolder="请选择时间" readonly="true" class="layui-input laydate-range">'; $("#timeDiv").append(html); // 渲染 laydate 组件 laydate.render({ elem: '#createTime', type: 'date', format: 'yyyy-MM-dd', range: true }); } else { // 删除原有元素 $("#createTime").remove(); // 插入新的 HTML 元素 var html = '<input type="text" value="" name="createTime" id="createTime" placeHolder="请选择时间" readonly="true" class="layui-input laydate-range">'; $("#timeDiv").append(html); // 渲染 laydate 组件 laydate.render({ elem: '#createTime', type: 'month', format: 'yyyy-MM', range: true }); } // 刷新表单 form.render(); }); }); ``` #### 2. 添加事件监听 对于动态渲染的组件,普通的事件绑定可能无效,因为这些组件是在 DOM 加载后动态生成的。此时需要使用事件委托的方式绑定事件。根据引用[^4],可以使用 `$(document).on()` 方法绑定事件。 以下是一个为动态渲染的 `laydate` 组件添加点击事件监听的示例: ```javascript // 使用事件委托绑定点击事件 $(document).on('click', '#createTime', function() { console.log('laydate 组件被点击了'); // 在这里可以执行其他逻辑 }); // 如果需要移除之前的事件绑定以防止重复绑定 $(document).off('click', '#createTime').on('click', '#createTime', function() { console.log('laydate 组件被点击了'); }); ``` #### 3. 注意事项 - **事件委托**:由于动态渲染的组件在页面初始加载时不存在,因此需要使用事件委托的方式绑定事件。 - **移除重复绑定**:为了避免多次绑定事件导致功能异常,建议在绑定事件前使用 `$(document).off()` 移除之前的绑定。 - **Layui 组件特性**:Layui 的组件通常自带事件监听机制,例如 `laydate` 提供了 `done` 和 `change` 等回调函数。如果只需要监听日期选择完成后的事件,可以直接使用这些回调函数。 ```javascript laydate.render({ elem: '#createTime', type: 'date', format: 'yyyy-MM-dd', range: true, done: function(value, date, endDate) { console.log('用户选择了日期:', value, date, endDate); }, change: function(value, date, endDate) { console.log('日期值发生变化:', value, date, endDate); } }); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值