JS - 教你制作一个类似于jQuery的小框架(附样例)
jQuery 想必大家都不陌生。作为一个快速、简洁的 JavaScript 框架,它封装许多 JavaScript 常用的功能代码。jQuery 具有许多优秀的特性:比如独特的链式语法和短小清晰的多功能接口,高效灵活的 css 选择器等等。
本文通过仿造 jQuery 功能来构建一个 js 小框架,一来可以让我们能够更好地理解市面上框架的工作原理,二来可以学习下如何将各种对象功能封装成一个框架。
一、实现简单的框架封装
这里我们创建一个名叫 hangge 的框架。它只是一个非常简单的雏形,用来演示如何实现框架的定义,以及属性、方法的扩展。
1,框架代码
//框架对象(叫做hangge) var hangge = function (name) { this.url = "hangge.com"; this.name = name; this.info = function () { console.log('名称:' + this.name + ' 网址:' + this.url); } } //扩展属性 hangge.prototype.country = '中国'; //扩展方法 hangge.prototype.doSomething = function () { console.log(this.name + ' 在做些什么事情!'); }
2,使用样例
//实例化一个对象 var hg = new hangge('航歌'); console.log('--- 调用对象里面的方法 ---'); hg.info(); console.log('--- 调用对象扩展属性和方法 ---'); console.log(hg.country); hg.doSomething();运行结果如下:
二、实现一个真正的框架
前面只是一个简单的演示,下面我们正式来构建一个实现 jQuery 许多基本功能的框架。
1,框架功能
- 实现简单的 id 选择器
- 支持链式调用
- 实现 html 方法(支持获取、或设置 html 内容)
- 实现 attr 方法(支持获取、或设置元素属性)
- 实现 ready 方法(页面所有 dom 对象加载完毕之后才执行)
- 实现 parent 方法(获取父对象)
2,框架代码
//框架对象(叫做hangge) var hangge = function (select) { return hangge.prototype.init(select); } hangge.prototype = { //初始化方法 init:function (select) { this.id_obj = null; //如果是对象类型,就保存当前对象,然后返回this if(select !=null && typeof select == "object"){ this.id_obj = select; return this; } //如果是字符串类型,就获取对象,然后返回this if(select !=null && typeof select == "string" && document.getElementById(select) != null){ this.id_obj = document.getElementById(select); return this; } return this; }, //判断对象是否为空 isNull:function (n) { if(n == null){ return true; } return false; }, html:function (v) { //表示有选择到dom对象 if(!this.isNull(this.id_obj)){ //表示是获取html内容 if(v == undefined){ return this.id_obj.innerHTML; }else if(v != null){ this.id_obj.innerHTML = v; } }else{ return null; } }, attr:function (k,v) { //表示有选择到dom对象 if(!this.isNull(this.id_obj)){ //表示是获取html内容 if(k != null && v == undefined){ return this.id_obj.getAttribute(k); }else if(k != null && v != null){ this.id_obj.setAttribute(k,v); } }else{ return null; } }, ready:function (fn) { document.onreadystatechange=function () { if(document.readyState =='complete'){ fn(); } } }, parent:function () { //如果对象为空,那么就需要返回空对象 if(this.isNull(this.id_obj)) return god(); //如果不为空就需要返回父对象 return hangge(this.id_obj.parentNode); } };
3,使用样例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>hangge.com</title> <script src="hangge.js"></script> <script> //dom元素加载完毕后执行 hangge().ready(function () { //获取元素的html内容 console.log(hangge("li1").html()); //设置元素的html内容 hangge("li1").html("条目1的新内容!") //获取元素的属性 console.log(hangge("li1").attr("date-name")); //设置元素的属性 hangge("li1").attr("date-name",'my-list-1'); //访问父元素,并使用链式调用 console.log(hangge("li1").parent().parent().html()); //alert(god("abc").parent().parent().attr("date-name")); //alert(111); }) </script> </head> <body> <div> <ul> <li id="li1" date-name="list-1">条目1</li> <li id="li2" date-name="list-2">条目2</li> <li id="li3" date-name="list-3">条目3</li> </ul> </div> </body> </html>运行结果如下: