原生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 相关文章推荐
jquery easyui combobox模糊过滤(示例代码)
Nov 30 Javascript
js验证电话号码与手机支持+86的正则表达式
Jan 23 Javascript
一个JavaScript去除字符串末尾的空白实例代码
Sep 22 Javascript
浅谈JavaScript Math和Number对象
Jan 26 Javascript
javascript笛卡尔积算法实现方法
Apr 08 Javascript
jQuery插件jRumble实现网页元素抖动
Jun 05 Javascript
跟我学习javascript的作用域与作用域链
Nov 19 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
Jan 16 Javascript
详解es6超好用的语法糖Decorator
Aug 01 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
Nov 14 Javascript
vue 的 solt 子组件过滤过程解析
Sep 07 Javascript
layui使用及简单的三级联动实现教程
Dec 01 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 EOT定界符的使用详解
2008/09/30 PHP
PHP漏洞全解(详细介绍)
2012/11/13 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
php传值赋值和传地址赋值用法实例分析
2015/06/20 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
php生成4位数字验证码的实现代码
2015/11/23 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
2014/01/03 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
JavaScript中的值类型详细介绍
2014/12/29 Javascript
javascript转换日期字符串为Date日期对象的方法
2015/02/13 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
jquery操作ID带有变量的节点实例
2016/12/07 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
2020/06/19 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
vue+web端仿微信网页版聊天室功能
2019/04/30 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
python 中的list和array的不同之处及转换问题
2018/03/13 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Python利用逻辑回归分类实现模板
2020/02/15 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2013/05/03 面试题
教师自我鉴定范文
2013/11/10 职场文书
幼儿园中班班级总结
2015/08/10 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书
使用tensorflow 实现反向传播求导
2021/05/26 Python
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python