原生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 input 数字验证代码
Jul 30 Javascript
也说JavaScript中String类的replace函数
Sep 22 Javascript
javascript删除option选项的多种方法总结
Nov 22 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
Jun 16 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
jQuery Ztree行政地区树状展示(点击加载)
Nov 09 Javascript
JavaScript正则表达式校验与递归函数实际应用实例解析
Aug 04 Javascript
JS原型继承四步曲及原型继承图一览
Nov 28 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
May 15 Javascript
微信小程序背景音乐开发详解
Dec 12 Javascript
Node.js操作MongoDB数据库实例分析
Jan 19 Javascript
JavaScript实现像雪花一样的Hexaflake分形
Jul 07 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自动反斜杠的函数代码
2010/01/05 PHP
php中的路径问题与set_include_path使用介绍
2014/02/11 PHP
PHP5.5在windows安装使用memcached服务端的方法
2014/04/16 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
利用php做服务器和web前端的界面进行交互
2016/10/31 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
php实现简易计算器
2020/08/28 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
js 在定义的时候立即执行的函数表达式(function)写法
2013/01/16 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
nodejs事件的监听与触发的理解分析
2015/02/12 NodeJs
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
当vue路由变化时,改变导航栏的样式方法
2018/08/22 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
JavaScript获取当前url路径过程解析
2019/12/27 Javascript
Nuxt.js 静态资源和打包的操作
2020/11/06 Javascript
Python端口扫描简单程序
2016/11/10 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
2017/07/17 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
python爬虫之自制英汉字典
2019/06/24 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
交通事故赔偿协议书范本
2014/04/15 职场文书
艺术设计专业毕业生推荐信
2014/07/08 职场文书
2015年清明节网上祭英烈留言寄语
2015/03/04 职场文书
辩论赛主持人开场白
2015/05/29 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
SSM VUE Axios详解
2021/10/05 Vue.js