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 相关文章推荐
JS创建优美的页面滑动块效果 - Glider.js
Sep 27 Javascript
jquery基础教程之deferred对象使用方法
Jan 22 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
Mar 26 Javascript
使用jQuery在移动页面上添加按钮和给按钮添加图标
Dec 04 Javascript
JS Ajax请求如何防止重复提交
Jun 13 Javascript
Listloading.js移动端上拉下拉刷新组件
Aug 04 Javascript
angular学习之从零搭建一个angular4.0项目
Jul 10 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
Sep 02 Javascript
webpack4.x CommonJS模块化浅析
Nov 09 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
vue开发中遇到的问题总结
Apr 07 Javascript
OpenLayers3实现地图鹰眼以及地图比例尺的添加
Sep 25 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实现网站插件机制的方法
2009/11/10 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
php获取百度收录、百度热词及百度快照的方法
2015/04/02 PHP
PHP中应该避免使用同名变量(拆分临时变量)
2015/04/03 PHP
PHP实现简单的新闻发布系统实例
2015/07/28 PHP
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
全面解析Bootstrap中Carousel轮播的使用方法
2016/06/13 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
2016/11/07 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
[原创]js实现保存文本框内容为本地文件兼容IE,chrome,火狐浏览器
2018/02/14 Javascript
Vue.js项目中管理每个页面的头部标签的两种方法
2018/06/25 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
Node.js+Vue脚手架环境搭建的方法步骤
2020/03/08 Javascript
微信小程序动态评分展示/五角星展示/半颗星展示/自定义长度展示功能的实现
2020/07/22 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
[40:17]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第一场
2018/04/06 DOTA
python中urllib模块用法实例详解
2014/11/19 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
Python交互环境下实现输入代码
2018/06/22 Python
Python3.5运算符操作实例详解
2019/04/25 Python
基于Tensorflow一维卷积用法详解
2020/05/22 Python
TensorFlow-gpu和opencv安装详细教程
2020/06/30 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
计算机专业大学生的自我评价
2013/11/14 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
供用电专业求职信
2014/07/07 职场文书
关于学习的决心书
2015/02/05 职场文书
院系推荐意见
2015/06/05 职场文书
排球赛新闻稿
2015/07/17 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书