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 相关文章推荐
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
Feb 18 Javascript
javascript处理表单示例(javascript提交表单)
Apr 28 Javascript
js实现滑动触屏事件监听的方法
May 05 Javascript
jQuery预加载图片常用方法
Jun 15 Javascript
一个极为简单的requirejs实现方法
Oct 20 Javascript
AngularJS定时器的使用与移除操作方法【interval与timeout】
Dec 14 Javascript
AngularJS表格添加序号的方法
Mar 03 Javascript
基于ES6 Array.of的用法(实例讲解)
Sep 05 Javascript
JavaScript中EventLoop介绍
Jan 22 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
小程序自定义轮播图圆点组件
Jun 25 Javascript
vue3 自定义图片放大器效果的示例代码
Jul 23 Vue.js
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
Windows下部署Apache+PHP+MySQL运行环境实战
2012/08/31 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
PHP实现二维数组去重功能示例
2017/01/12 PHP
利用ajax和PHP实现简单的流程管理
2017/03/23 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
浅谈javascript实现八大排序
2015/04/27 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
jQuery简单倒计时效果完整示例
2016/09/20 Javascript
easyUI实现类似搜索框关键词自动提示功能示例代码
2016/12/27 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
微信小程序 setData的使用方法详解
2017/04/20 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
vue elementui el-form rules动态验证的实例代码详解
2019/05/23 Javascript
python在多玩图片上下载妹子图的实现代码
2013/08/13 Python
python求crc32值的方法
2014/10/05 Python
Python fileinput模块使用实例
2015/06/03 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
python集合是否可变总结
2019/06/20 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
python中的错误如何查看
2020/07/08 Python
Python绘图实现台风路径可视化代码实例
2020/10/23 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
如何手工释放资源
2013/12/15 面试题
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
视光学专业自荐信
2014/06/24 职场文书
机关作风建设工作总结
2014/10/23 职场文书
学校隐患排查制度
2015/08/05 职场文书
七年级作文之下雨天
2019/12/23 职场文书
Windows下用Nginx配置https服务器及反向代理的问题
2021/09/25 Servers
Java 多态分析
2022/04/26 Java/Android