网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 网页素材 > AJAX代码 > 正文
详解JQuery选择器(下)篇
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 11/01/18
这篇继上篇的详解JQuery选择器(上)篇 之后继续介绍选择器的其它原理,包括内容,可见性,属性,子元素,表单,表单对象属性等等原理。

jQuery选择器的图示包括:

一、内容
1. 【 :contains(text) 】
匹配包含给定文本的元素。
例子

HTML代码 jQuery代码 结果
<div>John Resig</div>
<div>George Martin</div>
<div>Malcom John Sinclair</div>
<div>J. Ohn </div>
$("div:contains(''John'')") [ <div>John Resig</div>, <div>Malcom John Sinclair</div> ]

首先我们先找到它的一个正则表达式

PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\(([''"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
然后找到它的核心代码:
filter: {
    PSEUDO: function(elem, match, i, array){
        var name = match, filter = Expr.filters[ name ];

        if ( filter ) {
            return filter( elem, i, match, array );
        }
else if ( name === "contains" ) {  
            // textContext在FF下和innerText在IE下的属性是等效的,match得到的是contains紧跟在后面包含的字符串,当elem元素的文本内容包含contains包含的关键字时,返回true
            return (elem.textContent || elem.innerText || "").indexOf(match) >= 0;
        }
else if ( name === "not" ) {
            var not = match;

            for ( var i = 0, l = not.length; i < l; i++ ) {
                if ( not[i] === elem ) {
                    return false;
                }

            }


            return true;
        }

    }

}
关键在于 (elem.textContent || elem.innerText || "").indexOf(match) >= 0; 的布尔值判断,当返回真时,elem元素为匹配的元素。


2. 【 :empty 】,【 :has(selector) 】,【 :parent 】
:empty匹配所有不包含子元素或者文本的空元素。
:has(selector) 匹配含有选择器所匹配的元素的元素。
:parent匹配含有子元素或者文本的元素。

例子
HTML代码 jQuery代码 结果  
<table>
<tr><td>Value 1</td><td></td></tr>
<tr><td>Value 2</td><td></td></tr>
</table>
$("td:empty") [ <td></td>, <td></td> ]  
<div><p>Hello</p></div>
<div>Hello again!</div>
$("div:has(p)").addClass("test"); [ <div class="test"><p>Hello</p></div> ]  
<table>
<tr><td>Value 1</td><td></td></tr>
<tr><td>Value 2</td><td></td></tr>
</table>
$("td:parent") [ <td>Value 1</td>, <td>Value 1</td> ]  

同样它匹配正则表达式PSEUDO。

找到它们的核心代码:
filters: {
    parent: function(elem){
        return !!elem.firstChild;
    }
,
    empty: function(elem){
        return !elem.firstChild;
    }
,
    has: function(elem, i, match){
        return !!Sizzle( match, elem ).length;
    }

}

其中当!elem.firstChild即elem元素不包含子节点或者文本元素时,empty返回真;
当!!elem.firstChild即elem元素包含子节点或者文本元素时,parent返回真;

has中,match为has紧跟在后面含有的元素,如p元素,!!Sizzle( match, elem ).length 得到 match元素中包含在elem元素中的个数,如果个数 > 1,has返回真。


二、可见性
1. 【 :hidden 】和【 :visible 】
: hidden匹配所有的不可见元素,input 元素的 type 属性为 "hidden" 的话也会被匹配到。
:visible匹配所有的可见元素。
我们只需要看它的核心代码为:
jQuery.expr = Sizzle.selectors;
// …
Sizzle.selectors.filters.hidden = function(elem){
    return "hidden" === elem.type ||
        jQuery.css(elem, "display") === "none" ||
        jQuery.css(elem, "visibility") === "hidden";
}
;

Sizzle.selectors.filters.visible = function(elem){
    return "hidden" !== elem.type &&
        jQuery.css(elem, "display") !== "none" &&
        jQuery.css(elem, "visibility") !== "hidden";
}
;
当elem元素的CSS属性display为”none”,或者visibility为”hidden”时,返回真;
当elem元素的CSS属性display不为”none”,并且visibility不为”hidden”时,返回真。
通过布尔值来判断元素是否显示。

三、属性
1. [ attribute ],[ attribute=value ],[ attribute!=value ],[ attribute^=value ],[ attribute$=value ],[ attribute*=value ]
属性匹配的正则表达式为:
ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*([''"]*)(.*?)\3|)\s*\]/
通过Sizzle.filter方法,得到ATTR的正则匹配,然后调用Expr.filter[ “ATTR” ],具体实现为:
点击展开

其中value相当于“newsletter”,check相当于“new”;
可以看出“!=”和“=”判断value === check; 的布尔值,即value是否等于check;
“^=”取得value.index(check) === 0; 的布尔值,即check的字符串是否在value的开头;
“$=”取得value.substr(value.length - check.length) === check; 的布尔值,即check的字符串是否在value的末尾;
“*=”取得value.index(check) >= 0; 的布尔值,即value包含check字符串为真;

四、子元素
1. 【 :nth-child(index/even/odd/equation) 】,【 :first-child 】,【 :last-child 】,【 :only-child 】
:nth-child(index/even/odd/equation) 匹配其父元素下的第N个子或奇偶元素。
:first-child 匹配第一个子元素。
:last-child 匹配最后一个子元素。
:only-child 如果某个元素是父元素中唯一的子元素,那将会被匹配。

它匹配的正则表达式为:
CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/
通过Sizzle.filter方法,得到CHILD的正则匹配,然后调用Expr.filter[ “CHILD” ],具体实现为:
点击展开

其中type为first时,elem.nodeIndex == 1; 当elem元素为第一个节点时,返回真;
type为last时,elem.nodeIndex == parent[ doneName ]; 当elem元素为它的父节点的最后一个子节点时,返回真;
type为only时,parent[ doneName ] == 1; 当elem元素的父节点只有一个子节点时,返回真;
type为nth时,各种情况已经在代码中标注。

五、表单
1. 【 :input 】,【 :text 】,【 :password 】,【 :radio 】,【 :checkbox 】,【 :submit 】,【 :image 】,【 :reset 】,【 :button 】,【 :file 】,【 :hidden 】

它们匹配的正则表达式为:
PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\(([''"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
找到它们的核心代码:
点击展开
可以看出elem.type得到元素的type属性,当元素type属性等于相应的值时,返回相应的布尔值。
如果为真,最后返回匹配的jQuery对象。


六、表单对象属性
1. 【 : enabled 】,【 : disabled 】,【 : checked 】,【 :selected 】

它们匹配的正则表达式为:
PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\(([''"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/
找到它们的核心代码:
filters: {
        enabled: function(elem){
            return elem.disabled === false && elem.type !== "hidden";
        }
,
        disabled: function(elem){
            return elem.disabled === true;
        }
,
        checked: function(elem){
            return elem.checked === true;
        }
,
        selected: function(elem){
            // Accessing this property makes selected-by-default
            // options in Safari work properly
            elem.parentNode.selectedIndex;
            return elem.selected === true;
        }

    }
其中,enabled对应elem的disabled属性为false并且elem的type属性为hidden;
disabled对应elem的disabled属性为true;
checked对应elem的checked属性为true;
selected对应elem的selected属性为true;
jQuery的选择器的原理至此已经全部介绍完了,通过选择器认识到了通过Expr.filters达到了过滤的目的。

谢谢大家阅读!
  • 上一篇资讯: 详解JQuery选择器(上)篇
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 电话:013574892963 QQ:3710167 邮箱:Educs@163.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 Www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号