zoukankan      html  css  js  c++  java
  • 浅析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);
  • 相关阅读:
    Linux.超级管理员root-密码破解
    Hibernate.基础篇《一》.Hibernate工具类.
    不同版本Hibernate.获取SessionFactory的方式
    Hibernate.编写xml文件无自动提示信息
    ubantu中安装TensorFlow遇到的问题
    Ubuntu中安装python3.6(转)
    Linux 用户管理
    虚拟机中Linux安装(转)
    红黑树(转)
    树的遍历方法(转)
  • 原文地址:https://www.cnblogs.com/bianhao9527/p/5886411.html
Copyright © 2011-2022 走看看