layui 时间控件二次渲染,点击一个自定义按钮清空/重置时间控件

标题小标题
一、错误尝试
二、时间控件二次渲染的3种方法2.1 直接删除原来绑定时间控件的DOM,再重新渲染(推荐);
2.2 使用 clone() ,并且改变 lay-key
2.3 使用 clone() ,并且删除 lay-key(推荐)
三、通过一个按钮清空时间限制不通过二次渲染清空时间控件的时间限制
四、清空 range:true 的日期范围控件开始时间和结束时间用的一个输入框的日期范围控件
五、使用 laydate 需要注意的地方总结

第一次使用 Layui,太多坑需要注意了!这里总结一下,并且找到了4种清空重置时间控件的方法。
在这里插入图片描述

一、错误尝试

这个地方我把 layDate 作为独立组件使用的,自己给了一个按钮想让时间控件清空重置,想当然的在重置方法里重新渲染时间控件,输入框的数据被清空了,但是时间控件的时间限制没有被清掉。

<div class="timeOrange">          <p>选择时间范围</p><div class="timeOrange-input">            <input type="text" class="ind2 cloneStart" id="startTime" placeholder="开始时间" autocomplete="off" readonly><span> - </span><input type="text" class="ind2 cloneEnd" id="endTime" placeholder="结束时间" autocomplete="off" readonly></div>
</div>
<script>
function loadTime() {  //记住 loadTime() 这个函数,后面会用到,就不再重写了var startT = laydate.render({elem: '#startTime', //指定元素type: 'time',format:'HH:mm',max: '23:59:59',done: function(value, date){endT.config.min = {year: date.year,month: date.month -1,date: date.date,hours: date.hours,minutes: date.minutes,seconds: 0}}});var endT = laydate.render({elem:'#endTime',type: "time",format:'HH:mm',done: function(value, date){startT.config.max = {year: date.year,month: date.month -1,date: date.date,hours: date.hours,minutes: date.minutes,seconds: 0}}});
}
loadTime();//重置操作
$("button:first").click(function(){$("#startTime").val("");  //清空开始时间输入框$("#endTime").val("");    //清空结束时间输入框//或者通过each循环选到所有input//$("input").each(function(){//  $(this).val(""); //使所有输入框的值为空//});loadTime();  //再次渲染日期与时间控件
})
</script>

网上查资料知道:laydate.render() 只是在第一次渲染起作用,不能重新渲染。要想重新渲染,需要删除元素再重新插入这个元素。



二、时间控件二次渲染的三种方法

2.1 直接删除原来绑定时间控件的DOM,再重新渲染

//重置操作
$("button:first").click(function(){$("#startTime").remove(); //删除开始时间的input元素$("#endTime").remove();   //删除结束时间的input元素$(".timeOrange-input span").before('<input type="text" class="ind2 cloneStart" id="startTime" placeholder="开始时间" autocomplete="off" readonly>'); $(".timeOrange-input span").after('<input type="text" class="ind2 cloneEnd" id="endTime" placeholder="结束时间" autocomplete="off" readonly>');loadTime();  //再次渲染日期与时间控件
})

这种方法是最直观有效的,我个人不想要这种直接插入一个完整DOM元素的写法;


2.2 使用 clone() ,并且改变 lay-key

jQuery中有一个 clone() 的方法,它可以用来克隆元素,给这个方法添加参数 true,就可以克隆该元素身上的方法,即clone(true)

1. 直接克隆元素
直接删除原来的元素,再插入 clone(true) 后的时间控件的元素和方法,然后重新渲染,重置后再点击输入框,时间控件不会再弹出来。

//重置操作
$("button:first").click(function(){$("#startTime").val("");  //清空开始时间输入框$("#endTime").val("");    //清空结束时间输入框var cloneStartTime = $(".cloneStart").clone(true);  //由于id的唯一性,最好克隆class名称var cloneEndTime = $(".cloneEnd").clone(true);$("#startTime").remove(); //删除开始时间的input元素$("#endTime").remove();   //删除结束时间的input元素$(".timeOrange-input span").before(cloneStartTime); //插入克隆元素$(".timeOrange-input span").after(cloneEndTime);loadTime();  //再次渲染日期与时间控件
})

在这里插入图片描述

2. 只改写 lay-key
经过一番查阅,在博主 落枫_rain 的博客上看到 lay-index 这个属性,他说了一下个人理解:“laydate渲染后所附带的 lay-index 会被载入缓存,所以再次渲染时,不会重新去渲染。所以修改 lay-index 标识的值,让它在渲染器眼里变成一个新的组件,即可去重新渲染它”。

因此我打开控制台,发现 laydate 给每个绑定时间控件的元素加了一个 lay-key的属性和属性值。
在这里插入图片描述
根据他的提示以及代码,我只改变 lay-key 的值,点击按钮后时间控件可以被弹出来,但是时间限制还是没有被清空掉。

//重置操作
$("button:first").click(function(){$("#startTime").val("");  //清空开始时间输入框$("#endTime").val("");    //清空结束时间输入框var startKey = parseInt($("#startTime").attr("lay-key")) + 2; //这里的值加多少主要看你有几个时间控件var endKey = parseInt($("#endTime").attr("lay-key")) + 2;$("#startTime").attr("lay-key", startKey); //改写绑定时间控件的元素中 lay-key 的值$("#endTime").attr("lay-key", endKey);loadTime();  //再次渲染日期与时间控件
})

在这里插入图片描述

3. 最终写法
于是结合了二者,发现达到了重置效果。

//重置操作
$("button:first").click(function(){$("#startTime").val("");  //清空开始时间输入框$("#endTime").val("");    //清空结束时间输入框var startKey = parseInt($("#startTime").attr("lay-key")) + 2; //这里的值加多少主要看你有几个时间控件var endKey = parseInt($("#endTime").attr("lay-key")) + 2;var cloneStartTime = $(".cloneStart").clone();  //因为要重新渲染,所有可以不用加truevar cloneEndTime = $(".cloneEnd").clone();cloneStartTime.attr("lay-key", startKey); //注意这里要给克隆的元素添加cloneEndTime.attr("lay-key", endKey);$("#startTime").remove(); //删除原本的input元素$("#endTime").remove(); $(".timeOrange-input span").before(cloneStartTime); //插入克隆元素$(".timeOrange-input span").after(cloneEndTime);loadTime();  //再次渲染日期与时间控件
})

2.3 使用 clone() ,并且删除 lay-key

第二种方法,可行,但是代码量较多,还不如第一种,于是又去找了找其他资料信息,主要参考了 https://www.freesion.com/article/87466321/,这里提出了删除克隆元素中的 lay-key 的方法。

//重置操作
$("button:first").click(function(){$("#startTime").val("");  //清空开始时间输入框$("#endTime").val("");    //清空结束时间输入框var cloneStartTime = $(".cloneStart").clone();  //由于id的唯一性,最好克隆class名称var cloneEndTime = $(".cloneEnd").clone();cloneStartTime.removeAttr("lay-key"); //注意这里要给克隆的元素添加cloneEndTime.removeAttr("lay-key");$("#startTime").remove(); //删除原本的input元素$("#endTime").remove(); $(".timeOrange-input span").before(cloneStartTime); //插入克隆元素$(".timeOrange-input span").after(cloneEndTime);loadTime();  //再次渲染日期与时间控件
})

在 2.2 中我们可以知道:laydate 给每个绑定时间控件的元素加了一个 lay-key属性和属性值。所以这里删除 lay-key,再渲染时间控件时,laydate 会给时间控件重新绑定一个 lay-key属性和属性值。

其实这一点 在 2.1 中就有体现:
① 首次渲染时,laydate 给 input#startTimeinput#endTime 添加了lay-key属性和属性值;
② 点击重置按钮后,当我们删除 input#startTimeinput#endTime 这两个DOM 元素时,就连同它们上面的lay-key 和它的值也被删除了;
③ 然后我们再通过 before()after() 插入元素 <input type="text" class="ind2 cloneStart" id="startTime" ...>,可以观察到,我们在插入元素时并没有给这个元素添加 lay-key 属性。
④ 最后 使用 loadTime() 再次渲染时间控件,渲染后给绑定的元素身上又添加了一个 lay-key属性和属性值。



三、通过一个按钮清空时间限制

除了上面3种强制重置时间控件,并且二次渲染的写法外,如果只是想清空时间限制,可以采用下面的这种写法,这里是根据 十七gril 的博客得到的启发。

var startT = laydate.render({  //把渲染元素var一下保存起来elem: '#startTime', //指定元素type: 'time',format:'HH:mm',max: '23:59:59',done: function(value, date){ endT.config.min = {year: date.year,month: date.month -1,date: date.date,hours: date.hours,minutes: date.minutes,seconds: 0}}
});var endT = laydate.render({elem:'#endTime',type: "time",format:'HH:mm',done: function(value, date){startT.config.max = {   //注意开始时间是maxyear: date.year,month: date.month -1,date: date.date,hours: date.hours,minutes: date.minutes,seconds: 0}}
});
}
//重置操作
$("button:first").click(function(){$("#startTime").val("");  //清空开始时间输入框$("#endTime").val("");    //清空结束时间输入框  var d= new Date();startT.config.max = {     //注意开始时间是maxyear: d.getFullYear(),  //获取当前的年month: d.getMonth(),    //获取当前的月date: d.getDate,hours: 23,     //开始时间最大小时位:23minutes: 59,seconds: 59}endT.config.min = {year: d.getFullYear(),month: d.getMonth(),date: d.getDate,hours: 0,minutes: 0,seconds: 0}
})


四、清空 range:true 的日期范围控件

有了上面的方法,清空日期范围控件就很简单了。

<div class="layui-input-inline date-input"><input type="text" name="date" id="date" autocomplete="off" class="layui-input date-icon" placeholder="请选择时间范围">
</div>
// 日期范围 初次渲染
laydate.render({elem: '#date',range: true,value: '',done: function(value, date, endDate){console.log(value,date,endDate);}
});//点击按钮清空日期范围控件
$(".searchBtn").on('click', function(){clearDate();
})//清空date日期范围控件
function clearDate(){ //删除原本的input元素,清除日期控件的缓存,再到DOM中插入日期控件并渲染$("#date").remove(); //删除开始时间的input元素$(".date-input").append('<input type="text" name="date" id="date" autocomplete="off" class="layui-input date-icon" placeholder="请选择时间范围">')//再次渲染日期时间范围laydate.render({elem: '#date',range: true,done: function(value, date, endDate){console.log(value,date,endDate);}});
}


五、使用 laydate 过程中需要注意的地方

这里在 layui清空时间控件后无法使用的解决方法 上补充几点:

5.1 laydate.render 无法重复渲染

laydate.render 对应一个elem已经渲染过一次之后,我们是无法通过再次渲染来修改其中的 max值min值 的。


5.2 startT.config.maxendT.config.min 是一个对象,不是一个字符串

不同于我们渲染时直接写时间限制的 min: "00:00:00"max:"23:59:59"startT.config.max 是一个对象,直接 startT.config.max = "2019-02-16" 这样赋值是没有效果的。

当我们不清楚一个变量值时,可以把它打印出来:

var startT = laydate.render({elem: '#startTime', //指定元素type: 'time',format:'HH:mm',max: '23:59:59',done: function(value, date){console.log("选择时间后的date",date)console.log("选择时间后的startT.config.max",startT.config.max)}}
});
console.log("首次打印startT.config",startT.config);

在这里插入图片描述
现在是2021.2.8,可以清楚的看到,startT.config.maxstartT.config.min 中的maxmin都属于 startT.config 的属性,它们的值是一个对象。

有一点比较懵,我直接 console.log("首次打印startT.config.max",startT.config.max); 刷新时会在字符串和对象之前转换。如果设置了 max: "23:50:56",字符串就是设置的值,若没有设置,字符串就是max 的默认值。
在这里插入图片描述


5.3 done回调函数中的参数 date 的格式与 startT.config.min 格式相同,但是直接让 startT.config.min=date 可能会出问题

虽然 date 中的数据是你选择的日期,但是 startT.config.min 中设置的 month 的值比你输入的month 的要值大了一个月。

从4.2 中的截图我们可以看到,现在是 2021.5.8,done 中的 month 为 5,而 startT.config.max 中的 month 为 4,因此当你使用 done 中的参数 date 给 startT.config.max 设置月份时,date.month 需要减一。


5.4 日期与时间控件闪没

https://www.cnblogs.com/wfbky/p/13132687.html
当页面高度不够时(高度不够,指的是 input输入框下面的页面高度 小于 时间控件的高度),时间控件点击以后 会闪没,当退出页面 ,再返回以后,时间控件正常出现;

解决方法:将触发 方法 改为 click

laydate.render({elem: '#date',trigger: 'click'
});

效果:无论是否 高度足够,均可以出现 控件 ,当高度不够时,会遮挡 input输入框。

laydate插件之坑——渲染问题【删除再渲染】
LAYUI前框框架laydate日期组件重新渲染【lay-key的问题】
layui清空时间控件后无法使用的解决方法【3个坑】
关于layui踩过的坑

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年春第二次课程设计实验报告

一、试验项目名 贪吃蛇 二、试验功能介绍 通过数组构造小蛇&#xff0c;在通过数组中的变化控制小蛇移动和变长。 三、项目模块结构介绍 构造小蛇 小蛇移动 移动中碰到边框或自己失败 小蛇长大 四、实现界面展示 五、代码托管链接https://gitee.com/t001023/software_class_1_t…

Elasticsearch用例:全文搜索

在本系列有关Elasticsearch用例的最后一篇文章中&#xff0c;我们介绍了Elasticsearch提供的用于存储甚至大量文档的功能 。 在这篇文章中&#xff0c;我们将研究其另一个核心功能&#xff1a;搜索。 我正在利用上一篇文章中的某些信息&#xff0c;因此&#xff0c;如果您还没有…

使用echarts时,鼠标首次移入屏幕会闪动,屏幕会出现滚动条

当我刷新&#xff0c;鼠标经过图表时&#xff0c;页面会出现滚动条 原因&#xff1a; 在echarts图表中出现 tooltip 时&#xff0c;画布的父标签&#xff08;即&#xff1a;echarts.init()的标签&#xff09;的宽高有时会发生变化&#xff0c;导致相对布局的div可能大小发生…

移动端 flexible.js 布局详解

原本想直接引入原文链接&#xff0c;但是又担心作者哪天想不开注销账号&#xff0c;这么好的一篇文章看不到了&#xff0c;还是转载一下吧(/ω&#xff3c;)。 另外推荐一篇好文&#xff1a;移动端rem自适应实操讲解 本文讲的通过 flexible.js 实现了rem自适应&#xff0c;有了…

Gradle善良:获得更多的依赖性见解

在我们的大多数项目中&#xff0c;我们都依赖于其他代码&#xff0c;例如库或其他项目。 Gradle有一个不错的DSL来定义依赖关系。 依赖性在依赖性配置中分组。 这些配置可以自己创建&#xff0c;也可以通过插件添加。 一旦定义了依赖项&#xff0c;我们就可以通过dependencies任…

js css模仿打字效果

1.效果 2.源码 <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><style type"text/css">#myDiv{display: inline-block;width:500px;height:300px;background-color:rgba(0,0,0,0.3);colo…

iframe 高度根据子页面来确定

标题描述一、解决方法解决代码二、关于高度问题简单讲一下jquery中的 height()&#xff0c;innerHeight()、outHeight()&#xff0c;js中的offsetHeight、clientHeight、scrollHeight。如何获取没有给出高度的元素的高度&#xff1f;详细介绍offsetHeight,clientHeight,scrollH…

layui 子页面写弹出框覆盖父页面,以及给弹框中的表单赋值

咋说呢&#xff0c;因为对 layui 不太熟悉&#xff0c;这个弹出框搞了好久&#xff0c;看了好多解决方案&#xff0c;大致尝试了一下其中几种&#xff0c;在坑中无法自拔。。。总之终于搞出来了&#xff0c;在这里分享一下我的笔记。 着急的直接 戳这里 看解决代码。 尝试 1、…

html实现文字垂直居中且设置间隔

使用table和table-call布局 将表格作为一个table表&#xff0c;使用table-cell定义每个单元格的布局为table-cell, 抛出display的有效值 单元格中间的间隔使用 border-spacing:10px; border-collapse: separate;定义单元格vertical-align: middle; display: table-cell;代码源码…

Hibernate隐藏的宝石:pooled-lo优化器

介绍 在这篇文章中&#xff0c;我们将揭示一个序列标识符生成器&#xff0c;​​它结合了标识符分配效率和与其他外部系统的互操作性&#xff08;同时访问底层数据库系统&#xff09;。 传统上&#xff0c;有两种序列标识符策略可供选择。 序列标识符&#xff0c;对于每个新值…

vue inheritAttrs、$attrs和$listeners使用

inheritAttrs、$attrs和$listeners使用场景&#xff1a; 组件传值&#xff0c;尤其是祖孙组件有跨度的传值。 &#xff08;1&#xff09;inheritAttrs 属性说明&#xff1a;https://cn.vuejs.org/v2/api/#inheritAttrs 说明比较晦涩。 组件传值一般是通过props传值的。inhe…

仍不切换到Java 8的6个理由

Java 8很棒。 期。 但是……在我们有机会玩耍并玩弄它之后&#xff0c;就该退出了&#xff0c;避免吃盐。 所有的好东西都是有代价的&#xff0c;在这篇文章中&#xff0c;我将分享Java 8的主要痛点。请确保在升级和放弃7之前您已经意识到了这些痛点。 1.并行流实际上会使您减…

鼠标滚轮切屏效果

某天发现一个网站《北京新鸿儒世纪网络技术有限公司》&#xff0c;一开始打开&#xff0c;哇&#xff0c;好简单啊&#xff0c;特别是首页&#xff0c;就一张图&#xff0c;后来发现里面有挺多小细节的&#xff0c;比如&#xff1a;做了媒体响应式、滚轮切屏&#xff08;第一次…

小程序 自定义组件报错[“usingComponents“][“my-list“] 未找到

根据官网案例写了一个自定义组件&#xff0c;引入时总是报这个错误。 后面在社区里面找到了解决办法&#xff0c;把上面配置中改成&#xff1a;"my-list": "/components/my-list/my-list" 就可以了。 具体原因&#xff1a;官方文档上的自定义组件是 4 个文…

http 请求报文和响应报文

1、请求报文 示例&#xff1a; 2、响应报文 示例&#xff1a; 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

小程序 封装table组件

实在是懒得自己封装了&#xff0c;就在网上找了一下别人封装好的&#xff0c;这里主要参考的是 灰信网上的一篇文章&#xff0c;我在他的基础上改了一下样式&#xff0c;动态生成列表每一列列宽。 表格可左右横向滑动 一、子页面 table.wxml <scroll-view class"ta…

服务器--停止启动服务,查看日志文件

停止启动服务 ./shutdown.sh 停止掉当前服务 ./startup.sh 启动当前服务 例如&#xff1a; Tomcat服务器&#xff1a;在apache-tomcat-7.0.82/bin 目录下&#xff0c;sh shutdown.sh 停止掉当前服务&#xff0c;sh startup.sh 启动当前服务 查看日志文件&#xff1a; Tomcat查看…

linq 解决winForm中控件CheckedListBox操作的问题。(转载)

1.获取CheckedListBox选中项的文本的字符串&#xff0c;并用分隔符连接。系统没有提供相应的属性&#xff0c;方法。 这里我们利用3.0的特性给其来个扩展方法,如下&#xff1a; public static stringGetCheckedItemsText(thisCheckedListBox box) { stringre…

Glass Fish 4.0.1中的Jersey SSE功能

Glass Fish为各种Java EE规范捆绑了不同的参考实现&#xff0c;例如&#xff0c;CDI的Weld&#xff0c;JSF的Mojarra&#xff0c;WebSocket的Tyrus&#xff0c;JAX-RS的Jersey。 Glass Fish 4.0.1即将发布&#xff0c;并计划涵盖许多组件/模块的更新&#xff0c;这些组件/模块当…

canvas1:简单介绍、开始使用、画直线+虚线

目录 一、简单介绍 二、开始使用 三、画直线、虚线 3.1 画直线 1. 画直线的步骤&#xff1a; 2. 设置直线的样式 3. 绘制多条直线 3.2 画虚线 四、整理使用到的方法&#xff1a; 参考了廖雪峰老师的笔记。 一、简单介绍 Canvas是 HTML5新增的组件&#xff0c;它就像…