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 相关文章推荐
IE 下Enter提交表单存在重复提交问题的解决方法
May 04 Javascript
jQuery实现炫酷的鼠标轨迹特效
Feb 01 Javascript
Javascript优化技巧之短路表达式详细介绍
Mar 27 Javascript
js简单实现Select互换数据的方法
Aug 17 Javascript
javascript每日必学之多态
Feb 23 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
Apr 17 Javascript
jQuery获取选中单选按钮radio的值
Dec 27 Javascript
基于jQuery封装的分页组件
Jun 26 jQuery
React props和state属性的具体使用方法
Apr 12 Javascript
vue的for循环使用方法
Feb 12 Javascript
一些你可能不熟悉的JS知识点总结
Mar 15 Javascript
js实现数字从零慢慢增加到指定数字示例
Nov 07 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
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
不错的JS中变量相关的细节分析
2007/08/13 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
2016/12/20 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
20170918 前端开发周报之JS前端开发必看
2017/09/18 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
浅谈终端直接执行py文件,不需要python命令
2017/01/23 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
2019/12/27 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
Python爬虫与反爬虫大战
2020/07/30 Python
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
总裁秘书岗位职责
2013/12/04 职场文书
会计核算科岗位职责
2014/03/19 职场文书
旅游节目策划方案
2014/05/26 职场文书
圣诞节活动策划方案
2014/06/09 职场文书
演讲稿开场白台词
2014/08/25 职场文书
中秋节慰问信
2015/02/15 职场文书
学术会议通知
2015/04/15 职场文书
诚信考试主题班会
2015/08/17 职场文书
如何使用Maxwell实时同步mysql数据
2021/04/08 MySQL
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
python 实现图片特效处理
2022/04/03 Python
JAVA 线程池(池化技术)的实现原理
2022/04/28 Java/Android