By zhangpeng12@baidu.com Sizzle引擎研究 By zhangpeng12@baidu.com.

Slides:



Advertisements
Similar presentations
第 15 章 Mobile PHP 與 Ajax 15-1 Mobile PHP 15-2 Ajax 的基礎 15-2 Ajax 的基礎 15-3 jQuery 的 Ajax 方法 15-3 jQuery 的 Ajax 方法 15-4 應用實例:關鍵字建議清單 15-4 應用實例:關鍵字建議清單.
Advertisements

“321人才计划”情况介绍 南京高新技术产业开发区 人才工作办公室.
南宁市中考网上报名录取系统 使用手册 2014年5月.
移动校园Hybrid应用开发介绍 2015年11月.
校园信息管理系统 河北科技大学网络中心 2000/4/10.
邮币卡开户、银行签约、出入金流程.
全国残联基层工作服务平台 系统介绍
浅析浏览器解析和渲染 偏右.
JQuery 基础教程.
实验一:分析“征途游戏”网站的类型与推广手段
網路程式設計-期末專案 資工二B B975701 2 8 黃首翰 ~Rock your life~
簡報內容 網路請購系統說明 經費授權注意事項 請購單&授權應用範例 系統環境及設定. 簡報內容 網路請購系統說明 經費授權注意事項 請購單&授權應用範例 系統環境及設定.
徵收苗栗市福全段147、1588及文心段10、11地號等4筆土地之
第8章 CSS基础知识 【学习目标】 对于一个网页设计者来说,对HTML语言一定不感到陌生,因为它是网页制作的基础,但是如果希望网页能够美观、大方,并且升级维护方便,那么仅仅知道HTML还是不够的,还需要了解CSS。了解CSS基础知识,可以为后面的学习打下基础。 本章主要内容包括: 为什么在网页中加入CSS。
P303 HTML/DHTML/CSS/JavaScript 專業HTML網頁設計 陳錦輝.
讲 义 大家好!根据局领导的指示,在局会计科和各业务科室的安排下,我给各位简要介绍支付中心的工作职能和集中支付的业务流程。这样使我们之间沟通更融洽,便于我们为预算单位提供更优质的服务。 下面我主要从三方面介绍集中支付业务,一是网上支付系统,二是集中支付业务流程及规定等,
中国人民公安大学经费管理办法(试行) 第一章总则 第四条:“一支笔” “一支笔”--仅指单位主要负责人。负责对本 单位的经费进行审核审批。
浏览器工作原理浅析 TID Ghostzhang.
文書檔案與實務概述 103年7月30日 主講人:總務處文書組單秀琴組長.
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
《网页设计与制作》 教学课件 主讲人:湖南铁道职业技术学院 陈承欢
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
第三章 使用XMLHttpRequest对象
社團社群網站設計競賽 說明會 南台科技大學計網中心.
北京市医师定期考核信息管理系统 在线考试培训会 北京市卫生和计划生育委员会 北京市医师定期考核办公室 2016年9月
国际关系的决定因素:国家利益 江苏省震泽中学 丛海啸.
数据访问页.
Microsoft Excel 2000 試算表初階 中央大學 計算機中心 周小慧.
第8章 样式表.
Web应用开发 矫桂娥 办公室:222#.
CSS 徐于晉 陳政樺 陳郁蘋 黃麒錕 劉芳賓.
第 11 章 讓版面更活潑 的 CSS.
Selenium经典教程 selenium教程.
Ajax编程技术 第一章 Ajax简介.
专题4:JSP脚本和指令.
Web前端开发技术与实践 第3章:初识HTML5 阮晓龙 /
JavaScript 靜宜大學 資管系 楊子青.
十二年國民基本教育中等學校教師教學專業能力研習五堂課
JQuery與動畫及特效 靜宜大學 資管系 楊子青 網路參考資源:
吉林省信息技术与教学融合优质课大赛 参赛教师提交大赛作品流程 吉林省电化教育馆.
网 站 设 计 与 建 设 Website design and developments
从渲染原理到性能优化.
A New Kind of JavaScript Library
第4章 CSS基础 主讲人:刘泰然 经济管理学院.
网页设计与制作教程第5版 机械工业出版社同名教材 配套电子教案.
第13章 CSS 通过CSS可以使用更丰富、更灵活的样式,更简单地 设计出更美观的网页。同时,也让网页的设计与维护 更有效率。CSS在网页设计中的作用尤为重要,是网 页设计师必备的知识。本章首先介绍什么是CSS、CSS 的基本语法等基础知识,接着学习利用“CSS”面板 管理规则,如何在Dreamweaver中创建与应用CSS样式.
Case 工具-UML with Rational Rose
Ajax编程技术 第六章 调试与错误处理.
JQuery基礎與動畫、特效 靜宜大學 資管系 楊子青.
JQuery基礎與動畫、特效 靜宜大學 資管系 楊子青 網路參考資源:
JavaScript Sunxiaoshen.
武汉纺织大学传媒学院 cm.wtu.edu.cn
网页设计与制作 Jiangxi Engineering Vocational College 信息工程系 徐卫红.
第12章 APDiv 对于有Dreamweaver基础的读者来说,初识APDiv或 许会感到即熟悉又陌生。熟悉于它的Div标识符, 陌生于他在CS3版本中的含义及作用。其实,APDiv 在Dreamweaver CS4中仍等同于前期版本的层,又 称为AP元素或CSS-P元素,本文以下简称AP层。 什么是层?有什么作用?前面我们学习过了表格,
微信商城系统操作说明 色卡会智能门店.
武汉纺织大学传媒学院 cm.wtu.edu.cn
网 站 设 计 与 建 设 Website design and developments
95年度高屏醫療網 以病人為中心之醫療照護— 以弱勢族群為重點 期末報告
杭州国家粮食交易中心 欢迎您!.
JQuery 標籤操作 建國科技大學 資管系 饒瑞佶 2013/4 V1.
大葉服務學習執行說明 課外活動暨服務學習中心:黃泰元.
喜雨亭記 國二甲 S 陳姿婷.
CSS基礎 靜宜大學 資管系 楊子青.
道家的中心觀念.
§4 连续型随机变量.
大綱 一.受試者之禮券/禮品所得稅規範 二.範例介紹 三.自主管理 四.財務室提醒.
6.1.1 平方根.
學生學習診斷與進展評量 測驗科目:第一次國語文、第二次數學 (數學要帶紙筆計算)
JavaScript 教师:魏小迪
知识点讲解 1、DOM节点树 DOM(Document Object Model)称为文档对象模型,是一个表示和处理文 档的应用程序接口(API),可用于动态访问、更新文档的内容、结构和样 式。DOM将网页中文档的对象关系规划为节点层级,构成它们之间的等级关 系,这种各对象间的层次结构被称为节点树。如下图所示。
Presentation transcript:

By zhangpeng12@baidu.com Sizzle引擎研究 By zhangpeng12@baidu.com

什么是sizzle A pure-JavaScript CSS selector engine (power jQuery) Standalone(no dependencies) Competitive performance Only 4kB with gzipped Easy to use Css3 support Bla bla ……

为什么需要sizzle Bugs 1. Id IE<=8不区分大小写,混淆iuput的name和id 2. class IE getAttribute ,混淆html的attribute和dom的property 非IE getElementsByClassName 3.Tag getElementsByTagName(*)混淆注释节点 性能 考虑如下选择器: div.container li:last-of-child a,div.container ul+a var mySelector = function(){ bla bla……. There gone be at least 100 lines here……. }

高版本浏览器(querySelector)

Sizzle概览 词法解析 过滤函数 种子集 结果集 编译函数匹配

词法解析 词法分析器又称扫描器,词法分析是指将我们编写的文本代码流解 析为一个一个的记号,分析得到的记号以供后续语法分析使用 {matches: ["div"],type: "TAG",value: "div“ }, {matches: ["aaron"], type: "CLASS", value: ".aaron"}, {match:[“”], type: " ", value: " "}, {matches: ["input"], type: "TAG", value: "input"}, {matches: ["name"], type: "ATTR", value: "[name=ttt]"} div.aaron input[name=ttt]

词法解析(模式) 分组(,) /^[\x20\t\r\n\f]*,[\x20\t\r\n\f]*/ 层级关系( >+~) /^[\x20\t\r\n\f]*([>+~]|[\x20\t\r\n\f])[\x20\t\r\n\f]*/ 单个元素处理 Id Tag Class Attribute …… var characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+" var ID = new RegExp("^#(" + characterEncoding + ")") var TAG = new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ) var Class = new RegExp( "^\\.(" + characterEncoding + ")" ) …….

词法解析(代码) while (selector) { //分组 if (match = rcomma.exec(selector)) { selector = selector.slice(match[0].length) groups.push((tokens = [])); } //层级关系 if ((match = rcombinators.exec(selector))) { matched = match.shift(); tokens.push({ value: matched, type: match[0].replace(rtrim, " ") }); selector = selector.slice(matched.length); //选择器 for (type in matchExpr) { if ((match = matchExpr[type].exec(selector))) { type: type, matches: match //分组 var rcomma = /^[\x20\t\r\n\f]*,[\x20\t\r\n\f]*/; //层级 var rcombinators = /^[\x20\t\r\n\f]*([>+~]|[\x20\t\r\n\f])[\x20\t\r\n\f]*/ //选择器 var TAG = /^((?:\\.|[\w*-]|[^\x00-\xa0])+)/; var matchExpr = { CLASS: /^\.((?:\\.|[\w-]|[^\x00-\xa0])+)/, TAG: /^((?:\\.|[\w*-]|[^\x00-\xa0])+)/ }

过滤函数 //各种类型的token的过滤器,全部返回闭包函数 Expr.filter = { ATTR : function (name, operator, check) {return function} CHILD : function (type, what, argument, first, last) {return function} CLASS : function (className) {return function} ID : function (id) {return function} PSEUDO : function (pseudo, argument) {return function} TAG : function (nodeNameSelector) {return function} } //tag类型的过滤器,判断nodeName是否匹配,返回闭包函数 TAG: function(nodeNameSelector) { return function(elem) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeNameSelector; }; }

结果集 div.aaron input[name=ttt] div.aaron [name=ttt] Input标签种子集合 TAG过滤 { matches: ["div"],type: "TAG",value: "div“ }, {matches: ["aaron"], type: "CLASS", value: ".aaron"}, {match:[“”], type: " ", value: " "}, {matches: ["input"], type: "TAG", value: "input"}, {matches: ["name"], type: "ATTR", value: "[name=ttt]"} { matches: ["div"],type: "TAG",value: "div“ }, {matches: ["aaron"], type: "CLASS", value: ".aaron"}, {match:[“”], type: " ", value: " "}, {matches: ["name"], type: "ATTR", value: "[name=ttt]"} Token集简化

编译原理 过滤后的选择器 div.aaron [name=ttt] 过滤函数 Expr.filter = { 过滤后的token集 { matches: ["div"],type: "TAG",value: "div“ }, {matches: ["aaron"], type: "CLASS", value: ".aaron"}, {match:[“”], type: " ", value: " "}, {matches: ["name"], type: "ATTR", value: "[name=ttt]"} 过滤后的选择器 div.aaron [name=ttt] 超级匹配函数 function(){ 层次很深的闭包….. } 过滤函数 Expr.filter = { ATTR : function (name, operator, check) {return function} CHILD : function (type, what, argument, first, last) {return function} CLASS : function (className) {return function} ID : function (id) {return function} PSEUDO : function (pseudo, argument) {return function} TAG : function (nodeNameSelector) {return function} }

编译过程 遇到关系token(+> ~)则依次出栈合并匿名函数,其他情况压入对应的token处理函数 选择器表达式 div [name=ttt] ( )[name=ttt] [name=ttt] 超级匹配器 Function(elem){ //tag filter } Function(elem){ //attribute filter } Function(elem){ while(matcher=matchrs.pop()){ if(!matcher(elem)){ return false; } return true; Function(elem){ elem=elem[‘parentNode’]; return Function(elem){ tag filter } Function(elem){ elem=elem[‘parentNode’]; return Function(elem){ //tag filter } Matchers集合

超级匹配器 for item in seed if(superMatcher(item )){ resultSet.push(item); } return resultSet

Thanks & Regards