当选择表达式不符合高速匹配(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. c++ try throw catch

    c++ try throw catch 这三者联合使用 , try { statement list; } catch( typeA arg ) { statement list; } catch( ...

  2. 一句话解释JVM中空间分配担保的问题

    先解释YGC: 当对象生成在EDEN区失败时,出发一次YGC,先扫描EDEN区中的存活对象,进入S0区,S0放不下的进入OLD区,再扫描S1区,若存活次数超过阀值则进入OLD区,其它进入S0区,然后S ...

  3. ORM增删改查询例题

    public partial class Form1 : Form     {         private MydbInfoDataContext context = new MydbInfoDa ...

  4. 设置 Linux 的 LD_LIBRARY_PATH 变量

    源地址:http://www.cnblogs.com/trying/archive/2013/06/07/3123577.html 我们在ubuntu图形界面下用eclipse写了一个动态库,到cen ...

  5. [Android开发Tips]Bean的定义

    Bean: public class Data extends BaseBean { public ArrayList<DataItem> data = new ArrayList< ...

  6. premake 在64位Ubuntu系统下编译32位GCC程序

    首先,要安装GCC 4.8, 参考前文:Ubuntu 12.04 & 13.04 安装 GCC4.8.1 其中,重点是安装multilib apt-get install gcc-4.8-mu ...

  7. 生产者、消费者 C源码,gcc编译通过

    /*生产者.消费者*/ #include<stdio.h> #include<pthread.h> #define BUFFER_SIZE 16 /***struct prod ...

  8. DOM4J解析XML文档

    Tip:DOM4J解析XML文档 Dom4j是一个简单.灵活的开放源代码的库.Dom4j是由早期开发JDOM的人分离出来而后独立开发的.与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j ...

  9. moodle中文API之表单API

    Form API 表单API 文件夹 1.概述 2.亮点 3.使用方法 4.表单元素 4.1 基本表单元素 4.2 定制表单元素 5.经常使用函数 5.1  add_action_buttons($c ...

  10. Mysql 导入导出数据结构及数据

    方式一: mysqldump -ukevin -P3306 --default-character-set=utf8 -p -h10.1.15.123 activity sign_in_user &g ...