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实现的模拟QQ邮箱里的收件人选取及其他效果(一)
Jan 06 Javascript
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
Jan 04 Javascript
根据json字符串生成Html的一种方式
Jan 09 Javascript
基于javascript实现listbox左右移动
Jan 29 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
浅谈Vue.js
Mar 02 Javascript
vue+swiper实现侧滑菜单效果
Dec 28 Javascript
JS实现判断图片是否加载完成的方法分析
Jul 31 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
Aug 28 Javascript
vue+element树组件 实现树懒加载的过程详解
Oct 21 Javascript
javascript History对象原理解析
Feb 17 Javascript
微信小程序绘制半圆(弧形)进度条
Nov 18 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
我的论坛源代码(五)
2006/10/09 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
jquery对dom节点的操作【推荐】
2016/04/15 Javascript
Javascript 事件冒泡机制详细介绍
2016/10/10 Javascript
JavaScript定时器制作弹窗小广告
2017/02/05 Javascript
webpack打包后直接访问页面图片路径错误的解决方法
2017/06/17 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
详解微信小程序的不同函数调用的几种方法
2019/05/08 Javascript
微信小程序实现聊天室
2020/08/21 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
用Python将IP地址在整型和字符串之间轻松转换
2017/03/22 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python print输出延时,让其立刻输出的方法
2019/01/07 Python
Django框架登录加上验证码校验实现验证功能示例
2019/05/23 Python
python异常处理try except过程解析
2020/02/03 Python
解决Python logging模块无法正常输出日志的问题
2020/02/21 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
恶意软件的定义
2014/11/12 面试题
网络安全方面的面试题
2015/11/04 面试题
演讲稿怎么写
2014/01/07 职场文书
高二生物教学反思
2014/01/27 职场文书
境外导游求职信
2014/02/27 职场文书
生活小常识广播稿
2014/09/16 职场文书
2014年设计师工作总结
2014/11/25 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
maven依赖的version声明控制方式
2022/01/18 Java/Android