最近项目从 Angular8 升级到了 Angular9,发现升级之后在 IE 里面不能打开日期d框了。
原因:经过一系列的调试 *** 作之后终于发现,Angular9 的 script 标签都使用了 defer,在 laydatejs 加载的时候他们并没有加载完毕,所以 laydatejs 中不能获取到当前正在加载的 script 的 src 值。这时候它会去获取最后一个 script 标签的 src 值,好死不死的是我们的主页里面最后一个 script 不是引入的,它没有 src 值,这时候 getPath 函数就返回 undefined 了,导致整个组件不加载。
解决:修改 getPath 方法,将获取 src 改成获取最后一个带 src 的 script 的src 值。
前言
laydatejs是属于Javascript系列的一款日期控件与时间插件,laydatejs支持兼容IE6在内的主流浏览器。laydatejs经过贤心大大的重写之后功能越来越强大,用起来也愈渐灵活了,但是在一个基于angular+ocLazyLoad的项目中出了点问题。
发现问题
laydatejs是通过ocLazyLoad异步加载引入的,结果始终加载不出来laydatecss文件,看了下路径错误,于是扒开代码发现是这样写的:
getPath:function(){ var e=documentscripts, t=e[elength-1], n=tsrc; if(!tgetAttribute("merge")) return nsubstring(0,nlastIndexOf("/")+1) }()
它是需要先获取到laydatejs的路径,然后再加上laydatecss的那一截最终拼接成一个完整的路径。
作者用的获取laydatejs路径的思路是:由于判断路径的js代码一般都直接放在js文件中而不是函数中,所以当加载该js文件时会立即执行其中的语句,而执行此语句时所获取到的js文件数目正好是elength-1,因为页面后面的js文件还没有加载,所以该处的js文件获取的数目并不是页面所有的js文件的数目。这样一来,获取路径就无需再遍历了,而且文件判断也无需文件名,判断更加准确(elength-1永远都是其文件本身)。
但是这种方法有缺陷,直接在html页面中用script标签引入没得问题,如果通过documentwrite("<script src='js'></script")或documentcreateElement("script")动态加载亦或者异步加载等得到的路径却是最后一个js文件的路径,而非当前j文件的路径。
于是想起了documentcurrentScript ,一步就能到位,但是存在一定的兼容性问题。
var curSrc = documentcurrentScriptsrc; return curSrcsubstring(0,curSrclastIndexOf("/")+1);
最终还是使用了下面这种简单粗暴的方法:
getPath:function(){ var e=documentscripts, n; for(var i=elength;i>0;i--){ if(e[i-1]srcindexOf("laydatejs")>-1){ n=e[i-1]srcsubstring(0,e[i-1]srclastIndexOf("/")+1); } } return n; }()
这种方法的思路很清晰,根据文件名获取引用的文件的src属性并进行判断截取即可。但这种办法有以下两个缺点:
1、需要遍历页面的所有js文件,有时可能效率会比较低。(我页面的js文件没几个,哈哈)
2、如果页面中出现目录不同的重名的js文件则可能判断错误。
使用实例:
<span style="font-size:18px;"><!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>layDate 调用实例</title>
<script src="laydate/laydatejs"></script>
<style>
html{background-color:#E3E3E3; font-size:14px; color:#000; font-family:'微软雅黑'}
h2{line-height:30px; font-size:20px;}
a,a:hover{ text-decoration:none;}
pre{font-family:'微软雅黑'}
box{width:970px; padding:10px 20px; background-color:#fff; margin:10px auto;}
box a{padding-right:20px;}
</style>
</head>
<body>
<div style="width:970px; margin:10px auto;">
演示一:<input placeholder="请输入日期" class="laydate-icon" onclick="laydate()">
</div>
<div class="box">
<pre>
<strong>注意事项</strong>
一、请千万勿移动laydate中的目录结构,它们具有完整的依赖体系。使用时,只需引入laydate/laydatejs即可。
二、如果您的网站的js采用合并或模块加载,您需要打开laydatejs,修改path。
三、laydate遵循LGPL开源协议,永不收费!
四、版权最终解释权:贤心。
</pre>
演示二:<input class="laydate-icon" id="demo" value="2014-6-25更新">
</br>
演示三:
<input class="laydate-icon" onclick="laydate()"></br>
这是是一个最简单的调用方式,它会把自身作为目标元素。除此之外,您还可以按照需求传入一些其它key,比如:</br>
演示四:
<input class="laydate-icon" onclick="laydate({istime: true, format: 'YYYY-MM-DD hh:mm:ss'})"></br>
那么对于输入框,如果用户乱填怎么办?没关系,laydate会智能纠错,你可以尝试在上述表单输入任意值,然后点击页面其它处测试一下。</br>
当然,您其实还可以设定任何html元素作为目标对象,又比如:<div onclick="laydate()"></div></br>
注意事项</br>
解压后,将laydate整个文件放至您项目的任意目录,不要移动其文件结构,它们具有完整的依赖体系。</br>
使用只需在页面引入laydatejs即可。</br>
如果您的网站的js采用合并或模块加载,您需要打开laydatejs,修改path。</br>
用于实际项目时请保留来源,勿剔除laydatejs头部注释。</br>
</br>
选择理由</br>
layDate除了包含日期范围限制、开始日期设定、自定义日期格式、时间戳转换、当天的前后若干天返回、</br>时分秒选择、智能响应、自动纠错、节日识别,快捷键 *** 作等常规功能外,还拥有更多趋近完美的解决方案。
</br>
科学的接口设计1</br>
她并不提倡API的数量性,而是尽可能呈现最人性合理的接口,减少使用成本。</br>
一流的代码驱动2</br>
layDate完全用原生JavaScript实现,代码采用自由灵活风格,内部封装了众多轻量级的方法引擎,保证了良好的速度体验和接近于零的代码冗余</br>
人性的皮肤体系3</br>
她非常注重外观设计,因此她提供了非常强大的皮肤选择支持,不仅官方会提供海量的皮肤下载,</br>您还可以很方便地按照喜好去自定义皮肤,我们非常欢迎您能够贡献皮肤包,具体 *** 作事宜请查看皮肤库页面。</br>
</br>
功能演示</br>
外部js调用:</br>
外部js调用</br>
<input id="hello" class="laydate-icon">
<script>
laydate({
elem: '#hello', //目标元素。由于laydatejs封装了一个轻量级的选择器引擎,因此elem还允许你传入class、tag但必须按照这种方式 '#id class'
event: 'focus' //响应事件。如果没有传入event,则按照默认的click
});
</script>
</br>
图标触发日期:</br>
图标触发日期</br>
<input id="hello1">
<span class="laydate-icon" onclick="laydate({elem: '#hello1'});"></span>
</br>
自定义日期格式:</br>
自定义日期格式</br>
<div id="test1" class="laydate-icon"></div>
<script>
laydate({
elem: '#test1',
format: 'YYYY/MM', // 分隔符可以任意定义,该例子表示只显示年月
festival: true, //显示节日
choose: function(datas){ //选择日期完毕的回调
alert('得到:'+datas);
}
});
</script></br>
日期范围限定在昨天到明天:</br>
日期范围限定在昨天到明天</br>
<div id="hello3" class="laydate-icon"></div>
<script>
laydate({
elem: '#hello3',
min: laydatenow(-1), //-1代表昨天,-2代表前天,以此类推
max: laydatenow(+1) //+1代表明天,+2代表后天,以此类推
});
</script>
</br>
日期范围限制: 开始日: 结束日:</br>
开始日:<li class="laydate-icon" id="start" style="width:200px; margin-right:10px;"></li></br>
结束日:<li class="laydate-icon" id="end" style="width:200px;"></li>
<script>
var start = {
elem: '#start',
format: 'YYYY/MM/DD hh:mm:ss',
min: laydatenow(), //设定最小日期为当前日期
max: '2099-06-16 23:59:59', //最大日期
istime: true,
istoday: false,
choose: function(datas){
endmin = datas; //开始日选好后,重置结束日的最小日期
endstart = datas //将结束日的初始值设定为开始日
}
};
var end = {
elem: '#end',
format: '>
在网上找的用着还可以,设置一下value的值就可以了
// 监听全选
layuiuse(['laydate', 'form'], function () {
var laydate = layuilaydate;
var form = layuiform;
//开始日期
var start = laydaterender({
eventElem: '#start_date_icon',//日期输入框的图标,给图标也绑定点击事件
trigger: 'click',
value: getRecentDay(-30),//默认值30天前
done:function(value,date){
if(value && (value>$("#jssj")val())){
/开始时间大于结束时间时,清空结束时间/
$("#jssj")val("");
}
endconfigmin ={
year:dateyear,
month:datemonth-1,
date: datedate,
};
},
elem: '#kssj'
});
//结束日期
var end = laydaterender({
elem: '#jssj',
eventElem: '#end_date_icon',//日期输入框的图标,给图标也绑定点击事件
trigger: 'click',
value: getRecentDay(0),//默认值昨天
done:function(value,date){
startconfigmax={
year:dateyear,
month:datemonth-1,
date: datedate,
}
}
});
/获取近N天/
function getRecentDay(day){
var today = new Date();
var targetday_milliseconds=todaygetTime() + 1000606024day;
todaysetTime(targetday_milliseconds);
var tYear = todaygetFullYear();
var tMonth = todaygetMonth();
var tDate = todaygetDate();
tMonth = doHandleMonth(tMonth + 1);
tDate = doHandleMonth(tDate);
return tYear+"-"+tMonth+"-"+tDate;
}
function doHandleMonth(month){
var m = month;
if(monthtoString()length == 1){
m = "0" + month;
}
return m;
}
});
以上就是关于laydate.render在ie中不生效全部的内容,包括:laydate.render在ie中不生效、laydate.js,在选择分后才会触发choose事件,现在选择日就会触发choose、laydate-icon-molv 怎么设置初始值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)