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可能大小发生…

python正则计算器写法、用正则来匹配

1.# a 1-2*((60-30(-40/5)*(9-2*5/37/3*99/4*299810*568/14))-(-4*3)/(16-3*2)) 利用正则计算不用eval exec 思路&#xff1a; (1)先把内层的小括号匹配出来,从里向外,(2)然后计算小括号里面乘除的值,然后计算加减的值(3)把计算好的结果进行替换,[字符串的替换]""&q…

网页 添加QQ/MSN/旺旺 在线聊天代码

很多时候我们都喜欢在博客里加上自己的IM联系方式&#xff0c;如QQ&#xff1a;xxxxx之类的&#xff0c;为了方便别人与我们聊天和知道我们是否在线&#xff0c;添加在线图标就是一个不错的创意&#xff0c;当你在线时&#xff0c;你网页上的IM图标将是亮着的&#xff0c;非常方…

如何写一个作用域安全的构造函数

基础部分 构造函数本质上就是一个使用new操作符调用的函数&#xff0c;使用new调用时&#xff0c;构造函数内用到的this对象会指向新创建的对象实例&#xff1a; function Girlfriend(name, age, height) {this.name name;this.age age;this.height height; }// 使用new操…

使用Java 8 Lambda清理JUnit Throwable-Tests

最近&#xff0c;我参与了一个关于twitter和google 的简短在线讨论&#xff0c;其中涉及一个问题&#xff0c;即Java 8 Lambda表达式的到来为什么使catch-exception库 1过时了。 这是由简短的声明触发的&#xff0c;该声明将不再维护该库&#xff0c;因为lambda将使其变得多余。…

封装 axios 请求

vue 封装 js 方法 一、安装 axios 并引入&#xff1a; Axios 中文说明 安装axios&#xff1a;npm install axios因为基本上全局都会使用到 axios 方法&#xff0c;所以在 main.js 中引入&#xff1a; import axios from axios; Vue.prototype.$axios axios //全局注册&…

Response.Redirect 编码的问题

UTF-8 传递到 gb2312 HttpUtility.UrlEncode("要传递的字符参数",Encoding.GetEncoding("GB2312"))转载于:https://www.cnblogs.com/JensonBin/archive/2010/11/27/1889726.html

P1553 数字反转(升级版)

P1553 数字反转&#xff08;升级版&#xff09; 温馨提示 1.在处理小数的时候注意处理末尾的0&#xff0c;反转后末尾不得有多余的0 &#xff08;判断的时候 s[ i ] ! 0 判断的是字符&#xff09; 2.处理小数和分数的时候&#xff0c;要符号前后分别输出&#xff0c; flag标…

http协议以及防盗链技术

http协议&#xff0c;又称为超文本传输协议&#xff0c;顾名思义&#xff0c;http协议不仅能传输文本&#xff0c;还能传输图片&#xff0c;视频&#xff0c;压缩包等文件&#xff0c;http协议是建立在tcp/ip协议的基础之上的&#xff0c;http协议对php程序员来讲可以说是重中之…

移动端 flexible.js 布局详解

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

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

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

DotnetCharting控件的破解方法

在.net使用DotNetCharting控件生成报表统计图总结 文章中&#xff0c;不少博友提出“1.生成的图片带超链接导向官网,如何处理呀&#xff1f;2.我使用这个控件后&#xff0c;图形可以显示出来。但是发现一个小问题。就是在图形的左上方和图形的下面都隐含了超链接&#xff0c;鼠…

Android开发利器之ActivityTracker

版权声明&#xff1a;本文为xing_star原创文章&#xff0c;转载请注明出处&#xff01; 本文同步自http://javaexception.com/archives/113 Android开发利器之ActivityTracker 今天在群里面划水&#xff0c;有个小伙伴问到一个问题&#xff0c;”刚进公司 清单文件的activity 较…

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…

避免许多if块进行验证检查

在某些情况下&#xff0c;我们需要先验证输入数据&#xff0c;然后再将其发送到业务逻辑层进行处理&#xff0c;计算等。这种验证在大多数情况下是孤立完成的&#xff0c;或者可能包括与外部数据或其他输入的某些交叉检查。 看下面的示例&#xff0c;该示例验证用户输入的注册数…

谷歌逐步取消对IE6的支持

1月30日&#xff0c;据国外媒体报道&#xff0c;谷歌周五宣布&#xff0c;截至3月1日&#xff0c;谷歌将不再其谷歌Docs和谷歌网站服务支持IE6。如果IE用户想使用那些产品&#xff0c;他们必须至少升级到版本7&#xff0c;如同“其他许多公司已经停止支持如Internet Explorer 6…

国内手机号正则表达式

java的写法&#xff1a; String pattern "^((1[358][0-9])|(14[57])|(17[0678])|(19[7]))\\d{8}$"; javascript的写法&#xff1a; var pattern /^((1[358][0-9])|(14[57])|(17[0678])|(19[7]))\d{8}$/; 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.co…