jquery的简单实现,jquery-me.js

完整代码

(function(global, factory) {

    typeof define === 'function' ? define(factory) : global.$ = factory();

})(this, function() {

    var jQuery = function(selector) {

        return new jQuery.fn.init(selector);

    }

    var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;

    jQuery.trim = function(text) {

        return text == null ? "" : (text + "").replace(rtrim, "");

    }

    jQuery.each = function(obj, callback) {

        var i, length = obj.length;

        for(i = 0; i < length; i++) {

            if(callback.call(obj[i], i) === false) break;

        }

        return obj;

    }

    jQuery.ajax = function(obj) {

        var ajax, k, response, isJSON = obj.dataType && 'JSON' == obj.dataType.toUpperCase();

        var url = 'string' == typeof obj.url ? obj.url : location.href;

        var isPOST, type = (isPOST = obj.type && 'POST' == obj.type.toUpperCase()) ? 'POST' : 'GET';

        var data = '';

        if('object' == typeof obj.data) {

            for(k in obj.data) {

                data = data + '&' + k + '=' + encodeURIComponent(obj.data[k]);

            }

            data = data.substring(1);

        } else if('srting' == typeof obj.data) {

            data = obj.data;

        }

        if(XMLHttpRequest) {

            ajax = new XMLHttpRequest();

        } else if(ActiveXObject) {

            ajax = new ActiveXObject("Microsoft.XMLHTTP");

        } else return;

        !isPOST && (url = url + '?' + data);

        ajax.open(type, url, false === obj.async ? false : true);

        ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

        ajax.send(isPOST ? data : null);

        ajax.onreadystatechange = function() {

            if(ajax.readyState == 4) {

                if(ajax.status == 200) {

                    response = jQuery.trim(ajax.responseText);

                    response = isJSON ? JSON.parse(response) : response;

                    obj.success && obj.success.call({}, response);

                } else {

                    obj.error && obj.error.call({}, ajax.status, ajax.statusText);

                }

            }

        }

    }

    jQuery.event = {

        add: function(elem, type, selector, fn) {

            elem.each(function() {

                if(this.addEventListener) {

                    this.addEventListener(type, eventDo(this));

                } else if(this.attachEvent) {

                    this.attachEvent('on' + type, eventDo(this));

                } else return;

            });

            function eventDo(docElem) {

                if(selector) {

                    return function() {

                        jQuery(docElem).find(selector).each(function() {

                            if(this === document.elementFromPoint(event.clientX, event.clientY)) {

                                'function' === typeof fn && fn.call(this);

                            }

                        });

                    }

                } else {

                    return function() {

                        'function' === typeof fn && fn.call(docElem);

                    }

                }

            }

        }

    };

    var textType = typeof document.textContent === 'undefined' ? 'innerText' : 'textContent';

    jQuery.fn = jQuery.prototype = {

        length: 0,

        init: function(selector) {

            this.length = 1;

            this[0] = document;

            if(!selector) {

                return this;

            } else if(typeof selector === 'string') {

                return this.find(selector);

            } else if(selector.nodeType) {

                this[0] = selector;

            }

            return this;

        },

        find: function(selector) {

            if(typeof selector != 'string') return this;

            var i, elems, elem = jQuery();

            delete elem[0];

            elem.length = 0;

            this.each(function() {

                elems = this.querySelectorAll(selector);

                for(i = 0; i < elems.length; i++) {

                    elem[elem.length] = elems[i];

                    elem.length++;

                }

            });

            return elem;

        },

        each: function(callback) {

            return jQuery.each(this, callback);

        },

        parent: function() {

            var elem = jQuery();

            delete elem[0];

            elem.length = 0;

            this.each(function(i) {

                elem[i] = this.parentNode;

                elem.length++;

            });

            return elem;

        },

        check: function() {

            var elem = jQuery();

            delete elem[0];

            elem.length = 0;

            this.each(function() {

                if(this.checked) {

                    elem[elem.length] = this;

                    elem.length++;

                }

            });

            return elem;

        },

        remove: function() {

            return this.each(function() {

                if(this && this.parentNode) {

                    this.parentNode.removeChild(this);

                }

            });

        },

        append: function(htmlstr) {

            return domManip(this, htmlstr, function(elem) {

                if(this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {

                    this.appendChild(elem);

                }

            });

        },

        prepend: function(htmlstr) {

            return domManip(this, htmlstr, function(elem) {

                if(this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {

                    this.insertBefore(elem, this.firstChild);

                }

            });

        },

        before: function(htmlstr) {

            return domManip(this, htmlstr, function(elem) {

                if(this.parentNode) {

                    this.parentNode.insertBefore(elem, this);

                }

            });

        },

        after: function(htmlstr) {

            return domManip(this, htmlstr, function(elem) {

                if(this.parentNode) {

                    this.parentNode.insertBefore(elem, this.nextSibling);

                }

            });

        },

        empty: function() {

            return this.each(function() {

                if(this.nodeType === 1) {

                    this[textType] = "";

                }

            });

        },

        text: function(value) {

            if(value === undefined) {

                return this[0] && this[0][textType] || '';

            } else {

                return this.empty().each(function() {

                    if(this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {

                        this[textType] = value;

                    }

                });

            }

        },

        html: function(value) {

            if(value === undefined) {

                return this[0] && this[0].innerHTML || '';

            } else {

                return this.empty().each(function() {

                    if(this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {

                        this.innerHTML = value;

                    }

                });

            }

        },

        val: function(value) {

            if(value === undefined) {

                return this[0] && this[0].value || '';

            } else {

                return this.empty().each(function() {

                    if(this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {

                        this.value = value;

                    }

                });

            }

        },

        on: function(type, selector, fn) {

            if(fn == undefined) {

                fn = selector;

                selector = undefined;

            }

            jQuery.event.add(this, type, selector, fn);

            return this;

        },

        css: function(name, value) {

            return this.each(function() {

                this.style[name] = value;

            });

        },

        addClass: function(className) {

            return this.each(function() {

                this.className = this.className + ' ' + className;

            });

        },

        removeClass: function(className) {

            return this.each(function() {

                this.className = this.className.replace(new RegExp(className, "g"), '').replace(/^\s+|\s+$/g, '');

            });

        },

        data: function(name, value) {

            if(value === undefined) {

                return this[0] && (this[0].dataset ? this[0].dataset[name] : this[0].getAttribute('data-' + name)) || '';

            } else {

                return this.each(function() {

                    if(this.dataset) {

                        this.dataset = value;

                    } else {

                        this.setAttribute('data-' + name, value);

                    }

                });

            }

        }

    }

    function domManip(collection, htmlstr, callback) {

        if(typeof htmlstr != 'string') return collection;

        var node, first, tmp, i, l = collection.length;

        var iNoClone = l - 1;

        if(l) {

            node = buildNode(htmlstr, collection[0].ownerDocument);

            first = node.firstChild;

            if(node.childNodes.length === 1) {

                node = first;

            }

            if(first) {

                for(i = 0; i < l; i++) {

                    if(i !== iNoClone) {

                        tmp = node.cloneNode(true);

                    } else {

                        tmp = node;

                    }

                    callback.call(collection[i], tmp);

                }

            }

        }

        return collection;

    }

    function buildNode(htmlstr, context) {

        var fragment = context.createDocumentFragment();

        var node = fragment.appendChild(context.createElement("div"));

        node.innerHTML = htmlstr;

        return node;

    }

    jQuery.fn.init.prototype = jQuery.fn;

    return jQuery;

});

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容