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 相关文章推荐
基于KMP算法JavaScript的实现方法分析
May 03 Javascript
JavaScript中的函数重载深入理解
Aug 04 Javascript
JS实现三个层重叠点击互相切换的方法
Oct 06 Javascript
JavaScript实现图片自动加载的瀑布流效果
Apr 11 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
Nov 07 Javascript
在一个页面重复使用一个js函数的方法详解
Dec 26 Javascript
微信小程序 图片加载(本地,网路)实例详解
Mar 10 Javascript
Vue Ajax跨域请求实例详解
Jun 20 Javascript
详解如何在React组件“外”使用父组件的Props
Jan 12 Javascript
记React connect的几种写法(小结)
Sep 18 Javascript
vue.js+elementUI实现点击左右箭头切换头像功能(类似轮播图效果)
Sep 05 Javascript
一文彻底理解js原生语法prototype,__proto__和constructor
Oct 24 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取二进制文件头快速判断文件类型的实现代码
2013/08/05 PHP
php目录拷贝实现方法
2015/07/10 PHP
谈谈PHP连接Access数据库的注意事项
2016/08/12 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
2018/04/24 PHP
Laravel 中创建 Zip 压缩文件并提供下载的实现方法
2019/04/02 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
javascript 写类方式之七
2009/07/05 Javascript
JS小功能(操作Table--动态添加删除表格及数据)实现代码
2013/11/28 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
js实现select组件的选择输入过滤代码
2014/10/14 Javascript
使用jquery操作session方法分享
2015/01/22 Javascript
javascript检测两个数组是否相似
2015/05/19 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
基于javascript实现句子翻牌网页版小游戏
2016/03/23 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
JQuery Dialog对话框 不能通过Esc关闭的原因分析及解决办法
2017/01/18 Javascript
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
Vue项目中如何引入icon图标
2018/03/28 Javascript
详解小程序原生使用ES7 async/await语法
2018/08/06 Javascript
element form 校验数组每一项实例代码
2019/10/10 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
[02:05]2014DOTA2西雅图邀请赛 老队长全明星大猜想谁不服就按进显示器
2014/07/08 DOTA
python3+mysql查询数据并通过邮件群发excel附件
2018/02/24 Python
Python3标准库之functools管理函数的工具详解
2020/02/27 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
python能否java成为主流语言吗
2020/06/22 Python
YOOX美国官方网站:全球著名的多品牌时尚网络概念店
2016/09/11 全球购物
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
2014年幼儿园保育工作总结
2014/12/02 职场文书
2015年安全生产工作总结范文
2015/04/02 职场文书
导游词之潮音寺
2019/09/26 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server