精彩 JavaScript 代码片段
1. 根据给定的条件在原有的数组上,得到所需要的新数组。
——《JavaScript 王者归来》
var a = [-1,-1,1,2,-2,-2,-3,-3,3,-3];
function f(s,e)
{
var ret = [];
for(var i in s){ // 根据原有的数组长度进行循环
ret.push(e(s[i]));
}
return ret;
} f(a,function(n){return n>0?n:0}); // 传输一个匿名函数作为逻辑判断
2. 比原生type 或 typeof 更详细的类型监测方法
——《精通 JavaScript · 第二章》
function type(p){
/function.(\w*)\(\)/.test(p.constructor); //通过其构造函数来获取对应的类型。
return RegExp.$1;
}
3. 对象或数组的深拷贝,用于解决对象引用时值一改全改的问题。
var copyObject = function(obj){
var result = {};
for(var x in obj){
result[x] = typeof obj==="object" ? copyObject(obj[x]) : obj[x]
//如果拷贝的值仍然是一个对象,那么重复执行当前方法。
}
return result;
}
4. 通过正则表达式来获取Cookie的值
function getCookie(name){
if(name && RegExp("(^| )" + name + "=([^;]*)(;|$)").exec(document.cookie)) return RegExp.$2;
// (^| ) 不匹配第一个空格。
// ([^;]*) 只匹配除了;号之外的所有字符。
// (;|$) 匹配以;号或$为结尾的字符。
}
5. 通过移位运算来替代"parseInt"
~~3.14 => 3;
// ~~ 取整。~取当前数值的反码,~~表示再次取反,也就是得到当前自身(说明,JS中的“位”运算会将数值自动转换为整数)
6. 将数值转换为16进制的字符串(常用于表示色彩)
(~~(Math.random()*(1<<24))).toString(16)
// ~~ 通过位运算来取整。
// << 左移位。将1的二进制数左移24位。而1<<24 == 2^24(RGB模式下最多可表示的色彩数量)
// 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属性
· 支持索引来读取内容。
function makeArray(obj){
var rs=[],len=obj.length;
try{
rs = [].slice.call(obj,0);
/*
注意:这里的arguments是具有.length属性的对象
slice:数组的截取方法,这中写法也涉及到slice内部实现的原理
*/
}catch(e){//for IE
for(var i=0;j=obj[i++];){
rs.push(j);
}
}
return rs;
}
9.尝试执行异常的代码
try{
// 尝试运行
}catch(msg){
throw "Error name:" + msg.name; // throw会在控制台抛出异常信息,注意:throw会阻塞程序执行。建议使用console.log
throw "Error message:" + msg.message
/* Error.Name 的常见错误信息:
1. EvalError:eval_r()的使用与定义不一致
2. RangeError:数值越界
3. ReferenceError:非法或不能识别的引用数值
4. SyntaxError:发生语法解析错误
5. TypeError:操作数类型错误
6. URIError:URI处理函数使用不当
*/
}finally{
// finally 最终不论是运行成功还是没有运行成功都会执行。
}
10.滚动条滚动时分别判断位置与内容的可见
// 判断滚动到指定元素的位置
function getPos(obj){
var t = 0;
while(obj){
t += obj.offsetTop;
obj = obj.offsetParent;
}
return t;
}
window.onscroll = function(){
var position = document.documentElement.clientHeight,
visible = document.documentElement.clientHeight + (document.documentElement.scrollTop || document.body.scrollTop);
// 滚动到指定位置
if(position > getPos(obj)){}
// 滚动时指定内容显示出来
if(visible > getPos(obj)){}
}
11. 在事件的注册处理程序中注销事件
function handle(){
alert(‘I,m here!');
this.removeEventListener('click',handle,false);
}
obj.addEventListener('click',handle,false);
12. 正则匹配清除两侧空格
var trim = function(v){
var patrn = /^\s*(.*?)\s+$/;
return (patrn.test(v))? RegExp.$1 : 'null';
}
13. HTML字符编码
var htmlEncode = function(str){
var patrn = {};
patrn['amp'] = /&/g;
patrn['left'] = /</g;
patrn['right'] = />/g;
patrn['quot'] = /"/g;
patrn['nbsp'] = /[\u0020*|\u3000*]/g; // \u0020 匹配半角空格 \u3000 匹配全角空格
return str.replace(patrn['amp'],'&').replace(patrn['left'],'<').replace(patrn['right'],'>').replace(patrn['quot'],'"').replace(patrn['nbsp'],' ');
};
14. 创建样式表
function createStyleSheet(url){
try{
document.createStyleSheet(url);
}catch(e){
var _link = document.createElement('link'),
_head = document.getElementsByTagName('head')[0];
_link.rel="stylesheet";
_link.href=url;
_head.appendChild(_link);
}
}
15. 防止脚本注入
function stripscript(s) {
return s.replace(/<script.*?>.*?<\/script>/ig, '');
}
16. 阻止mouseWhell事件连续触发的两种方式
// 时间戳的方式
var mark = 0;
$(document).mousewheel(function(e){
var timer = new Date().getTime();
if(timer - mark > 1e3){
alert('ok');
mark = timer;
}
}); //定时器的方式
var flag = true;
$(document).mousewheel(function(e){
if(flag){
alert('ok');
flag = false;
setTimeout(function(){
flag = true;
},1000);
}
});
17. 时间格式化
function dateFormat(t){ // t 是以秒为单位的值。
var h = ~~(t/3600), // t除以3600,取整,得到的就是小时。
m = ~~(t%3600/60), // t求余3600,取模,得到的就是去除小时剩下的秒数(分钟 + 秒),再除以60,取整,得到的就是分钟。
s = ~~(t%3600%60); // t求余3600,再求余60,剩下的自然就是“秒数”。
return h+'小时'+m+'分'+s+'秒';
}
18. 获取DOM索引的两种方式
var oDiv = document.getElementsByTagName('div');
// 获取DOM对象的索引方式一
for (var i = , l = oDiv.length; i < l; i++) {
oDiv[i].index = i; // 在DOM对象上附加属性的方式。
oDiv[i].onclick = function() {
alert(this.index);
}
}
// 获取DOM对象的索引方式二
for (var i = , l = oDiv.length; i < l; i++) {
(function(n) { // 每一次执行外层函数(自执行函数)都会创建一个独立的闭包,每个独立闭包的i值是不同的。
oDiv[n].onclick = function() {
alert(n);
}
}(i));
}
19. replace用法新发现
//之前我们普通的用法
'String'.replace(/[a-z]/,function(a,b,c){//...}) //现在,我们可以采用更简洁的方法
'images/logo.png'.replace(/(.*)(\.\w+)/,'$1@2x$2')
精彩 JavaScript 代码片段的更多相关文章
- 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解!
原文:https://github.com/Chalarangelo/30-seconds-of-code#anagrams-of-string-with-duplicates 作者:Chalaran ...
- 精心收集的 48 个 JavaScript 代码片段,仅需 30 秒就可理解
原文:Chalarangelo 译文:IT168 https://github.com/Chalarangelo/30-seconds-of-code#anagrams-of-string-with ...
- 精心收集的48个JavaScript代码片段,仅需30秒就可理解
源文链接 :https://github.com/Chalarangelo/30-seconds-of-code#anagrams-of-string-with-duplicates 该项目来自于 G ...
- 超实用的 JavaScript 代码片段( ES6+ 编写)
Array 数组 Array concatenation (数组拼接) 使用 Array.concat() ,通过在 args 中附加任何数组 和/或 值来拼接一个数组. const ArrayCon ...
- 一些非常有用的html,css,javascript代码片段(持久更新)
1.判断设备是否联网 if (navigator.onLine) { //some code }else{ //others code } 2.获取url的指定参数 function getStrin ...
- JavaScript 代码片段
1.无题 if (i && i.charAt(i.length - 1) == "/") { i = i.substr(0, i.length - 1) } 2.无 ...
- 常用javascript代码片段集锦
常用方法的封装 根据类名获取DOM元素 var $$ = function (className, element) { if (document.getElementsByClassName) { ...
- javascript代码片段
DOMReady函数,只要DOM结构加载完成即可,不必等待所有资源加载完成,节约时间,"DOMContentLoaded"在H5中被标准化 var DOMReady=functio ...
- 实用Javascript代码片段
清除select下拉选项,添加并选择特点选项 $('#mySelect') .find('option') .remove() .end() .append('<option value=&qu ...
随机推荐
- nodejs进阶(1)—输出hello world
下面将带领大家一步步学习nodejs,知道怎么使用nodejs搭建服务器,响应get/post请求,连接数据库等. 搭建服务器页面输出hello world var http = require ...
- UE4新手引导之下载和安装虚幻4游戏引擎
1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...
- ASP.NET加密和解密数据库连接字符串
大家知道,在应用程序中进行数据库操作需要连接字符串,而如果没有连接字符串,我们就无法在应用程序中完成检索数据,创建数据等一系列的数据库操作.当有人想要获取你程序中的数据库信息,他首先看到的可能会是We ...
- WPF样式之画刷结合样式
第一种画刷,渐变画刷GradientBrush (拿线性渐变画刷LinearGradientBrush(其实它涵盖在GradientBrush画刷内.现在拿他来说事.),还有一个圆心渐变画刷Radia ...
- Python 正则表达式入门(中级篇)
Python 正则表达式入门(中级篇) 初级篇链接:http://www.cnblogs.com/chuxiuhong/p/5885073.html 上一篇我们说在这一篇里,我们会介绍子表达式,向前向 ...
- 微信小程序前端源码逻辑和工作流
看完微信小程序的前端代码真的让我热血沸腾啊,代码逻辑和设计一目了然,没有多余的东西,真的是大道至简. 废话不多说,直接分析前端代码.个人观点,难免有疏漏,仅供参考. 文件基本结构: 先看入口app.j ...
- Visual Studio 2013 添加一般应用程序(.ashx)文件到SharePoint项目
默认,在用vs2013开发SharePoint项目时,vs没有提供一般应用程序(.ashx)的项目模板,本文解决此问题. 以管理员身份启动vs2013,创建一个"SharePoint 201 ...
- BPM配置故事之案例1-配置简单流程
某天,Boss找到了信息部工程师小明. Boss:咱们新上了H3 BPM,你研究研究把现在的采购申请流程加上去吧,这是采购申请单. 小明:好嘞 采购申请单 小明回去后拿着表单想了想,开始着手配置. 他 ...
- 使用Nginx反向代理 让IIS和Tomcat等多个站点一起飞
使用Nginx 让IIS和Tomcat等多个站点一起飞 前言: 养成一个好习惯,解决一个什么问题之后就记下来,毕竟“好记性不如烂笔头”. 这样也能帮助更多的人 不是吗? 最近闲着没事儿瞎搞,自己在写一 ...
- .NET跨平台:在Ubuntu上用自己编译的dnx运行ASP.NET 5示例程序
在 Linux Ubuntu 上成功编译 dnx 之后,会在 artifacts/build/ 文件夹中生成 dnx-coreclr-linux-x64/ 与 dnx-mono/ 这2个文件夹,前者是 ...