JQuery_2.1.0_日记 5.4 Sizzle选择器(二)

(1)

whitespace = "[\\x20\\t\\r\\n\\f]";

匹配css3中空白符.

\x20:空格;\t水平制表符(tab);\r\n回车换行\f换页符

(2)

characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+"

匹配\后任意字符,字母或数字或-,ascii值非\00-\xa0范围内的字符

(3)

identifier = characterEncoding.replace( "w" , "w#" )

匹配\后任意字符,字母或数字或#或-,ascii值非\00-\xa0范围内的字符

(4)

attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
               "*(?:([*^$|!~]?=)" + whitespace + "*(?:([‘\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]"

匹配属性选择器,例如:[arr^=‘val‘]

捕获组1:characterEncoding :匹配例子中arr

捕获组2:([*^$|!~]?=):匹配例子中^=

捕获组3:[‘\"]:匹配例子中‘

捕获组4:(?:\\\\.|[^\\\\])*? 解释一下这个外层捕获\和后面的任意数量字符或非\字符,内层有?:是不捕获的,匹配例子中的val

捕获组5:匹配identifier,匹配[id=#a]的情况

(5)

pseudos = ":(" + characterEncoding + ")(?:\\((([‘\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)"

匹配伪类表达式,例如li:nth-child(2n+1)

捕获组1:characterEncoding :匹配例子中nth-child

捕获组2:匹配例子中的2n+1

捕获组3:匹配‘ or "

捕获组4:匹配\和后面任何字符或非\字符

捕获组5:匹配不再‘ or "内的\和后面任意字符或非\()[]字符或attributes

(6)

rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" )

捕获 > + ~ 关系符

(7)

rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]‘\"]*?)" + whitespace + "*\\]" , "g" )

匹配=[非‘非"]

JQuery_2.1.0_日记 5.4 Sizzle选择器(二)

时间: 2024-10-04 15:46:35

JQuery_2.1.0_日记 5.4 Sizzle选择器(二)的相关文章

JQuery_2.1.0_日记 5.4 Sizzle选择器(一) 正则中那些\\\\和\\

Sizzle中恐怖的正则. 字面量的正则也许还好理解,那么由字符串编译而成的正则呢. \\和\\\\ 由字符'\\\\'编译而成的正则是/\\/,第一个\转义第两个\,所以其匹配一个\字符(这个\字符是代表字符本身) Test_Script var s = '\\' ; alert(s); // '\' var rs = '\\\\' ; var matches = s.match(new RegExp(rs)); alert(matches[0]) // '\' 由字符串'\\3'编译而成的正

JQuery_2.1.0_日记 5.5 Sizzle选择器(三)

function Sizzle( selector, context, results, seed ) { var match, elem, m, nodeType, // QSA vars i, groups, old, nid, newContext, newSelector; if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { setDocument( context );

JQuery_2.1.0_日记 5.8 Sizzle选择器(四)

Sizzle( selector, context, results, seed )的关键步骤 1,传入的context对应的context和当前document是否一致,不一致调用setDocument()重新设置document,用于frame的情况. 2,如果context为空修正context为document 3,selector如果不是字符串或者context不是Element或Document直接返回空数组. 4,如果文档是HTML并且未传入过滤结果集seed,尝试用原生方法get

JQuery日记 5.11 Sizzle选择器(五)

//设置当前document和document对应的变量和方法 setDocument = Sizzle.setDocument = function( node ) { var hasCompare, //node为Element时返回node所属document //node为Document时返回node //node为空时返回window.document doc = node ? node.ownerDocument || node : preferredDoc, //document

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

上篇说道,tokenize方法会把selector分割成一个个selector逻辑单元(如div>a是三个逻辑单元 'div','>','a')并为之片段赋予对应类型的过滤函数. for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matc

JQuery_2.1.0_日记 5.2

$.方法 (1)$.merge(first, second) 合并两个数组或类数组,将第二个数组添加到第一个数组的末尾 (2)$.grep(elems, callback, invert) 使用callback对elems进行过滤,如果invert设置为true.则返回保留callback返回值为false的元素数组,如果invert设置为false则返回callback返回值为true的元素数组. Test_Script var arr = ['a' , 'b' , 'c' ] arr = $

JQuery_2.1.0_日记 2014-5.1

JQuery工具方法. (1)$.isNumeric(obj) 此方法判断传入的对象是否是一个数字或者可以转换为数字. isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...&

JQuery日记_5.13 Sizzle选择器(六)选择器的效率

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

JQuery_2.1.0_日记 4.29 $.extend

因为在JQuery一切皆JQuery,所以JQuery没有EXT那么恐怖的继承体系,比起EXT的Ext.extends(),$.extend()函数还是很好理解的,只是把一个对象的属性和方法添加到目标对象上.刚出生的JQuery是很弱小的,JQuery源码后面和我们自己扩展都是通过$.extend()函数. Test_Html <body> <div id= "div1">div1</div ><div id= "div2"