浅析jQuery库的核心架构和常用API的简单实现

以下代码只是呈现了jQuery库中的原型继承的实现原理,以及其常用功能模块的简单实现,并不涉及过多的兼容性处理

//This is my$;(function (window , undefined) {    //核心架构    function my$(selector){        //使用构造函数,创建my$对象,构造函数是其原型中的一个方法        return new my$.prototype.init(selector);    }    my$.fn = my$.prototype = {        constructor : my$,        type : my$,        events : {},        length : 0 ,        //核心模块init        init : function (selector) {            if(!selector){                return this ;            }            //如果参数是字符串            if(typeof selector ==="string"){                //如果是html标签                if(selector.charAt(0) === "<"){                    [].push.apply(this , this.constructor.parseHtml(selector));                }else{                    //如果参数是选择器,                    [].push.apply(this , this.constructor.Select(selector));                }                return this;            }            //如果参数是入口函数            if(typeof selector === "function"){                var oldfn = window.onload ;                window.onload = function(){                    oldfn && oldfn();                    selector();                }            }            //如果参数的DOM元素            if(selector.nodeType){                this[this.length ++] = selector;                return this;            }            //如果参数是my$对象            if(selector.type === "my$"){                //return selector;                [].push.apply(this , selector);                return this ;            }            //如果参数是伪数组对象            if(selector.length >= 0){                [].push.apply(this, selector);                return this ;            }else{                this[0] = selector;                this.length = 1;            }            return this;        },        //常用方法模块        toArray : function () {            return [].slice.apply(this);        },        get : function (index) {            if(index === undefined){                return this.toArray();            }else {                if(index >= 0){                    return this[index];                }                return this[this.length + index];            }        },        eq : function(index){            return this.constructor(this.get(index));        },        each : function(callback){            this.constructor.each(this , callback);            return this;        },        map : function(callback){            return this.constructor.map(this , callback);        },        end : function () {            return this.prev || this ;        }    }    //实现原型链继承结构    my$.prototype.init.prototype = my$.fn;    //实现添加方法的功能    my$.fn.extend = my$.extend = function(obj){        for(var k in obj){            this[k] = obj[k];        }    }    //---------------工具方法模块------------------------------------    //创建标签功能    my$.parseHtml = (function () {        var node = document.createElement("div");        return function (str){            var arr = [];            node.innerHTML = str ;            arr.push.apply(arr , node.childNodes);            return arr ;        }    })();    //选择器模块    my$.Select = (function () {        //不考虑兼容问题的简单实现就是采用querySelectAll的方法        var support = {},//能力检测            rnative = /\[nativecode\]/,            push = [].push;        support.qsa = rnative.test( document.querySelectorAll + "");        var Select  = function( selector) {            if (support.qsa) {                return document.querySelectorAll(selector);            }        }        return Select;    })();    //---------------------添加工具方法------------------------    my$.extend({        each : function(arr , callback){            if( arr.length >= 0){                for(var i = 0 ; i < arr.length ; i ++){                    if( callback.call(arr[i] , i , arr[i] ) === false){                        break;                    }                }            } else{                for(var k in arr){                    if( callback.call(arr[k] , k , arr[k]) === false){                        break;                    }                }            }            return arr;        },        map : function(arr , callback){            var newArr = [];            if( arr.length >= 0){                for(var i = 0 ; i < arr.length ; i ++){                    var res = callback(arr[i] , i)                    if( res !== undefined){                        newArr.push(res);                    }                }            }else {                for(var k in arr){                    var res = callback(arr[k] , k)                    if( res  !== undefined){                        newArr.push( res );                    }                }            }            return newArr;        },        //DOM操作        append : function (parent , newchild ) {            parent.appendChild(newchild);        },        //样式操作        getStyle : function (dom ,name) {            if(dom.currentStyle){                return dom.constructor[name];            }else{                return window.getComputedStyle(dom , null)[name];            }        },        //属性操作        getText : function (dom) {            if(dom.innerText){                return dom.innerText;            }else{                return dom.textContent;            }        }        //可以继续添加...    });

    //实例方法 --- DOM操作    my$.fn.extend({        appendTo : function (nodes){            var list =  this.constructor(nodes);            var newObj = this.constructor() ;            var temp ;            for(var i = 0 ; i < list.length ; i ++){                for(var j = 0 ; j < this.length ; j ++){                    temp = i === 0                        ? this[j]                        : this[j].cloneNode(true);                    list[i].appendChild( temp );                    newObj[ newObj.length ++ ] = temp;                }            }            newObj.prev = this;            return newObj;        },        append : function(nodes){            this.constructor(nodes).appendTo(this);            return this;        }        //可以继续添加...    });    //事件函数    my$.fn.extend({        on : function ( type , fn ) {            return this.each(function(i , v ){                v.addEventListener(type , fn);            });        },        off : function( type , fn ){            return this.each(function( i , v ){                v.removeEventListener( type , fn );            });        }    })    my$.each(("onblur,onfocus,onclick,onmousedown,onmouseenter,onmouseleave,onmousemove,onmouseout," +        "onmouseover,onmouseup,onmousewheel,onkeydown,onkeypress,onkeyup").split(",")        , function ( i , v) {            var event = v.slice(2);            my$.fn[event] = function(callback){                return this.on( event , callback);            };        });    //样式操作    my$.fn.extend({        css : function (name , value) {            if(typeof name === "string" && typeof value === "string"){                this.each(function () {                    this.style[name] = value;                })            }else if(typeof name === "string" && value === undefined){                return this[0].style[name];            }else if(typeof name === "object" && value === undefined){                this.each(function () {                    for(var k in name){                        this.style[k] = name[k];                    }                })            }            return  this ;        }    });

    //属性操作    my$.fn.extend({        attr : function (name , value) {            if(typeof name === "string" && typeof value === "function"){                this.each(function ( i , v) {                    this.setAttribute(name , value.call(this , v , i));                });

            }else if(typeof name === "string" && typeof value === "string"){                this.each(function () {                    this.setAttribute(name , value);                });

            }else if(typeof name === "string" && value === undefined){                return this[0].getAttribute(name);            }else if(typeof name === "object" && value === undefined){                this.each(function () {                    for(var k in name){                        this.setAttribute( k , name[k]);                    }                });            }            return  this ;        },        html : function (value) {;            if(typeof value === ‘string‘){                this.each(function () {                    this.innerHTML = value;                });            }else if( value === undefined){                return this[0].innerHTML ;            }            return this ;        }    });

    window.my$ = window.$ = my$ ;})(window);
时间: 2024-11-05 16:03:36

浅析jQuery库的核心架构和常用API的简单实现的相关文章

kafka中常用API的简单JAVA代码

通过之前<kafka分布式消息队列介绍以及集群安装>的介绍,对kafka有了初步的了解.本文主要讲述java代码中常用的操作. 准备:增加kafka依赖 <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.10.2.0</version> </dependenc

Hadoop核心架构(1)

在大数据的发展过程中,出现了一批专门应用与大数据的处理分析工具,如Hadoop,Hbase,Hive,Spark等,我们先从最基础的Hadoop开始进行介绍 Hadoop是apache基金会下所开发的分布式基础架构,实现了一个分布式文件系统(HDFS),HDFS拥有高容错性.高可靠性.高扩展性.高效性.低成本的特性,可以让用户在不了解相关的底层源码的情况下,在廉价的机器上搭配一台完整的服务器进行分布式程序开发,利用集群的高速运算和存储处理自己的业务. 一个应用程序无非就是计算和存储两个部分,Ha

ios系统架构及常用框架

1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media layer).核心服务层(Core Services layer).核心操作系统层(Core OS layer)如图: (1) 触摸层:为应用程序开发提供了各种常用的框架并且大部分框架与界面有关,本质上来说它负责用户在iOS设备上的触摸交互操作.它包括以下这些组件: Multi-Touch Event

jQuery库冲突

jQuery库冲突解决办法 一次面试中面试官问到jQuery和别的库冲突怎么解决?虽然以前看过,但是我已经不记得了. 我的思路就是如果让我来设计,那我就用一个默认值$,不传参数,那就用$,最后就挂载在window.$上,传参数就用传入名字,比如传入jq,那我就挂载在window.jq上. var myControl="jq"; (function(name){ var $=name ||"$"; //name存在$的值就是name的值,不存在或为null,$的值为字

很容易学习的JQuery库 : (三) 事件

jQuery 是为事件处理特别设计的. 一.事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.术语由事件"触发"(或"激发")经常会被使用. 通常会把 jQuery 代码放到 <head>部分的事件处理方法中: 实例 <span style="font-size:18px;"><html> <head> <scr

很容易学习的JQuery库 : (一) 简介

jQuery 是一个 JavaScript 库: jQuery 极大地简化了 JavaScript 编程: jQuery 很容易学习. 上面的三句话是结合最近的学习整理后的心得,个人感觉可以很好地解释JQuery. 一.是什么      jQuery,顾名思义,也就是JavaScript和查询(Query),即是辅助JavaScript开发的库. jQuery是一个兼容多浏览器的javascript库,核心理念是write less,do more(写得更少,做得更多). jQuery使用户能更

我自己的Javascript 库,封装了一些常用函数 Kingwell.js

我自己的Javascript 库,封装了一些常用函数 Kingwell.js 博客分类: Javascript javascript 库javascript库 现在Javascript库海量,流行的也多,比如jQuery,YUI等,虽然功能强大,但也是不万能的,功能不可能涉及方方面面,自己写一个的JS库是对这些的补充,很多也比较实用,把应用到项目中中去也比较方面,这也是对工作的一些积累,也加深对知识的理解. 2012-6-20更新,添加设置Cookie,获取Cookie,删除Cookie方法.很

SpringMVC核心架构具体流程

从网上挑出来的 孔子说了:磨刀不误砍柴工,先把这些基本而核心的概念弄懂了再下手,也不晚(不为过) Spring MVC核心架构的具体流程(步骤)如下: 1.首先用户发送请求  DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其它的解析器进行处理,作为统一访问点,进行全局的流程控制 2.DispatcherServlet  HandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handle

使用Google的CDN JQuery库(摘录)

CDN的全称是Content Delivery Network,即内容分发网络.其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可 以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度.从技术上全面解决由于网络带宽小.用户访问量大.网点分布不均等原因所造成的用户访问网站响应速度慢的问题.更多介绍看这里:http://code.google.com/p/mydocspace/wiki/CDN 我