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 相关文章推荐
javascript 冒号 使用说明
Jun 06 Javascript
JavaScript继承方式实例
Oct 29 Javascript
jQuery实现自动调整字体大小的方法
Jun 15 Javascript
js中substring和substr两者区别和使用方法
Nov 09 Javascript
原生js配合cookie制作保存路径的拖拽
Dec 29 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
Mar 01 Javascript
js内置对象处理_打印学生成绩单的简单实现
Sep 24 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
解决Extjs下拉框不显示的问题
Jun 21 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
Jun 02 Javascript
vue-router为激活的路由设置样式操作
Jul 18 Javascript
Vue深入理解插槽slot的使用
Aug 05 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
php 魔术函数使用说明
2010/02/21 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
php实现aes加密类分享
2014/02/16 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
function, new function, new Function之间的区别
2007/03/08 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
js中常用的Math方法总结
2017/01/12 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
[06:45]DOTA2卡尔工作室 英雄介绍幻影长矛手篇
2013/07/12 DOTA
python正则匹配查询港澳通行证办理进度示例分享
2013/12/27 Python
python读写ini文件示例(python读写文件)
2014/03/25 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
python数据持久存储 pickle模块的基本使用方法解析
2019/08/30 Python
python super的使用方法及实例详解
2019/09/25 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
python如何实现图片压缩
2020/09/11 Python
pandas针对excel处理的实现
2021/01/15 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
Oracle快照(snapshot)
2015/03/13 面试题
跟单业务员岗位职责
2014/03/08 职场文书
课前三分钟演讲稿
2014/04/24 职场文书
爱我中华教学反思
2014/04/28 职场文书
科长竞聘演讲稿
2014/05/16 职场文书
授权委托书样本及填写说明
2014/09/19 职场文书
出纳试用期自我评价
2015/03/10 职场文书
体育教师教学随笔
2015/08/15 职场文书