原生js实现简单的链式操作


Posted in Javascript onJuly 04, 2017

在jQuery中,一个jq对象能一直连续调用各种方法,因为jQuery把这些方法挂载他自定义的一个对象中,但是使用原生的js获取的DOM对象,只能使用一次addEventLisenter方法添加事件,如果要接着添加事件,还得再调用addEventLisenter。

var area = document.querySelector('.area');
area.addEventListener('mouseenter', function(){
 console.log( 'mouse enter' );
});
area.addEventListener('click', function(){
 console.log( 'click' );
});

可是如果我想在area绑定mouseenter事件后,接着绑定click事件呢。我们也可以参考下jQuery的实现思路,但是没jQuery这么完善。

;(function(){
 window.G = function(selector){
 return new _G(selector);
 }
 function _G(selector){
 this.elements = document.querySelector(selector);
    return this;
 }
 _G.prototype = {
 constructor : _G,
 method : function(name, fn){
  if(this.elements){
  this.elements.addEventListener(name, fn, false);
  }
  return this;
 }
 }
})();

这样我们就能实现一个简单的链式调用了,给.area同时绑定两个事件:

G('.area').method('mouseenter', function(){
  console.log( 'mouse enter' );
}).method('click', function(){
  console.log( 'click' );
})

实现原理相信大家看到代码也非常的清楚:

  • 输出一下G('.area'),他返回的就是一个_G的实例对象;
  • 在_G的内部,把DOM对象存储在elements上,然后prototype上实现了method方法,就是给elements添加对应的事件,每次调用后,都把this返回,供下次使用;
  • G(‘.area')就能使用使用method方法来添加事件了,同时每次method都会把this返回,这样就能连续添加事件

上面的代码我们只是实现了如何为DOM对象连续添加事件,当然我们还可以在_G.prototype中添加别的方法,不过别忘记了return this

_G.prototype = {
 constructor : _G,
 method : function(name, fn){
 if(this.elements){
  this.elements.addEventListener(name, fn, false);
 }
 return this;
 },
 show : function(){
 this.elements.style.display='';
 return this;
 },
 hide : function(){
 this.elements.style.display='none';
 return this;
 }
}

这样G()就能使用show()和hide()了:

// 隐藏
G('.area').hide();

// 显示并且绑定click事件
G('.area').show().method('click', function(){
 console.log( Date.now() );
})

注意:G('.area')不是原生的DOM对象,不能直接操作DOM对象上的属性与方法,比如我想隐藏.area:

G('.area').style.display='none'; // 错误

是不能这么操作的。DOM对象存储在elements中,如果想直接在DOM对象上操作,可以:

G('.area').elements.style.display='none'; // 正确

总结一下,这里我们也只是用原生js简单的实现了下链式操作,更复杂的功能,比如对象缓存,异常处理等等,都需要后续再完善处理。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
原生js操作checkbox用document.getElementById实现
Oct 12 Javascript
Windows8下搭建Node.js开发环境教程
Sep 03 Javascript
浅谈javascript属性onresize
Apr 20 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
Jun 02 Javascript
Bootstrap源码解读网格系统(3)
Dec 22 Javascript
JS实现给对象动态添加属性的方法
Jan 05 Javascript
原生js实现放大镜效果
Jan 11 Javascript
JS实现数组去重复值的方法示例
Feb 18 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
Mar 03 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
Sep 11 jQuery
原生js封装添加class,删除class的实例
Nov 06 Javascript
微信小程序 导入图标实现过程详解
Oct 11 Javascript
详解用vue编写弹出框组件
Jul 04 #Javascript
使用vue构建一个上传图片表单
Jul 04 #Javascript
vue-resource 拦截器(interceptor)的使用详解
Jul 04 #Javascript
JavaScript在控件上添加倒计时功能的实现代码
Jul 04 #Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 #Javascript
详解vue-router和vue-cli以及组件之间的传值
Jul 04 #Javascript
详解Angular.js中$http拦截器的介绍及使用
Jul 04 #Javascript
You might like
木翼下载系统中说明的PHP安全配置方法
2007/06/16 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP小教程之实现双向链表
2014/06/12 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
告诉大家什么是JSON
2008/06/10 Javascript
js判断生效时间不得大于失效时间的思路及代码
2013/04/23 Javascript
jQuery中outerWidth()方法用法实例
2015/01/19 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
JS跨域交互(jQuery+php)之jsonp使用心得
2016/07/01 Javascript
Bootstrap 表单验证formValidation 实现远程验证功能
2017/05/17 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
js中getter和setter用法实例分析
2018/08/14 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
vue项目中将element-ui table表格写成组件的实现代码
2019/06/12 Javascript
JavaScript变量基本使用方法实例分析
2019/11/15 Javascript
Jquery如何使用animation动画效果改变背景色的代码
2020/07/20 jQuery
React冒泡和阻止冒泡的应用详解
2020/08/18 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
Python实现的二维码生成小软件
2014/07/11 Python
详解Django中的ifequal和ifnotequal标签使用
2015/07/16 Python
利用Python实现网络测试的脚本分享
2017/05/26 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
将python安装信息加入注册表的示例
2019/11/20 Python
Python序列化pickle模块使用详解
2020/03/05 Python
python如何编写win程序
2020/06/08 Python
Python用户自定义异常的实现
2020/12/25 Python
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
计算机多媒体专业自荐信
2014/07/04 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
党性修养心得体会2016
2016/01/21 职场文书
python 详解turtle画爱心代码
2022/02/15 Python