精彩 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'],'&').replace(patrn['left'],'<').replace(patrn['right'],'>').replace(patrn['quot'],'"').replace(patrn['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')