matchesSelector 匹配选择器表达式sizzle的实现

 Sizzle.matchesSelector = function( node, expr ) {
     return Sizzle( expr, null, null, [node] ).length > 0;
 };
 (function(){
     var html = document.documentElement,
         matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;

if ( matches ) {
        // Check to see if it‘s possible to do matchesSelector
         // on a disconnected node (IE 9 fails this)
         var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
             pseudoWorks = false;

try {
            // This should fail with an exception
             // Gecko does not error, returns false instead
             matches.call( document.documentElement, "[test!=‘‘]:sizzle" );
   
         } catch( pseudoError ) {
             pseudoWorks = true;
         }

Sizzle.matchesSelector = function( node, expr ) {
             // Make sure that attribute selectors are quoted
             expr = expr.replace(/\=\s*([^‘"\]]*)\s*\]/g, "=‘$1‘]");

if ( !Sizzle.isXML( node ) ) {
                 try {
                     if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
                        var ret = matches.call( node, expr );

// IE 9‘s matchesSelector returns false on disconnected nodes
                      if ( ret || !disconnectedMatch ||
                                // As well, disconnected nodes are said to be in a document
                                 // fragment in IE 9, so check for that
                                 node.document && node.document.nodeType !== 11 ) {
                            return ret;
                        }
                    }
                 } catch(e) {}
            }

return Sizzle(expr, null, null, [node]).length > 0;
        };
     }
 })();

偶然在github上看到一个很好的是示例实现代码为

(function(global, ElemProto) {

var matchesMethod = (function() {
if (ElemProto.matchesSelector) {
return ‘matchesSelector‘;
}

var prefixes = [ ‘webkit‘, ‘moz‘, ‘ms‘, ‘o‘ ];

for ( var i = 0, len = prefixes.length; i < len; i++) {
var prefix = prefixes[i];
var method = prefix + ‘MatchesSelector‘;
if (ElemProto[method]) {
return method;
}
}
})();
console.log(‘abc‘);
// ----- match ----- //

function match(elem, selector) {
return elem[matchesMethod](selector);
}

// ----- appendToFragment ----- //

function checkParent(elem) {
// not needed if already has parent
if (elem.parentNode) {
return;
}
var fragment = document.createDocumentFragment();
fragment.appendChild(elem);
}

function query(elem, selector) {
// append to fragment if no parent
checkParent(elem);

// match elem with all selected elems of parent
var elems = elem.parentNode.querySelectorAll(selector);
for ( var i = 0, len = elems.length; i < len; i++) {
// return true if match
if (elems[i] === elem) {
return true;
}
}
// otherwise return false
return false;
}

// ----- matchChild ----- //

function matchChild(elem, selector) {
checkParent(elem);
return match(elem, selector);
}

// ----- matchesSelector ----- //

var matchesSelector;
if (matchesMethod) {

var div = document.createElement(‘div‘);
var supportsOrphans = match(div, ‘div‘);
matchesSelector = supportsOrphans ? match : matchChild;
} else {
matchesSelector = query;
}
console.log(matchesSelector);
// transport
if (typeof define === ‘function‘ && define.amd) {
// AMD
define(‘matches-selector/matches-selector‘, [], function() {
return matchesSelector;
});
} else {
// browser global
window.matchesSelector = matchesSelector;
}

})(this, Element.prototype);

源地址:https://gist.github.com/3062955

matchesSelector 匹配选择器表达式sizzle的实现

时间: 2024-10-28 22:15:02

matchesSelector 匹配选择器表达式sizzle的实现的相关文章

匹配算数表达式语言

 The Definitive Antlr 4 Reference 2nd Edition  第4章第一小节 学习笔记 匹配算数表达式语言 本例中,只使用基本的算数运算(加,减,乘,除),括号表达式,整数,及变量.例如有如下的表达式. 193 a = 5 b = 6 a+b*2 (1+2)*3 在这里介绍的表达式语言,是由换行符所分割的一组语句构成.语句可以是表达式.赋值运算.或是一个空行.下面是用于解析上述语句及表达式的Antlr文法. grammar expr; prog : stat+;

jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素)

jquery 通过 live() 方法附加的事件处理程序适用于匹配选择器的当前及未来的元素(比如由脚本创建的新元素) $("ul").append("<li class='name'>名称</li>"); [错误] 然后通过下面的方式, 这样是不能获取的 : $(".name").click(function (){    alert("获取到append后的节点"); }) [正确] 正确的方法是:

能够与 &#39; 多种字符&#39; 匹配的表达式

正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符.比如,表达式 "/d" 可以匹配任意一个数字.虽然可以匹配其中任意字符,但是只能是一个,不是多个. 举例 1: 表达式 "/d/d",在匹配 "abc123" 时,匹配的结果是:成功:匹配到的内容是:"12":匹配到的位置是:开始于 3,结束于5. 举例 2: 表达式 "a./d",在匹配 "aaa100" 时,匹配

常用的re模块的正则匹配的表达式

07.01自我总结 常用的re模块的正则匹配的表达式 一.校验数字的表达式 1.数字 ^[0-9]\*$ 2.n位的数字 ^\d{n}$ 3.至少n位的数字 ^\d{n,}$ 4.m-n位的数字 ^\d{m,n}$ 5.零和非零开头的数字 ^(0|[1-9][0-9]\*)$ 6.非零开头的最多带两位小数的数字 ^([1-9][0-9]\*)+(\.[0-9]{1,2})?$ 7.带1-2位小数的正数或负数 ^(\-)?\d+(\.\d{1,2})$ 8.正数.负数.和小数 ^(\-|\+)?\

理解jQuery选择器与Sizzle

什么是jQuery选择器? jQuery选择器通俗来讲就是一个获取html元素的工具.比如,$("p") 选取 <p> 元素,$("p")是jQuery的选择器的写法,这么写就可以获取(选取)html里的<p>元素. jQuery选择器包括元素选择器.属性选择器.CSS选择器.(个人感觉这个分类比较扯淡) 注意:属性选择器的意思并不是选择属性,而是根据属性选择元素. 详细参考:http://www.w3school.com.cn/jquery

jquery 1.7.2源码解析(三) 选择器Sizzle

选择器Sizzle 一)Sizzle( selector, context, results, seed ) 该函数用于查找与选择器表达式selector匹配的元素集合,是选择器引擎的入口. var Sizzle = function( selector, context, results, seed ) { selector: CSS选择器表达式 context: DOM元素或者文档对象,作为查找元素的上下文,用于限定查找范围.默认值是当前文档对象. results: 可选的数组或者类数组,把

十七.jQuery源码解析之入口方法Sizzle(1)

函数Sizzle(selector,context,results,seed)用于查找与选择器表达式selector匹配的元素集合.该函数是选择器引擎的入口. 函数Sizzle执行的6个关键步骤如下: 1.解析选择器表达式,解析出块表达式和关系符. 2.如果存在位置伪类,则从左向右查找: a.查找第一个块表达式匹配的元素集合,得到第一个上下文元素集合. b.遍历剩余的块表达式和块间关系符,不断缩小上下文元素集合. 3.否则从右向左查找: a.查找最后一个块表达式匹配的元素集合,得到候选集,映射集

jQuery 遍历 - find() 方法

jQuery 遍历参考手册 实例 搜索所有段落中的后代 span 元素,并将其颜色设置为红色: $("p").find("span").css('color','red'); 亲自试一试 定义和用法 find() 方法获得当前元素集合中每个元素的后代,通过选择器.jQuery 对象或元素来筛选. 语法 .find(selector) 参数 描述 selector 字符串值,包含供匹配当前元素集合的选择器表达式. 详细说明 如果给定一个表示 DOM 元素集合的 jQu

jQuery find() 方法的使用总结

定义和用法 find() 方法获得当前元素集合中每个元素的后代,通过选择器.jQuery 对象或元素来筛选. 搜索所有段落中的后代 span 元素,并将其颜色设置为红色: $("p").find("span").css('color','red'); <!DOCTYPE html> <html> <head> <script type="text/javascript" src="/jquery