原生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实现鼠标滑过小图查看大图的方法
Jul 20 Javascript
React.js入门实例教程之创建hello world 的5种方式
May 11 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
May 31 Javascript
AngularJS 作用域详解及示例代码
Aug 17 Javascript
node.js实现快速截图
Aug 27 Javascript
vue.js的安装方法
May 12 Javascript
纯js实现页面返回顶部的动画(超简单)
Aug 10 Javascript
vue和webpack打包项目相对路径修改的方法
Jun 15 Javascript
js实现图片放大并跟随鼠标移动特效
Jan 18 Javascript
浅谈vue异步数据影响页面渲染
Oct 29 Javascript
JS中的const命令你真懂它吗
Mar 08 Javascript
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
May 18 Vue.js
详解用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
「OVERLORD」动画重要删减!雅儿贝德的背叛?至尊猎杀队结成
2020/04/09 日漫
PHP高级对象构建 多个构造函数的使用
2012/02/05 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
PHP基于工厂模式实现的计算器实例
2015/07/16 PHP
再说AutoComplete自动补全之实现原理
2011/11/05 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
2013/10/20 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
jQuery动画特效实例教程
2014/08/29 Javascript
javascript制作坦克大战全纪录(2)
2014/11/27 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
JS处理json日期格式化问题
2015/10/01 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
基于JS实现计算24点算法代码实例解析
2020/07/23 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
[00:19]CN DOTA NEVER DIE!VG夺冠rOtK接受采访
2019/12/23 DOTA
python中的yield使用方法
2014/02/11 Python
用实例解释Python中的继承和多态的概念
2015/04/27 Python
详细解析Python中的变量的数据类型
2015/05/13 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
浅析python 字典嵌套
2020/09/29 Python
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
蔻驰美国官网:COACH美国
2016/08/18 全球购物
函授毕业自我鉴定
2014/02/04 职场文书
共筑中国梦演讲稿
2014/04/23 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
2016应届毕业生自荐信范文
2016/01/28 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫