封装一个自己的js库

仿照jQuery封装一个自己的js库

接下来,我讲封装一个仿jQuery的库,主要包含jQuery中绑定,css,等方法,我讲它定义为 "HQuery"

$符号的封装

jQuery中的 $ 符号意味着什么?
先思考一下jQuery库中alert(typeof $)的结果,它是一个对象,也是一个函数
所以美元符$字面上是jQuery,其实就是一个jq对象,里面可以接受函数,字符串,还要一种是对象(比如this)
给自己的Hquery填加$符号:

function $(arg) {
    return new Hquery(arg)
}

Hquery是基于面向对象实现的,所以我们需要先写构造函数,为了方便遍历和其他方法的操作,所有内容返回到一个数组中,这个数组衣服于Hquery对象存在,之后将为这个Hquery对象属性添加方法

function Hquery(arg){ //参数是变体变量
 this.elements = [] // 选择器选择的元素放到这个数组中
}
选择器的封装:

我们使用Hquery操作DOM等实现一系列的功能,选择器是必不可少的,所有我们首先封装好选择器,这样就可以能省去document.getElementsByClass等等麻烦的操作

// 通过class选择元素 因为class可以有多个,所以我们需要push一下
function getByClass(oParent, sClass) {
    var aClass = [];
    var elems = oParent.getElementsByTagName('*')
    for (var i=0; i<elems.length; i++){
        if (elems[i].className == sClass){
            aClass.push(elems[i])
        }
    }
    return aClass
}

// 构造函数
function Hquery(arg) {
    this.elements = [];

    switch (typeof arg){
        case 'function': // 如果传进来的是function,那么window.onload
          /*  window.onload = arg; // 通过on的方式绑定事件会产生覆盖,*/
            bindEvent(window, 'load', arg)
            break;

        case 'string':
            switch (arg.charAt(0)){
                case '#': //id 选择器
                    this.elements.push(document.getElementById(arg.substring(1)))
                    break;

                case '.':
                    this.elements=getByClass(document, arg.substring(1))
                    break;

                default:
                    this.elements = toArray(document.getElementsByTagName(arg))
                    break;
            }
            break;
        case 'object':
            this.elements.push(arg)
            break;
    }
}
封装事件:
function bindEvent(obj, event, fn) {
    if (obj.addEventListener){ //在标准浏览器下
        obj.addEventListener(event, fn, false)
    } else { // IE浏览器下
        obj.attachEvents('on' + event, fn)
    }
}

// click方法
Hquery.prototype.click=function (fn) {
    // for (var i=0;i<this.elements.length;i++){
    //     bindEvent(this.elements[i], 'click', fn)
    // }

    this.on('click', fn) // 上面两行是本来写法, 我这里改成了事件委托,更高效
}

// mouseover方法
Hquery.prototype.mouseover=function (fn) {
    // for (var i=0;i<this.elements.length;i++){
    //     bindEvent(this.elements[i], 'mouseover', fn)
    // }

    this.on('mouseover', fn)// 上面两行是本来写法, 我这里改成了事件委托,更高效
}

// on方法
Hquery.prototype.on=function (event, fn) {
    for (var i=0;i<this.elements.length;i++){
        bindEvent(this.elements[i], event, fn)
    }
}
hide和show也是比较常用的方法:
// hide
Hquery.prototype.hide = function () {
    for (var i=0;i<this.elements.length;i++){
        this.elements[i].style.display = 'none'
    }
}

// show
Hquery.prototype.show = function () {
    for (var i=0;i<this.elements.length;i++){
        this.elements[i].style.display = 'block'
    }
}
eq方法
// eq
Hquery.prototype.eq = function (index) {
    //返回出来的是元素对象,原生下面没有css(),肯定没有,所以此时需要换为$下的对象
    return $(this.elements[index])
}

其他的方法,我就不一一介绍了,下面直接给大家上一个多种方法封装好的,大家k'y

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容