原生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打造支持汉字,拼音,英文快速定位查询的超级select插件
Jun 18 Javascript
javascript权威指南 学习笔记之变量作用域分享
Sep 28 Javascript
Jquery 分页插件之Jquery Pagination
Aug 25 Javascript
javascript图片预加载完整实例
Dec 10 Javascript
JavaScript仿支付宝6位数字密码输入框
Dec 29 Javascript
node.js入门学习之url模块
Feb 25 Javascript
ES6新特性之Object的变化分析
Mar 31 Javascript
JavaScript调试之console.log调试的一个小技巧分享
Aug 07 Javascript
vue cli构建的项目中请求代理与项目打包问题
Feb 26 Javascript
vue+Element实现搜索关键字高亮功能
May 28 Javascript
Vue使用v-viewer实现图片预览
Oct 21 Javascript
vue实现抽屉弹窗效果
Nov 15 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初学入门
2006/11/19 PHP
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP MySql增删改查的简单实例
2016/06/21 PHP
Thinkphp框架开发移动端接口(2)
2016/08/18 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
显示js对象所有属性和方法的函数
2009/10/16 Javascript
javascript &&和||运算法的另类使用技巧
2009/11/28 Javascript
javascript类型转换示例
2014/04/29 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
jquery获取radio值实例
2014/10/16 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
js获取腾讯视频ID的方法
2016/10/03 Javascript
用js屏蔽被http劫持的浮动广告实现方法
2017/08/10 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
Python IDLE入门简介
2017/12/08 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
Html5页面二次分享的实现
2018/07/30 HTML / CSS
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
介绍一下linux的文件系统
2012/03/20 面试题
小学生学习感言
2014/03/10 职场文书
全运会口号
2014/06/20 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
思想作风建设心得体会
2014/10/22 职场文书
幼儿园五一劳动节活动总结
2015/02/09 职场文书
2015年公务员试用期工作总结
2015/05/28 职场文书
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
索尼ICF-5900W收音机测评
2022/04/24 无线电