极力推荐10个短小实用的JavaScript代码段


Posted in Javascript onAugust 03, 2016

JavaScript正变得越来越流行,它已经成为前端开发的第一选择,并且利用基于JavaScript语言的NodeJS,我们也可以开发出高性能的后端服务,甚至我还看到在硬件编程领域也出现了JavaScript的身影。JavaScript正在逐渐进化为一门全能的开发语言。 

但用好JavaScript并不容易,你除了需要掌握它的语法并知道如何写出高质量的代码之外,还需要了解如何解决那些几乎在每个项目中都会遇到的需求场景,比如:判断日期,高亮文本,限制字符数等等,有很多第三方库可以解决这些问题,但这些库可能并非只是为解决这一个问题而创建的,这意味着你需要引入了很多无关的代码,这将使你的整个系统变得臃肿,而且也会影响到系统的性能。我的做法是,收集和使用那些常见的JavaScript代码段,并在需要时,尽可能首先使用它们。下面便是我收集的10段实用JavaScript代码,基于它们你还可以创造出更强大的JS插件或功能函数。

1. 判断日期是否有效
 
JavaScript中自带的日期函数还是太过简单,很难满足真实项目中对不同日期格式进行解析和判断的需要。JQuery也有一些第三方库来使日期相关的处理变得简单,但有时你可能只需要一个非常简单的函数,而不想引入一个庞大的第三方库。这时,你可以使用下面这段日期校验代码,它允许你自定义日期格式并进行日期有效性的校验。

function isValidDate(value, userFormat) {

 // Set default format if format is not provided
 userFormat = userFormat || 'mm/dd/yyyy';

 // Find custom delimiter by excluding
 // month, day and year characters
 var delimiter = /[^mdy]/.exec(userFormat)[0];

 // Create an array with month, day and year
 // so we know the format order by index
 var theFormat = userFormat.split(delimiter);

 // Create array from user date
 var theDate = value.split(delimiter);

 function isDate(date, format) {
 var m, d, y, i = 0, len = format.length, f;
 for (i; i < len; i++) {
 f = format[i];
 if (/m/.test(f)) m = date[i];
 if (/d/.test(f)) d = date[i];
 if (/y/.test(f)) y = date[i];
 }
 return (
 m > 0 && m < 13 &&
 y && y.length === 4 &&
 d > 0 &&
 // Check if it's a valid day of the month
 d <= (new Date(y, m, 0)).getDate()
 );
 }

 return isDate(theDate, theFormat);
}

使用方法:
 下面这个调用返回false,因为11月份没有31天
 isValidDate('dd-mm-yyyy', '31/11/2012')

2. 获取一组元素的最大宽度或高度
 下面这个函数,对于需要进行动态排版的开发人员非常有用。

var getMaxHeight = function ($elms) {
 var maxHeight = 0;
 $elms.each(function () {
 // In some cases you may want to use outerHeight() instead
 var height = $(this).height();
 if (height > maxHeight) {
  maxHeight = height;
 }
 });
 return maxHeight;
};

使用方法:
 $(elements).height( getMaxHeight($(elements)) );

3. 高亮文本
 有很多JQuery的第三方库可以实现高亮文本的功能,但我更喜欢用下面这一小段JavaScript代码来实现这个功能,它非常短小,而且可以根据我的需要去进行灵活的修改,而且可以自己定义高亮的样式。下面这两个函数可以帮助你创建自己的文本高亮插件。

function highlight(text, words, tag) {

 // Default tag if no tag is provided
 tag = tag || 'span';

 var i, len = words.length, re;
 for (i = 0; i < len; i++) {
 // Global regex to highlight all matches
 re = new RegExp(words[i], 'g');
 if (re.test(text)) {
  text = text.replace(re, '<'+ tag +' class="highlight">$&</'+ tag +'>');
 }
 }

 return text;
}

你同样会需要取消高亮的函数:

function unhighlight(text, tag) {
 // Default tag if no tag is provided
 tag = tag || 'span';
 var re = new RegExp('(<'+ tag +'.+?>|<\/'+ tag +'>)', 'g');
 return text.replace(re, '');
}

使用方法:

$('p').html( highlight(
 $('p').html(), // the text
 ['foo', 'bar', 'baz', 'hello world'], // list of words or phrases to highlight
 'strong' // custom tag
));

4. 文字动效
 有时你会希望给你的一段文字增加动效,让其中的每个字都动起来。你可以使用下面这段jQuery插件代码来达到这个效果。当然你需要结合一个CSS3 transition样式来达到更好的效果。

$.fn.animateText = function(delay, klass) {

 var text = this.text();
 var letters = text.split('');

 return this.each(function(){
 var $this = $(this);
 $this.html(text.replace(/./g, '<span class="letter">$&</span>'));
 $this.find('span.letter').each(function(i, el){
  setTimeout(function(){ $(el).addClass(klass); }, delay * i);
 });
 });

};

使用方法:
 $('p').animateText(15, 'foo');

5. 逐个隐藏元素
 下面这个jQuery插件可以根据你设置的步长(间隔时间)来逐个隐藏一组元素。在列表元素的重新加载中使用,可以达到很好的效果。

$.fn.fadeAll = function (ops) {
 var o = $.extend({
 delay: 500, // delay between elements
 speed: 500, // animation speed
 ease: 'swing' // other require easing plugin
 }, ops);
 var $el = this;
 for (var i=0, d=0, l=$el.length; i<l; i++, d+=o.delay) {
 $el.eq(i).delay(d).fadeIn(o.speed, o.ease);
 }
 return $el;
}

使用方法:
 $(elements).fadeAll({ delay: 300, speed: 300 });

6. 限制文本字数
 下面这端脚本允许你根据给定的字符长度截取文本,如果文本被截取,那么它的后面会自动带上省略号。

function excerpt(str, nwords) {
 var words = str.split(' ');
 words.splice(nwords, words.length-1);
 return words.join(' ') +
 (words.length !== str.split(' ').length ? '…' : '');
}

7. 判断相应式布局中当前适配度
 目前很多设计已经采用了响应式布局来适配网站或应用在不同设备上的显示。你经常需要在代码中判断当前处于哪一个屏幕适配度下。

function isBreakPoint(bp) {
 // The breakpoints that you set in your css
 var bps = [320, 480, 768, 1024];
 var w = $(window).width();
 var min, max;
 for (var i = 0, l = bps.length; i < l; i++) {
 if (bps[i] === bp) {
  min = bps[i-1] || 0;
  max = bps[i];
  break;
 }
 }
 return w > min && w <= max;
}

使用方法:

if ( isBreakPoint(320) ) {
 // breakpoint at 320 or less
}
if ( isBreakPoint(480) ) {
 // breakpoint between 320 and 480
}
…

8. 全局计数
 在一些游戏或广告场景中,你需要记录用户在当前页面上点击某一个按钮的次数,这时你可以使用jQuery的.data()函数来处理:

$(element)
 .data('counter', 0) // begin counter at zero
 .click(function() {
  var counter = $(this).data('counter'); // get
  $(this).data('counter', counter + 1); // set
  // do something else...
 });

9. 嵌入优酷视频

function embedYouku(link, ops) {

 var o = $.extend({
 width: 480,
 height: 320,
 params: ''
 }, ops);

 var id = /\?v\=(\w+)/.exec(link)[1];

 return '<embed allowFullScreen="true" id="embedid" quality="high" width="'+o.width+'" height="'+o.height+'" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" src="'+id+'?'+o.ops'"';
}

使用方法:

embedYouku(
 'http://static.youku.com/v/swf/qplayer.swf', 
 {'winType=adshow&VideoIDS=XMTE3NzQ0NTky&isAutoPlay=false&isShowRelatedVideo=false'}
);

10. 创建动态菜单或下拉列表
 在很多场景中,我们都需要动态地创建菜单、下拉列表或列表项。下面是一段最基础的代码实现上面的功能,你可以根据实际需要进行相应的扩展。

function makeMenu(items, tags) {

 tags = tags || ['ul', 'li']; // default tags
 var parent = tags[0];
 var child = tags[1];

 var item, value = '';
 for (var i = 0, l = items.length; i < l; i++) {
 item = items[i];
 // Separate item and value if value is present
 if (/:/.test(item)) {
  item = items[i].split(':')[0];
  value = items[i].split(':')[1];
 }
 // Wrap the item in tag
 items[i] = '<'+ child +' '+
  (value && 'value="'+value+'"') +'>'+ // add value if present
  item +'</'+ child +'>';
 }

 return '<'+ parent +'>'+ items.join('') +'</'+ parent +'>';
}

使用方法:

// Dropdown select month
makeMenu(
 ['January:JAN', 'February:FEB', 'March:MAR'], // item:value
 ['select', 'option']
);

// List of groceries
makeMenu(
 ['Carrots', 'Lettuce', 'Tomatos', 'Milk'],
 ['ol', 'li']
);

以上只是那些实用JavaScript代码段中的一小部分,我也建议你平时注意收集或自己编写这样的基础代码段,它们能在很多项目中使用或通过一些改造提供更完善的功能,使用这些代码段将为你节省下大量的开发时间。

Javascript 相关文章推荐
再谈IE中Flash控件的自动激活 ObjectWrap
Mar 09 Javascript
jQuery 改变CSS样式基础代码
Feb 11 Javascript
Jquery cookie操作代码
Mar 14 Javascript
用js的document.write输出的广告无阻塞加载的方法
Jun 05 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
Jun 05 Javascript
Node.js中使用计时器定时执行函数详解
Aug 15 Javascript
jQuery实现首页图片淡入淡出效果的方法
Jun 10 Javascript
使用jQuery判断浏览器滚动条位置的方法
May 30 Javascript
js在ie下打开对话窗口的方法小结
Oct 24 Javascript
JS无缝滚动效果实现方法分析
Dec 21 Javascript
Vue表单验证插件Vue Validator使用方法详解
Apr 07 Javascript
详解解决使用axios发送json后台接收不到的问题
Jun 27 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
Aug 03 #Javascript
15款最好的Bootstrap在线编辑器
Aug 03 #Javascript
基于d3.js实现实时刷新的折线图
Aug 03 #Javascript
JS判断iframe是否加载完成的方法
Aug 03 #Javascript
两行代码轻松搞定JavaScript日期验证
Aug 03 #Javascript
Highcharts学习之数据列
Aug 03 #Javascript
JavaScript中日期函数的相关操作知识
Aug 03 #Javascript
You might like
PHP中数字检测is_numeric与ctype_digit的区别介绍
2012/10/04 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
jQuery解析json数据实例分析
2015/11/24 Javascript
jQuery实现为控件添加水印文字效果(附源码)
2015/12/02 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
关于两个jQuery(js)特效冲突的bug的解决办法
2016/09/04 Javascript
javascript滚轮控制模拟滚动条
2016/10/19 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
bootstrap响应式工具使用详解
2017/11/29 Javascript
webpack打包node.js后端项目的方法
2018/03/10 Javascript
Angular异步变同步处理方法
2018/08/13 Javascript
js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
2019/01/19 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
[46:10]2014 DOTA2国际邀请赛中国区预选赛 CnB VS HGT
2014/05/21 DOTA
Python list操作用法总结
2015/11/10 Python
详解python3百度指数抓取实例
2016/12/12 Python
Flask框架WTForm表单用法示例
2018/07/20 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
使用matplotlib动态刷新指定曲线实例
2020/04/23 Python
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
军训自我鉴定
2014/01/22 职场文书
和解协议书
2014/04/16 职场文书
教师业务学习材料
2014/12/16 职场文书
人事文员岗位职责
2015/02/04 职场文书
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis