当选择表达式不符合高速匹配(id,tag,class)和原生QSA不可用或返回错误时,将调用select(selector, context, results, seed)方法,此方法迭代DOM选择、过滤元素,
    在DOM树很大的时候为了保证效率,应该保证html设计的合理,尽量使用可高速匹配(id,tag,class)的表达式,其次是QSA支持的选择器,尽量不要使用jquery扩展的selector和嵌套selector,然后是尽量不要使用位置伪类(它是从左向右查找,须要多次循环内套循环遍历),还有要尽量缩小context。

    能够多次反复利用同一选择器,它并不会每次都去筛选DOM(JQuery会对其结果进行缓存,当然假设选择元素太多,不会对其缓存).

select(selector, context, results, seed)方法分为以下几个关键步骤
1  调用tokenize(selector)切割selector
    tokenize(selector,parseOnly)方法的运行步骤
    1.1定义变量 matched匹配元素、match匹配捕获组、tokens存放selector的各个部分和其类型、sofar存放当前selector
        (被上次处理切割后的selector)、groups存放每一个selector的tokens、preFilter就是Expr.preFilter
    1.2首先查看tokenCache缓存中此selector是否已经被切割过,假设有返回缓存的值,否则继续向下运行.
    1.3定义groups数组,它是一个二维数组,每一个selector('div, div span'注意此表达式有两个selector)相应一个groups元素
    1.4切割关系符(后代,>,+,~),将匹配的关系符包含前后空白和去除空白的关系符放入tokens.将soFar设置为剩下的selector
    1.5匹配selector的类型(ATTR,CHILD,CLASS,ID,PSEUDO,TAG),将匹配的selector部分和其类型放入tokens,将soFar设置为剩下的selector
    1.6没有匹配的元素则退出循环,防止soFar不变造成的死循环
    1.7假设传入的parseOnly表明仅仅转换返回soFar的长度,否则将其groups放入tokenCache缓存中并返回groups(假设soFar还有说明selector有误,抛出错误)
2  假设selector仅仅有一个
    2.1假设selector第一切割是id选择器,将其设置为查找上下文,假设查找不到id的元素,则高速返回.
    2.2假设是须要上下文的选择器,从右向左查找.
    2.3依据切割的片段类型,调用对应Expr.find方法,将返回结果作为seed
3  调用compile(selector, match)(seed, context)剔除seed中不符合条件的元素

JQuery日记_5.13 Sizzle选择器(六)选择器的效率的更多相关文章

  1. JQuery日记_5.14 Sizzle选择器(七)

    上篇说道,tokenize方法会把selector切割成一个个selector逻辑单元(如div>a是三个逻辑单元 'div','>','a')并为之片段赋予相应类型的过滤函数. for ...

  2. JQuery日记 5.11 Sizzle选择器(五)

    //设置当前document和document相应的变量和方法 setDocument = Sizzle.setDocument = function( node ) { var hasCompare ...

  3. 什么是jquery $ jQuery对象和DOM对象 和一些选择器

    1什么是jQuery: jQuery就是将一些方法封装在一个js文件中.就是个js库 我们学习这些方法. 2为什么要学习jQuery: 原生js有以下问题: 1.兼容性问题2.代码重复3.DOM提供的 ...

  4. 【学】jQuery的源码思路1——后代选择器

    jQuery的源码思路1--后代选择器 这里探讨一下jQuery中后代选择器的封装原理,并自己写一下 getEle('#div1 ul li .box');接受的参数就是个后代选择器,类似于这样: # ...

  5. jQuery学习笔记(一)——基础选择器、过滤选择器、表单选择器

    $()就是jQuery中的函数,它的功能是获得()中指定的标签元素.如演示样例中$("p")会得到一组P标签元素,当中"p"表示CSS中的标签选择器.$()中的 ...

  6. jQuery选择器之类选择器

    类选择器,顾名思义,通过class样式类名来获取节点. 描述: $('.class') 类选择器,相对于id选择器来说,效率相对会低一些,但是优势就是可以多选. 同样的jQuery在实现上,对于类选择 ...

  7. jQuery easyUI id选择器 类选择器 标签选择器 属性选择器 及DOM对象和jQuery相互之间的转换

    首先导入js文件 <%@ page language="java" contentType="text/html; charset=UTF-8" page ...

  8. 模块:(日期选择)jquery、bootstrap实现日期下拉选择+bootstrap jquery UI自带动画的日期选择器

    一:jquery.bootstrap实现日期下拉选择 点击文本框弹出窗口 弹窗显示日期时间选择下拉 年份取当前年份的前后各5年 天数随年份和月份的变化而变化 点击保存,文本框中显示选中的日期 代码部分 ...

  9. jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法

    jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jq ...

随机推荐

  1. win7下让程序默认以管理员身份运行

    在win7中用自己写的程序读取MBR时,突然提示无法对磁盘进行操作,而在xp下并没有这个问题:最后点右键以管理员身份运行才可以正常运行.于是想办法让程序在双击启动时默认以管理员身份运行.具体方法: 1 ...

  2. 【Demo 0015】位置服务及地图

    本章学习要点:       1.  掌握位置相关类(CLLocationManager,MKUserLocation) 基本用法;        2.  掌握地图视图(MKMapView)基本用法; ...

  3. Phpcms V9 所有的中文变量

    $LANG['start_update_category'] = '开始更新栏目页 ...'; $LANG['start_to_end_id'] = '" 第{page} - {endpag ...

  4. 使用Understand获取某个函数(方法)的静态度量指标

    在之前的一篇日志中,我简单总结了调用Understand的Perl API的方法,这里再简单总结一些经验: 在SciTools\doc\manuals\pdf目录下的understand_api.pd ...

  5. 搜索引擎爬虫蜘蛛的USERAGENT大全

    搜索引擎爬虫蜘蛛的USERAGENT大全 搜索引擎爬虫蜘蛛的USERAGENT收集,方便制作采集的朋友.   百度爬虫 * Baiduspider+(+http://www.baidu.com/sea ...

  6. ubuntu14.04中virtualbox虚拟机无法启动

    近期升级了ubuntu14.04,还是按之前的方法安装了virtualbox(guest系统仍然使用升级之前的镜像文件),可是在启动guest系统时,总是报错,提演示样例如以下: Kernel dri ...

  7. OC对象创建过程

    在利用OC开发应用程序中,须要大量创建对象,那么它的过程是什么呢? 比方:NSArray *array = [[NSArrayalloc] init]; 在说明之前,先把OC的Class描写叙述一下: ...

  8. Spring MVC Hello World Example(转)

    Spring 3 You may interest at this Spring 3 MVC hello world example. In Spring MVC web application, i ...

  9. Codeforce 57C Array

    C. Array time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  10. Codeforces Round #252 (Div. 2) B. Valera and Fruits(模拟)

    B. Valera and Fruits time limit per test 1 second memory limit per test 256 megabytes input standard ...