之所以把这部分放在这里,是因为这里用到了一些基本API,前一篇介绍过后才能使用。

//jQuery通过find方法调用Sizzle引擎
//jQuery通过find方法调用Sizzle引擎
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.pseudos;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;var rneedsContext = jQuery.expr.match.needsContext;//匹配没有其他如class等任何属性的标签,就是简单标签,
//如<input />和<div></div>
var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);//当selector为 .header这样的形式则为简单选择符
var risSimple = /^.[^:#\[\.,]*$/;// Implement the identical functionality for filter and not
//比较难啃的一个函数,传入参数有几种用法。后面的多个过滤函数都依赖于这个函数
//第一个参数表示element元素集,第二个参数传入过滤函数、DOM、选择符、数组,第三个参数为预设结果
function winnow( elements, qualifier, not ) {if ( jQuery.isFunction( qualifier ) ) {return jQuery.grep( elements, function( elem, i ) {/* jshint -W018 */return !!qualifier.call( elem, i, elem ) !== not;});}if ( qualifier.nodeType ) {return jQuery.grep( elements, function( elem ) {return ( elem === qualifier ) !== not;});}if ( typeof qualifier === "string" ) {if ( risSimple.test( qualifier ) ) {return jQuery.filter( qualifier, elements, not );}qualifier = jQuery.filter( qualifier, elements );}return jQuery.grep( elements, function( elem ) {return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;});
}//过滤函数
jQuery.filter = function( expr, elems, not ) {var elem = elems[ 0 ];if ( not ) {expr = ":not(" + expr + ")";}//其实这两个区别不大,都要调用Sizzlereturn elems.length === 1 && elem.nodeType === 1 ?jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {return elem.nodeType === 1;}));
};//开始jQuery对象的原型进行扩展
jQuery.fn.extend({find: function( selector ) {var i,ret = [],self = this,len = self.length;//当传入的参数是字符串类型时,调用下面的filter方法,本质是调用上面的winnow,winnow里又视情况调用sizzleif ( typeof selector !== "string" ) {return this.pushStack( jQuery( selector ).filter(function() {console.log('find');console.log(self);for ( i = 0; i < len; i++ ) {//如果self包含符合selector的this,注意这里的this是新的jQuery对象if ( jQuery.contains( self[ i ], this ) ) {return true;}}}) );}//否则以self[i]为查找上下文context进行查找for ( i = 0; i < len; i++ ) {jQuery.find( selector, self[ i ], ret );}// Needed because $( selector, context ) becomes $( context ).find( selector )//这里是正常的压栈和选择符拼接ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );ret.selector = this.selector ? this.selector + " " + selector : selector;return ret;},filter: function( selector ) {return this.pushStack( winnow(this, selector || [], false) );},not: function( selector ) {return this.pushStack( winnow(this, selector || [], true) );},is: function( selector ) {//通过winnow返回的长度来判断return !!winnow(this,// If this is a positional/relative selector, check membership in the returned set// so $("p:first").is("p:last") won't return true for a doc with two "p".typeof selector === "string" && rneedsContext.test( selector ) ?jQuery( selector ) :selector || [],false).length;}
});

转载于:https://www.cnblogs.com/suprise/p/3662110.html

jQuery1.11源码分析(8)-----jQuery调用Sizzle引擎的相关API相关推荐

  1. jquery1.43源码分析之工具方法

    相关文章: jQuery插件开发全解析 读jq之四 jquery1.43源码分析之核心部分 推荐圈子: Jquery 更多相关推荐 这个部分是jquery一些常用的工具方法. 包括为jquery对象扩 ...

  2. shardingsphere源码分析(四)-- 改写引擎

    shardingsphere源码分析(四)-- 改写引擎 shardingsphere源码分析(四)-- 改写引擎 官方介绍 debug 总结 shardingsphere源码分析(四)-- 改写引擎 ...

  3. 从源码分析tomcat如何调用Servlet的初始化

    引言 上一篇博客我们将tomcat源码在本地成功运行了,所以在本篇博客中我们从源码层面分析,tomcat在启动的过程中,是如何初始化servlet容器的.我们平常都是将我们的服务部署到 tomcat中 ...

  4. jQuery源码分析(二)——Sizzle

    在这一章中我们将重点分析jquery的选择器引擎.jquery在3.4版本后,将选择器引擎抽取出来单独放到了Sizzle.js 文件中,本文将基于这个版本来进行分析. 创建缓存 // line 40 ...

  5. mybatis源码分析(方法调用过程)

    十一月月底,宿舍楼失火啦,搞得20多天没有网,目测直到放假也不会来了... 正题 嗯~,其实阅读源码不是为了应付面试,更重要的让你知道,大师是怎样去写代码的,同样是用Java,为啥Clinton Be ...

  6. android源码分析之JNI调用与回调

    通过JNI,Java程序可以在加载本地库之后,调用Java类中声明的在本地库中实现的本地方法.此外,本地库中的函数也可以通过回调的方式调用Java类中的成员变量或者成员函数.        1.在Ja ...

  7. Openstack Nova 源码分析 — RPC 远程调用过程

    目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...

  8. mysql8.0源代码解析_MySQL8.0.11源码分析之mysql关键函数和执行流程

    mysql是命令行客户端程序 ,交互式输入SQL语句或从文件以批处理模式执行它们的命令行工具. 入口函数 int main(int argc, char *argv[]) { if (get_opti ...

  9. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

最新文章

  1. 讯飞智慧餐厅(安徽赛区)比赛通知
  2. hdu 2058 枚举区间和个数
  3. SQL Server 命令行管理工具:SqlLocalDB.exe
  4. 海史密斯敏捷企业架构
  5. STL之Iterator(迭代器)
  6. 使用CLI扩展和重新平衡Couchbase集群
  7. python 异步与io
  8. oracle awr报告生成_oracle11g awr报告分析—WORKLOAD REPOSITORY report
  9. 七个不放过和四项原则
  10. yagmail发送邮件
  11. 怎样在php中制作电子相册,如何制作纪念电子相册
  12. HD、BD、MKV和RMVB、DVD、AVI
  13. 图像增强技术基础、评价指标及其经典算法
  14. 一图带你了解全球疫情爆发背后的隐藏机会
  15. 可扩展性设计之数据切分
  16. Nginx配置不带www自动跳转到www域名
  17. JS实战应用之做LOL领图标任务~
  18. 【Linux/内核】Linux内核rpm包和源码包下载地址-20210107
  19. 量化:通过ta-lib计算MA5指标
  20. 软件环境 From 龙族联盟论坛

热门文章

  1. excel制作录入和查询系统_Excel进销存管理系统,完整函数应用,出入查询库存更新自动显示...
  2. 学会CycleGAN进行风格迁移,实现自定义滤镜
  3. jave类命名_Java重命名文件– Jave移动文件
  4. java 8流在另一个流_Java 8流图
  5. shell脚本中执行命令_如何在Shell脚本中执行命令?
  6. 14-9-25日jenkins部署到tomcat的错误日志
  7. C# Word控件 dsoframer、office viewer、pageoffice、setparent
  8. [nsis]安装包反编译
  9. 使用代码对现实世界进行抽象,软件设计和思维。
  10. 用SPFA判断是否存在负环