关于laydate.js加载laydate.css路径错误问题解决


Posted in Javascript onDecember 27, 2017

前言

laydate.js是属于Javascript系列的一款日期控件与时间插件,laydate.js支持兼容IE6在内的主流浏览器。laydate.js经过贤心大大的重写之后功能越来越强大,用起来也愈渐灵活了,但是在一个基于angular+ocLazyLoad的项目中出了点问题。

发现问题

laydate.js是通过ocLazyLoad异步加载引入的,结果始终加载不出来laydate.css文件,看了下路径错误,于是扒开代码发现是这样写的:

getPath:function(){
 var e=document.scripts,
 t=e[e.length-1],
 n=t.src;
 if(!t.getAttribute("merge"))
 return n.substring(0,n.lastIndexOf("/")+1)
}()

它是需要先获取到laydate.js的路径,然后再加上laydate.css的那一截最终拼接成一个完整的路径。

作者用的获取laydate.js路径的思路是:由于判断路径的js代码一般都直接放在js文件中而不是函数中,所以当加载该js文件时会立即执行其中的语句,而执行此语句时所获取到的js文件数目正好是e.length-1,因为页面后面的js文件还没有加载,所以该处的js文件获取的数目并不是页面所有的js文件的数目。这样一来,获取路径就无需再遍历了,而且文件判断也无需文件名,判断更加准确(e.length-1永远都是其文件本身)。

但是这种方法有缺陷,直接在html页面中用script标签引入没得问题,如果通过document.write("<script src='*.js'></script")document.createElement("script")动态加载亦或者异步加载等得到的路径却是最后一个js文件的路径,而非当前j文件的路径。

于是想起了document.currentScript ,一步就能到位,但是存在一定的兼容性问题。

var curSrc = document.currentScript.src;
return curSrc.substring(0,curSrc.lastIndexOf("/")+1);

最终还是使用了下面这种简单粗暴的方法:

getPath:function(){
 var e=document.scripts, n;
 for(var i=e.length;i>0;i--){
 if(e[i-1].src.indexOf("laydate.js")>-1){
 n=e[i-1].src.substring(0,e[i-1].src.lastIndexOf("/")+1);
 }
 }
 return n;
}()

这种方法的思路很清晰,根据文件名获取引用的文件的src属性并进行判断截取即可。但这种办法有以下两个缺点:

1、需要遍历页面的所有js文件,有时可能效率会比较低。(我页面的js文件没几个,哈哈)

2、如果页面中出现目录不同的重名的js文件则可能判断错误。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
有关于JS构造函数的重载和工厂方法
Apr 07 Javascript
在表单提交前进行验证的几种方式整理
Jul 31 Javascript
ParseInt函数参数设置介绍
Jan 02 Javascript
js的toLowerCase方法用法实例
Jan 27 Javascript
浅谈javascript事件取消和阻止冒泡
May 26 Javascript
js获取鼠标位置实例详解
Dec 09 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
js实现文字列表无缝滚动效果
Jun 23 Javascript
Vue中的methods、watch、computed的区别
Nov 26 Javascript
JS中的算法与数据结构之集合(Set)实例详解
Aug 20 Javascript
Layui 导航默认展开和菜单栏选中高亮设置的方法
Sep 04 Javascript
javascript实现滚动条效果
Mar 24 Javascript
javascript连接mysql与php通过odbc连接任意数据库的实例
Dec 27 #Javascript
node.js用fs.rename强制重命名或移动文件夹的方法
Dec 27 #Javascript
使用命令行工具npm新创建一个vue项目的方法
Dec 27 #Javascript
Node.js调用fs.renameSync报错(Error: EXDEV, cross-device link not permitted)
Dec 27 #Javascript
VSCode 配置React Native开发环境的方法
Dec 27 #Javascript
VSCode配置react开发环境的步骤
Dec 27 #Javascript
在vue项目中安装使用Mint-UI的方法
Dec 27 #Javascript
You might like
经典的星际争霸,满是回忆的BGM
2020/04/09 星际争霸
php购物网站支付paypal使用方法
2010/11/28 PHP
PHP缓存技术的多种方法小结
2012/08/14 PHP
php编译安装php-amq扩展简明教程
2016/06/25 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
js资料prototype 属性
2007/03/13 Javascript
javascript prototype 原型链
2009/03/12 Javascript
js几个验证函数代码
2010/03/25 Javascript
php对mongodb的扩展(小试牛刀)
2012/11/11 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
JavaScript实现的文本框placeholder提示文字功能示例
2018/07/25 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
使用vuex存储用户信息到localStorage的实例
2019/11/11 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
python多线程http下载实现示例
2013/12/30 Python
Python中单、双下划线的区别总结
2017/12/01 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
python2.7实现复制大量文件及文件夹资料
2019/08/31 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
PyQt5实现登录页面
2020/05/30 Python
keras和tensorflow使用fit_generator 批次训练操作
2020/07/03 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
SQL Server面试题
2016/10/17 面试题
销售人员获奖感言
2014/02/05 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
物理学专业自荐信
2014/06/11 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
中小学校园安全广播稿
2014/09/29 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL