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

jQuery 2.1.4版本的源码分析的更多相关文章

  1. jQuery实现DOM加载方法源码分析

    传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... }  但 ...

  2. jQuery deferred应用之ajax详细源码分析(二)

    在上一节中,我只贴出了$.Deferred的源码分析,并没用讲解怎么使用它,现在我们先看看$.ajax是如何使用它,让我们进行异步任务的处理. 如果没看上节的代码,请先稍微了解一下jQuery Def ...

  3. jQuery().end()的内部实现及源码分析

    jQuery().end()的作用是返回当前jQuery对象的上一个状态. 1.end()源码: // 所有通过pushStack方法获得的jQuery对象都可以通过end方法返回之前的状态   // ...

  4. jQuery-1.9.1源码分析系列(十六)ajax——响应数据处理和api整理

    ajax在得到请求响应后主要会做两个处理:获取响应数据和使用类型转化器转化数据 a.获取响应数据 获取响应数据是调用ajaxHandleResponses函数来处理. ajaxHandleRespon ...

  5. angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)

    昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...

  6. jQuery1.9.1源码分析--数据缓存Data模块

    jQuery1.9.1源码分析--数据缓存Data模块 阅读目录 jQuery API中Data的基本使用方法介绍 jQuery.acceptData(elem)源码分析 jQuery.data(el ...

  7. JDK源码分析(6)ConcurrentHashMap

    JDK版本 ConcurrentHashMap源码分析 table:默认为null,初始化发生在第一次插入操作,默认大小为16的数组,用来存储Node节点数据,扩容时大小总是2的幂次方. nextTa ...

  8. JDK1.8源码分析03之idea搭建源码阅读环境

    序言:上一节说了阅读源码的顺序,有了一个大体的方向,咱们就知道该如何下手.接下来,就要搭建一个方便阅读源码及debug的环境.有助于跟踪源码的调用情况. 目前新开发的项目, 大多数都是基于JDK1.8 ...

  9. drf源码分析系列---版本控制

    版本的使用 第一步:写路由url(r'^api/(P<version>\w+)/user/$',views.UserView.as_view()), 第二步:写模块导入from rest_ ...

随机推荐

  1. 转载关于reset vector 和 exception vector

    在NIOS II学习过程中设置CPU参数的时候,遇到Reset Vector和Exception Vector的设置.参数设置画面如下图所示. Reset Vector——复位向量Exception ...

  2. 【转载】Allegro Auto Rename器件反标注教程

    Cadence设计时一般不主张在PCB文件中更改Logic(PADS的ECO更改),不过Auto Rename仍然是非常实用的功能,按照布局重排位号,可以让PCB的丝印标识更清晰,容易检查,位号易找, ...

  3. eclipse解决git冲突举例

    本地修改了两个文件,提交时提示有冲突,想来应该是没有从远程仓库下载最新代码导致的.通过右击项目 -> Team -> Sychronized WorkSpace,比较本地仓库和远程仓库的异 ...

  4. python学习之logging

    学习地址:http://blog.csdn.net/zyz511919766/article/details/25136485 首先如果我们想简要的打印出日志,可以: import logging l ...

  5. str_split的用法(PHP学习)

    str_split的用法: 先看看PHP手册是怎么说的 array str_split ( string $string [, int $split_length = 1 ] ) str_split返 ...

  6. C++ 中的 new/delete 和 new[]/delete[]

    在 C++ 中,你也许经常使用 new 和 delete 来动态申请和释放内存,但你可曾想过以下问题呢? new 和 delete 是函数吗? new [] 和 delete [] 又是什么?什么时候 ...

  7. Oracle中遇到的错误

    1. ORA-00937: 不是单组分组函数  和  不是group by表达式 --select count(corp_tn),state_code from t_oa_main where cor ...

  8. 显示等待 之 text_to_be_present_in_element 判断元素是否有xx 文本信息 用法

  9. atorg.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:557)

    错误原因: 你当前开发环境中{Hadoop_HOME}\bin\hadoop.dll 文件和你当前的hadoop版本不匹配.  解决方案: 网络下载相应版本的hadoop.dll,并将该文件放入c:\ ...

  10. PHP传入数组到js

    1.方式一,处理成字符串 js再将字符串处理成数组. var spec1_default = "{$spec1_default}"; spec1_default = spec1_d ...