原生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 设为首页与加入收藏兼容多浏览器代码
Jan 11 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
Dec 17 Javascript
Flow之一个新的Javascript静态类型检查器
Dec 21 Javascript
Node.js文件操作方法汇总
Mar 22 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
微信小程序 实现拖拽事件监听实例详解
Nov 16 Javascript
vue2.0实现分页组件的实例代码
Jun 22 Javascript
jquery版轮播图效果和extend扩展
Jul 18 jQuery
Vue中的v-for循环key属性注意事项小结
Aug 12 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
jQuery中getJSON跨域原理的深入讲解
Sep 02 jQuery
Openlayers实现地图的基本操作
Sep 28 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在字符断点处截断文字的实现代码
2011/04/21 PHP
PHP中ob_start函数的使用说明
2013/11/11 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
自定义jQuery选项卡插件实例
2013/03/27 Javascript
jquery实现漂浮在网页右侧的qq在线客服插件示例
2013/05/13 Javascript
使用js获取地址栏中传递的值
2013/07/02 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
JS全局变量和局部变量最新解析
2016/06/24 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
easyUI下拉列表点击事件使用方法
2017/05/18 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
python使用递归解决全排列数字示例
2014/02/11 Python
python改变日志(logging)存放位置的示例
2014/03/27 Python
Python pandas常用函数详解
2018/02/07 Python
Python反射的用法实例分析
2018/02/11 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
写自荐信的注意事项
2014/03/09 职场文书
竞选卫生委员演讲稿
2014/04/28 职场文书
爱我中华教学反思
2014/04/28 职场文书
博士论文答辩开场白
2015/06/01 职场文书
python实现简单反弹球游戏
2021/04/12 Python
MySQL 数据表操作
2022/05/04 MySQL