zoukankan      html  css  js  c++  java
  • 简单模拟JQuery框架

    模拟JQuery

    1.首先模拟一个jquery对象,在这里起名叫xjs,如下代码:

            var xjs = function(selector) {
                return document.getElementById(selector);
            }
    
            alert(xjs("d1").innerHTML);
    

    但是现在通过xjs返回的是一个dom对象,这跟jquery返回的是一个jquery对象不同。为了让xjs返回本身自己,需要扩展xjs。

     
        var xjs = function(selector) {
            return xjs.fn.init(selector);
        }
    
            
     xjs.fn = xjs.prototype = {
            init: function(selector) {
                if (typeof selector == "string") {
                    this[0] = document.getElementById(selector);
                    return this;
                }
            }
        }
    

    以上代码不对selector合法性检查,就认为其实一个合法的id。像上面代码扩展xjs对象,通过xjs.fn.init返回其本身,这样我通过xjs("")获取的对象就是一个xjs自己了。

    2.给xjs起个简单的别名如$

     
    window.$ = window.xjs = xjs;
    

    这样就能直接用$("")的形式来使用了。

    3.防止命名冲突

    (function() {
        var xjs = function(selector) {
            return xjs.fn.init(selector);
        }
    
        xjs.fn = xjs.prototype = {
            init: function(selector) {
                if (typeof selector == "string") {
                    this[0] = document.getElementById(selector);
                    return this;
                }
            }
        }
    
        window.$ = window.xjs = xjs;
    })();
    

    4.实现xjs.html()

    因为通过$或xjs返回的对象已经是自己本身了,所以要使用innerHTML这类的js属性或方法就必须要把xjs对象转换成dom对象。所以可以跟jquery一样来实现自己的方法。

    (function() {
        xjs.fn = xjs.prototype = {
            init: function(selector) {
                if (typeof selector == "string") {
                    this[0] = document.getElementById(selector);
                    return this;
                }
            },
            html: function() {
                if (arguments.length == 0) {
                    return this[0].innerHTML;
                }
                else {
                    this[0].innerHTML = arguments[0];
                }
            },
            version: "8.8.8"
        }
    

    如果不传参数则获取对象的html内容,如果传入参数,则设置对象的html内为传入的值。

    为了使xjs实例对象继承xjs原型初始的里的方法和属性,通过把xjs原型赋给xjs对象

    xjs.fn.init.prototype = xjs.fn;
    
    这样,在使用的时候就能通过下面的形式来获取version属性
    alert(t.version);
    
    到此为止,一个简单模拟的xjs就完成了,完整代码如下
    (function() {
        var xjs = function(selector) {
            return xjs.fn.init(selector);
        }
    
        xjs.fn = xjs.prototype = {
            init: function(selector) {
                if (typeof selector == "string") {
                    this[0] = document.getElementById(selector);
                    return this;
                }
            },
            html: function() {
                if (arguments.length == 0) {
                    return this[0].innerHTML;
                }
                else {
                    this[0].innerHTML = arguments[0];
                }
            },
            version: "8.8.8"
        }
    
        xjs.fn.init.prototype = xjs.fn;
    
        window.$ = window.xjs = xjs;
    })();
    
    在页面中引入上面这个Js文件后,就能像下面一样使用了
            var t = $("d1");
    
            t.html("hello");
            alert(t.html());
            alert(t.version);
    
    
    上面的d1为一个html元素的id。
  • 相关阅读:
    flash 的跑到模型(转)
    (转载)GC调用时机,特殊内存回收时机,及调试时强制GC
    C语言面试那些事儿──一道指针与数组问题
    【原创】Performanced C++ 经验规则 第五条:再谈重载、覆盖和隐藏
    【原创】Performanced C++ 经验规则 第二条:你不知道的构造函数(中)
    算法探讨——Top K算法详细解析(转载)
    【原创】Performanced C++ 经验规则 目录
    【原创】Performanced C++ 经验规则 第四条:静态和多态,亦敌亦友
    Mac OS X Git安装教程
    【原创】Performanced C++ 经验规则 第三条:你不知道的构造函数(下)
  • 原文地址:https://www.cnblogs.com/xqhppt/p/2106883.html
Copyright © 2011-2022 走看看