原生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 相关文章推荐
onpropertypchange
Jul 01 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
Jan 12 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
Jan 09 Javascript
Jquery post传递数组方法实现思路及代码
Apr 28 Javascript
用JavaScript获取页面文档内容的实现代码
Jun 10 Javascript
js关于getImageData跨域问题的解决方法
Oct 14 Javascript
基于jQuery实现文字打印动态效果
Apr 21 jQuery
es6 字符串String的扩展(实例讲解)
Aug 03 Javascript
微信小程序之自定义组件的实现代码(附源码)
Aug 02 Javascript
如何解决日期函数new Date()浏览器兼容性问题
Sep 11 Javascript
JS运算符简单用法示例
Jan 19 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页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
2013/06/03 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
php GUID生成函数和类
2014/03/10 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
关于this和self的使用说明
2010/08/01 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
js自定义回调函数
2015/12/13 Javascript
yarn与npm的命令行小结
2016/10/20 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
2017/03/06 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
Django使用多数据库的方法
2017/09/06 Javascript
小程序实现发表评论功能
2018/07/06 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
小程序简单两栏瀑布流效果的实现
2019/12/18 Javascript
vue.js实现简单的计算器功能
2020/02/22 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
python删除过期文件的方法
2015/05/29 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
Pytorch maxpool的ceil_mode用法
2020/02/18 Python
Python实现Word表格转成Excel表格的示例代码
2020/04/16 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
旷课检讨书2000字
2014/01/14 职场文书
入党自我评价优缺点
2014/01/25 职场文书
班组长岗位职责
2014/03/03 职场文书
超越自我演讲稿
2014/05/21 职场文书
应届大专生求职信
2014/06/26 职场文书
2014年最新个人对照检查材料范文
2014/09/25 职场文书
《夹竹桃》教学反思
2016/02/23 职场文书