当前位置: > > > JS - 教你制作一个类似于jQuery的小框架(附样例)

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>
运行结果如下:

评论0