精彩 JavaScript 代码片段

1. 根据给定的条件在原有的数组上,得到所需要的新数组。

     ——《JavaScript 王者归来》

 1     var a = [-1,-1,1,2,-2,-2,-3,-3,3,-3];
 2     function f(s,e)
 3     {
 4         var ret = [];
 5         for(var i in s){  // 根据原有的数组长度进行循环
 6             ret.push(e(s[i])); 
 7         }
 8         return ret;
 9     }
10 
11     f(a,function(n){return n>0?n:0}); // 传输一个匿名函数作为逻辑判断

 

2. 比原生type 或 typeof 更详细的类型监测方法

     ——《精通 JavaScript · 第二章》

1     function type(p){
2         /function.(\w*)\(\)/.test(p.constructor); //通过其构造函数来获取对应的类型。
3         return RegExp.$1;
4     }

 

3. 对象或数组的深拷贝,用于解决对象引用时值一改全改的问题。

1 var copyObject = function(obj){
2      var result = {};
3         for(var x in obj){
4           result[x] = typeof obj==="object" ? copyObject(obj[x]) : obj[x]
5           //如果拷贝的值仍然是一个对象,那么重复执行当前方法。
6         }
7   return result;
8 }

 

4. 通过正则表达式来获取Cookie的值

1 function getCookie(name){
2     
3     if(name && RegExp("(^| )" + name + "=([^;]*)(;|$)").exec(document.cookie)) return RegExp.$2;
4         // (^| ) 不匹配第一个空格。
5         // ([^;]*) 只匹配除了;号之外的所有字符。
6         // (;|$) 匹配以;号或$为结尾的字符。
7 }

 

5. 通过移位运算来替代"parseInt"

1 ~~3.14 => 3;
// ~~ 取整。~取当前数值的反码,~~表示再次取反,也就是得到当前自身(说明,JS中的“位”运算会将数值自动转换为整数)

 

6. 将数值转换为16进制的字符串(常用于表示色彩)

1 (~~(Math.random()*(1<<24))).toString(16)
2   // ~~ 通过位运算来取整。
3   // << 左移位。将1的二进制数左移24位。而1<<24 == 2^24(RGB模式下最多可表示的色彩数量)
4   // toString(16) 将数值转换为16进制的字符串输出。

 

7. 对象方法的兼容性检查

if('querySelector' in document){}

 

8. NodeList || HTMLCollection || Object 转换为Array或具有Array的方法。

    NodeList: 是指通过集合方法获得到的DOM节点列表,例如:document.getElementsByTagNmae,document.forms... 等方法。

    HTMLCollection: HTML块,它与NodeList很像,但是NodeList只支持数字索引,而HTMLCollection可以支持名称作为索引。

   NodeList 与 HTMLCollection 都具有以下类似:

  · 具有数组的外观,但没有数组的方法

  · 具有.length属性

  · 支持索引来读取内容。

 1 function makeArray(obj){
 2     var rs=[],len=obj.length;
 3     try{
 4         rs = [].slice.call(obj,0); 
 5          /* 
 6              注意:这里的arguments是具有.length属性的对象
 7              slice:数组的截取方法,这中写法也涉及到slice内部实现的原理
 8          */
 9     }catch(e){//for IE
10         for(var i=0;j=obj[i++];){
11             rs.push(j);
12         }                    
13     }
14     return rs;    
15 }

 

9.尝试执行异常的代码

 1     try{
 2             // 尝试运行
 3 
 4     }catch(msg){
 5 
 6         throw "Error name:" + msg.name; // throw会在控制台抛出异常信息,注意:throw会阻塞程序执行。建议使用console.log
 7         throw "Error message:" + msg.message  
 8 
 9         /*  Error.Name 的常见错误信息:
10 
11             1. EvalError:eval_r()的使用与定义不一致 
12             2. RangeError:数值越界 
13             3. ReferenceError:非法或不能识别的引用数值 
14             4. SyntaxError:发生语法解析错误 
15             5. TypeError:操作数类型错误 
16             6. URIError:URI处理函数使用不当
17 
18         */
19 
20     }finally{
21         // finally 最终不论是运行成功还是没有运行成功都会执行。
22     }

 

10.滚动条滚动时分别判断位置与内容的可见

 1 // 判断滚动到指定元素的位置
 2 
 3 function getPos(obj){
 4   var t = 0;
 5   while(obj){
 6     t += obj.offsetTop;
 7     obj = obj.offsetParent;   
 8   } 
 9    return t;       
10 }
11 
12 window.onscroll = function(){
13  var position = document.documentElement.clientHeight,
14      visible =  document.documentElement.clientHeight + (document.documentElement.scrollTop || document.body.scrollTop);  
15    
16    // 滚动到指定位置 
17    if(position > getPos(obj)){}
18    // 滚动时指定内容显示出来
19    if(visible > getPos(obj)){}
20  
21 }

 

11. 在事件的注册处理程序中注销事件

1 function handle(){
2     alert(‘I,m here!');
3     this.removeEventListener('click',handle,false);
4 }
5 obj.addEventListener('click',handle,false);

 

12. 正则匹配清除两侧空格

1 var trim = function(v){
2     var patrn = /^\s*(.*?)\s+$/;
3     return (patrn.test(v))? RegExp.$1 : 'null';
4 }

 

13. HTML字符编码

1 var htmlEncode = function(str){
2     var patrn = {};
3         patrn['amp'] = /&/g;
4         patrn['left'] = /</g;
5         patrn['right'] = />/g;
6         patrn['quot'] = /"/g;
7         patrn['nbsp'] = /[\u0020*|\u3000*]/g; // \u0020 匹配半角空格 \u3000 匹配全角空格
8     return str.replace(patrn['amp'],'&amp;').replace(patrn['left'],'&lt;').replace(patrn['right'],'&gt;').replace(patrn['quot'],'&quot;').replace(patrn['nbsp'],'&nbsp;');
9 };

 

14. 创建样式表

 1 function createStyleSheet(url){
 2     try{
 3         document.createStyleSheet(url);
 4         5     }catch(e){
 6         
 7         var _link = document.createElement('link'),
 8             _head = document.getElementsByTagName('head')[0];
 9             _link.rel="stylesheet";
10             _link.href=url;
11         _head.appendChild(_link);
12       13     }
14 }

 

15. 防止脚本注入

1 function stripscript(s) {
2     return s.replace(/<script.*?>.*?<\/script>/ig, '');
3 }

 

16. 阻止mouseWhell事件连续触发的两种方式

 1 // 时间戳的方式
 2 var mark = 0;
 3 $(document).mousewheel(function(e){
 4     var timer = new Date().getTime();
 5     if(timer - mark > 1e3){
 6         alert('ok');
 7         mark = timer;
 8     }
 9 });
10 
11 //定时器的方式
12 var flag = true;
13 $(document).mousewheel(function(e){
14     if(flag){
15         alert('ok');
16         flag = false;
17         setTimeout(function(){
18             flag = true;
19         },1000);
20     }
21 });

 

17. 时间格式化

1 function dateFormat(t){        // t 是以秒为单位的值。
2 
3     var h = ~~(t/3600),        // t除以3600,取整,得到的就是小时。
4         m = ~~(t%3600/60),    // t求余3600,取模,得到的就是去除小时剩下的秒数(分钟 + 秒),再除以60,取整,得到的就是分钟。
5         s = ~~(t%3600%60);    // t求余3600,再求余60,剩下的自然就是“秒数”。
6 
7      return h+'小时'+m+'分'+s+'秒';
8 }

 

18. 获取DOM索引的两种方式

 1 var oDiv = document.getElementsByTagName('div');
 2 
 3 // 获取DOM对象的索引方式一
 4 
 5 for (var i = 0, l = oDiv.length; i < l; i++) {
 6 
 7     oDiv[i].index = i; // 在DOM对象上附加属性的方式。
 8     oDiv[i].onclick = function() {
 9         alert(this.index);
10     }
11 }
12 
13 
14 // 获取DOM对象的索引方式二
15 
16 for (var i = 0, l = oDiv.length; i < l; i++) {
17 
18     (function(n) { // 每一次执行外层函数(自执行函数)都会创建一个独立的闭包,每个独立闭包的i值是不同的。
19         oDiv[n].onclick = function() {
20             alert(n);
21         }
22     }(i));
23 
24 }

 

19. replace用法新发现

//之前我们普通的用法
'String'.replace(/[a-z]/,function(a,b,c){//...})

//现在,我们可以采用更简洁的方法
'images/logo.png'.replace(/(.*)(\.\w+)/,'$1@2x$2')
posted @ 2015-12-29 09:32  卷柏的花期  阅读(591)  评论(0编辑  收藏  举报