原生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 web对话框与弹出窗口
Feb 22 Javascript
JavaScript 继承详解(一)
Jul 13 Javascript
JavaScript DOM学习第八章 表单错误提示
Feb 19 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
Apr 07 Javascript
使用js对select动态添加和删除OPTION示例代码
Aug 12 Javascript
比较新旧两个数组值得增加和删除的JS代码
Oct 30 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
Nov 19 Javascript
jQuery使用ajaxSubmit()提交表单示例
Apr 04 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
jQuery实现左右滑动的toggle方法
Mar 03 jQuery
layui表格 列自动适应大小失效的解决方法
Sep 06 Javascript
JS时间戳与日期格式互相转换的简单方法示例
Jan 30 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 单引号与双引号的区别
2009/11/24 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
推荐10个提供免费PHP脚本下载的网站
2014/12/31 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
PHP调试的强悍利器之PHPDBG
2016/02/22 PHP
PHP通过引用传递参数用法分析
2016/12/01 PHP
使用IE6看老赵的博客 jQuery初探
2010/01/17 Javascript
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
Jquery getJSON方法详细分析
2013/12/26 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
js调用浏览器打印模块实现点击按钮触发自定义函数
2014/03/21 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
jQuery封装animate.css的实例
2018/01/04 jQuery
微信小程序button组件使用详解
2018/01/31 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
js实现数字滚动特效
2019/12/16 Javascript
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
简单的抓取淘宝图片的Python爬虫
2014/12/25 Python
python按照多个字符对字符串进行分割的方法
2015/03/17 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python正则表达式常用函数总结
2017/06/24 Python
Pycharm更换python解释器的方法
2018/10/29 Python
Python numpy数组转置与轴变换
2019/11/15 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
HTML5是否真的可以取代Flash
2010/02/10 HTML / CSS
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
十周年庆典策划方案
2014/06/03 职场文书
市贸粮局召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
文员岗位职责范本
2015/04/16 职场文书