jQuery 2.1.4版本的源码分析

jQuery 2.1.4版本的源码分析

jquery中获取元素的源码分析

jQuery.each({
// 获取当前元素的父级元素 parent:
function(elem) { var parent = elem.parentNode;
//nodeType为11的节点类型是DocumentFragment
return parent && parent.nodeType !== 11 ? parent : null; },
//获取所有的 父节点 这涉及到 dir 方法 parents:
function(elem) { return jQuery.dir(elem, "parentNode"); }, parentsUntil: function(elem, i, until) { return jQuery.dir(elem, "parentNode", until); }, next: function(elem) { return sibling(elem, "nextSibling"); }, prev: function(elem) { return sibling(elem, "previousSibling"); }, nextAll: function(elem) { return jQuery.dir(elem, "nextSibling"); }, prevAll: function(elem) { return jQuery.dir(elem, "previousSibling"); }, nextUntil: function(elem, i, until) { return jQuery.dir(elem, "nextSibling", until); }, prevUntil: function(elem, i, until) { return jQuery.dir(elem, "previousSibling", until); },
     //返回所有的兄弟节点 siblings:
function(elem) { return jQuery.sibling((elem.parentNode || {}).firstChild, elem); }, children: function(elem) { return jQuery.sibling(elem.firstChild); },
    //返回框架里面的所有内容 或者 元素的所有子节点 contents:
function(elem) { return elem.contentDocument || jQuery.merge([], elem.childNodes); } }, function(name, fn) { jQuery.fn[name] = function(until, selector) { var matched = jQuery.map(this, fn, until); if(name.slice(-5) !== "Until") { selector = until; } if(selector && typeof selector === "string") { matched = jQuery.filter(selector, matched); } if(this.length > 1) { // Remove duplicates if(!guaranteedUnique[name]) { jQuery.unique(matched); } // Reverse order for parents* and prev-derivatives if(rparentsprev.test(name)) { matched.reverse(); } } return this.pushStack(matched); }; });

 

jQuery.extend({
// 寻找父级 直到 找到until结束 根据parents 方法可知 dir = parentNode dir:
function(elem, dir, until) { var matched = [], truncate = until !== undefined;         //进入循环的条件 不是根节点 且 且吧父节点复制给elem while((elem = elem[dir]) && elem.nodeType !== 9) { if(elem.nodeType === 1) {
            //跳出循环
if(truncate && jQuery(elem).is(until)) { break; } matched.push(elem); } } return matched; },          //通过上面的源码next方法可知 elem = nextSiblilng sibling: function(n, elem) { var matched = []; for(; n; n = n.nextSibling) { if(n.nodeType === 1 && n !== elem) { matched.push(n); } } return matched; } });

这里说一下 nextSibling 与 nextElementSibling的区别

nextSibling :返回元素之后的兄弟节点 (包含 注释 文本)

nextElementSibling:返回元素之后的兄弟节点 不包括注释 跟文本 且他的属性只为读

jQuery.noConflict源码分析

var
    // 将JQuery挂载到Windows对象下
        _jQuery = window.jQuery,

        // 将$挂载到Windows对象下
        _$ = window.$;
   // 当调用 Jquery.noConfict  deep ==false  那么  $ 别名失效  如果   deep==true 那么 JQuery 的别名失效
    jQuery.noConflict = function(deep) {
        if(window.$ === jQuery) {
            window.$ = _$;
        }

        if(deep && window.jQuery === jQuery) {
            window.jQuery = _jQuery;
        }

        return jQuery;
    };

    // Expose jQuery and $ identifiers, even in AMD
    // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
    // and CommonJS for browser emulators (#13566)
    if(typeof noGlobal === strundefined) {
        window.jQuery = window.$ = jQuery;

2016-11-22   21:14:38

0 条评论
发表一条评论