原生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 相关文章推荐
验证javascript中Object和Function的关系的三段简单代码
Jun 27 Javascript
JS中FRAME的操作问题实例分析
Oct 21 Javascript
JS实现自适应高度表单文本框的方法
Feb 25 Javascript
javascript实现设置、获取和删除Cookie的方法
Jun 01 Javascript
Javascript控制div属性动态变化实例分析
Oct 08 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
Sep 08 Javascript
详解Vue组件实现tips的总结
Nov 01 Javascript
详解react内联样式使用webpack将px转rem
Sep 13 Javascript
jQuery HTML获取内容和属性操作实例分析
May 20 jQuery
vuex 多模块时 模块内部的mutation和action的调用方式
Jul 24 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
Oct 26 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中的output_buffering详细介绍
2014/09/27 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
Yii框架参数配置文件params用法实例分析
2019/09/11 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
JavaScript Archive Network 集合
2007/05/12 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
探究JavaScript函数式编程的乐趣
2015/12/14 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
js获取元素的外链样式的简单实现方法
2016/06/06 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
微信小程序 弹幕功能简单实例
2017/02/14 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
JQuery属性操作与循环用法示例
2019/05/15 jQuery
layer提示框添加多个按钮选择的实例
2019/09/12 Javascript
解决vant-UI库修改样式无效的问题
2020/11/03 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
Python线程中对join方法的运用的教程
2015/04/09 Python
Python基本socket通信控制操作示例
2019/01/30 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
python压包的概念及实例详解
2021/02/17 Python
植物选择:Botanic Choice
2017/02/15 全球购物
编写strcpy函数
2014/06/24 面试题
残疾人小组计划书
2014/04/27 职场文书
保护环境演讲稿
2014/05/10 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
2014幼儿园教育教学工作总结
2014/12/17 职场文书
企业愿景口号
2015/12/25 职场文书
《称赞》教学反思
2016/02/17 职场文书
入党转正申请自我鉴定
2019/06/25 职场文书