jQuery、zepto、js常用小技巧


Posted in Javascript onFebruary 12, 2017

以下只为记录自己工作常用的片段和心得, 如有问题请指正, 多谢~

jQuery/zepto判断元素是否存在

// 判断长度是否存在, 正确
if ($elem.length) {
}

// 错误, 因为空数组也是true
if ($elem) {
}

合理判断数据类型

先看代码:

function case(str) {
  return str.match(/reg/);
}

看着没问题, 但当 str 为空(false, null等)时就挂了, 适当的检查让代码更健壮, 如:

function case(str) {
  return "string" === typeof str ? str.match(/reg/) : null;

  // 或者强制转换下
  return String(str).match(/reg/);
}

function case2(callback) {
  if ("function" === typeof callback) {
    callback();
  }
}

再比如, 要获取地址栏的参数:

function getQuery(key) {
  // 不论页面链接有没有querystring, location.search都会是字符串
  // substr为了忽略?号
  var result = location.search.substr(1).match(new RegExp("(?:^|&)" + key + "=(.+?)(?:$|&)"));

  // 如果匹配成功为数组
  return result ? result[1] : result;
}

因为要判断结果是否存在从而多了个变量 result , 然而可以使用默认值替换:

function getQuery(key) {
  return (location.search.substr(1).match(new RegExp("(?:^|&)" + key + "=(.+?)(?:$|&)")) || ["", "我是默认值, 因为前面为空就到我了"])[1];
}

合理try,catch

在正常情况下不推荐使用 try , 但在一些未知情况下建议使用, 比如: 异步接口成功后的数据结构太多:

// 原判断
success: res => {
  // zepto里空的200响应也会触发success
  if (res && res.data && res.data.result && res.data.result[0] && res.data.result[0].list && res.data.result[0].list.length) {
    // 成功
    res.data.result[0].list.forEach();
  }
  else {
    // 数据处理出错
  }
}

艾玛, 判断那么长, 但不判断直接用可能会报js错, 于是:

// 原判断
success: res => {
  try {
    // 尝试使用, 当报错时进入下面分支
    res.data.result[0].list.forEach();
  }
  catch (e) {
    // 数据处理出错
  }
}

合理使用dataset

dataset 是指在 html 元素中添加的以 data-* 为名称的属性字段
点击查看 兼容性
使用 DOM.dataset 获取元素的 DOMStringMap对象 , 可以直接 DOM.dataset.key = value 赋值和 delete DOM.dataset.key 删除, 如: document.body.dataset.xxoo = 1
常用于存放一些自定义数据, 如: <a href="#" rel="external nofollow" data-uid="1" data-name="xxoo">我是一个兵</a>
语义化更强
.data, .attr, .prop, dataset的区别

注: .data, .attr, .prop是 jQuery, zepto 的方法

名称 描述 是否显示在dom树上
attr 操作 dom.getAttribute
prop 操作元素的 dom 属性, 常用于选中 selected, checked 、禁用 disabled 等
dataset 操作元素的节点数据

对于 .data 跟库的有关, 如:

名称 描述 是否显示在dom树上
jQuery .data(key) - 先判断缓存对象, 不存在则获取 attr('data-key') 并写入缓存到 $.cache[id].data[key] .data(key, value) - 设置缓存
zepto 直接使用 .attr('data-' + key, value)
zepto - 加载 data.js .data(key) - 先判断缓存对象, 不存在则获取 attr('data-key') .data(key, value) - 设置缓存
有以上结论了, 那么可以根据自己的场景选择了, 比如在 css 里有使用 div[data-xx='1'] {} 这样的选择器来控制样式, 那么就得使用 .attr() 或者 dataset 来操作了, 你懂的~
Javascript 相关文章推荐
css样式标签和js语法属性区别
Nov 06 Javascript
写JQuery插件的基本知识
Nov 25 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
Jun 30 Javascript
JavaScript字符串对象replace方法实例(用于字符串替换或正则替换)
Oct 16 Javascript
JavaScript 里的类数组对象
Apr 08 Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
Jun 08 Javascript
js数组去重的5种算法实现
Nov 04 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
JavaScript实现url参数转成json形式
Sep 25 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
Aug 24 Javascript
浅谈vue 二级路由嵌套和二级路由高亮问题
Aug 06 Javascript
JS中如何实现Laravel的route函数详解
Feb 12 #Javascript
js输入框使用正则表达式校验输入内容的实例
Feb 12 #Javascript
浅谈js中同名函数和同名变量的执行问题
Feb 12 #Javascript
老生常谈jquery id选择器和class选择器的区别
Feb 12 #Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
Feb 12 #Javascript
浅谈jQuery中事情的动态绑定
Feb 12 #Javascript
浅谈jQuery中的$.extend方法来扩展JSON对象
Feb 12 #Javascript
You might like
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
js获取会话框prompt的返回值的方法
2015/01/10 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
js+HTML5实现视频截图的方法
2015/06/16 Javascript
原生js实现数字字母混合验证码的简单实例
2015/12/10 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
js拖拽的原型声明和用法总结
2016/04/04 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
vue任意关系组件通信与跨组件监听状态vue-communication
2020/10/18 Javascript
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
阿里云ECS服务器部署django的方法
2019/08/29 Python
Python箱型图处理离群点的例子
2019/12/09 Python
python连接mysql有哪些方法
2020/06/24 Python
Python+Opencv实现把图片、视频互转的示例
2020/12/17 Python
Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
2016/11/15 全球购物
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
鼓励运动员的广播稿
2014/02/08 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
2014年服装销售工作总结
2014/11/27 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书