计划按例如以下顺序完毕这篇笔记:

  1. Java程序猿的JavaScript学习笔记(1——理念)
  2. Java程序猿的JavaScript学习笔记(2——属性复制和继承)
  3. Java程序猿的JavaScript学习笔记(3——this/call/apply)
  4. Java程序猿的JavaScript学习笔记(4——this/闭包/getter/setter)
  5. Java程序猿的JavaScript学习笔记(5——prototype)
  6. Java程序猿的JavaScript学习笔记(6——面向对象模拟)
  7. Java程序猿的JavaScript学习笔记(7——jQuery基本机制)
  8. Java程序猿的JavaScript学习笔记(8——jQuery选择器)
  9. Java程序猿的JavaScript学习笔记(9——jQuery工具方法)
  10. Java程序猿的JavaScript学习笔记(10——jQuery-在“类”层面扩展)
  11. Java程序猿的JavaScript学习笔记(11——jQuery-在“对象”层面扩展)
  12. Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)
  13. Java程序猿的JavaScript学习笔记(13——jQuery UI)
  14. Java程序猿的JavaScript学习笔记(14——扩展jQuery UI)

这是笔记的第12篇,本篇我们尝试扩展jQuery选择器。同一时候这也是一个jQuery源代码解读的过程。

作者博客:http://blog.csdn.net/stationxp
作者微博:http://weibo.com/liuhailong2008
转载请取得作者允许

0、为什么要扩展?

自带的功能非常强。但有时候代码会非常啰嗦,并且0基础人员总是掌握不好,影响效率。

从架构角度能够简化的话,能提高程序可读性,提高效率。

1、怎样扩展?

jQuery为选择器提供了丰富的扩展机制。例如以下:

// Override sizzle attribute retrieval
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.pseudos;
jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;

从字面分析jQuery.expr和jQuery.expr[":"]应该是我们的着力点。

Expr = Sizzle.selectors = {
pseudos: {
"enabled": function( elem ) {
return elem.disabled === false;
}, "disabled": function( elem ) {
return elem.disabled === true;
}
}
}

通过以上代码。我们看出jQuery.expr[":"]就是我们的发力点。jQuery.expr.pseudos的代码能够作为我们的參考。

扩展jQuery选择器的代码例如以下:

$.extend($.expr[':'],{
"uitype": function(elem){
// blabla
return true/false;
}
});

从传入參数elem中,能够通过elem.attr()获得属性。做推断,然后决定当前元素是否返回。

比想象的简单太多!



问过度娘,psedudos中定义的选择器使用方法是:

$(":enabled")
$("#xx :enabled")
$("blabla :enabled")

那我们扩展的选择器使用方法应该是: $("blabla :uitype") 。

Err...还须要传入參数,形如: $("div[:uitype='panel']");

找个样例:

		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
var i = argument < 0 ? argument + length : argument;
for ( ; ++i < length; ) {
matchIndexes.push( i );
}
return matchIndexes;
}) function createPositionalPseudo( fn ) {
return markFunction(function( argument ) {
argument = +argument;
return markFunction(function( seed, matches ) {
var j,
matchIndexes = fn( [], seed.length, argument ),
i = matchIndexes.length; // Match elements found at the specified indexes
while ( i-- ) {
if ( seed[ (j = matchIndexes[i]) ] ) {
seed[j] = !(matches[j] = seed[j]);
}
}
});
});
}

太复杂,懒得看,写段代码试一下

2、举样例

2.1、不带參数的

<div uitype='header'>头</div>
<div uitype='footer'>尾</div>
<script>
$.extend($.expr[':'],{
"uitype": function(elem){
var t = $(elem).attr('uitype');
console.log(t);
return !!t;
}
});
var arr = $(":uitype");
console.log(arr.length);
</script>

输出:

undefined


undefined

undefined

undefined

header

footer

undefined

2 // 找到两个

2.2、带參数的

<div uitype='header'>header</div>
<div uitype='footer'>footer</div>
<script>
$.extend($.expr[':'],{
"uitype": function(elem){
// var t = $(elem).attr('uitype');
console.log(arguments.callee.caller);//打印调用者
for(var i = 0;i<arguments.length;++i){//打印參数的值
console.log(typeof arguments[i],arguments[i]);
}
return true;
}
});
var arr = $(":uitype[uitype='footer']");
console.log(arr.length); // output : 1

输出:

function code ... 

object  div //footer的dom。并且仅仅有这个,已经做好筛选了, [] 中的筛选是不须要我写代码就能获得的

object #document //文档根对象

boolean false 

关于调用者,依据function code找到了

function elementMatcher( matchers ) {
return matchers.length > 1 ?
function( elem, context, xml ) {
var i = matchers.length;
while ( i-- ) {
if ( !matchers[i]( elem, context, xml ) ) {
return false;
}
}
return true;
} :
matchers[0];
}

传入了3个參数:元素本身,上下文,和是否xml。

还是没可以获得选择表达式中写的參数。一定是姿势不正确。

[]已经被实现了,试试小括号:

<div uitype='header'>header</div>
<div uitype='footer'>footer</div>
<script>
$.extend($.expr[':'],{
"uitype": function(elem,content,xml){
for(var i = 0;i<arguments.length;++i){
console.log(i);
console.log(typeof arguments[i],arguments[i]);
}
return true;
}
});
var arr = $(":uitype(xx)");
console.log(arr.length);
</script>

输出:

object  div // elem 

number 0 // 什么? 

object ["uitype", "uitype", "", "xx"] //得到了 xx 。这个正是我想要的

充满无限可能了!

整理代码框架例如以下:

<strong><div uitype='header'>header</div>
<div uitype='footer'>footer</div>
<script>
$.extend($.expr[':'],{
"uitype": function(elem,someNumber,exprParams){
console.log($(elem).attr('uitype'),exprParams[3]);
return true;
}
});
var arr = $(":uitype(xx)");</strong>

输出:

header xx 

footer xx 





能限制你的仅仅有你的想象力了!

Java程序猿的JavaScript学习笔记(12——jQuery-扩展选择器)的更多相关文章

  1. Java程序猿的JavaScript学习笔记(汇总文件夹)

    最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...

  2. Java程序猿的JavaScript学习笔记(8——jQuery选择器)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  3. Java程序猿的JavaScript学习笔记(3——this/call/apply)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  4. Java程序猿的JavaScript学习笔记(1——理念)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  5. Java程序猿的JavaScript学习笔记(10—— jQuery-在“类”层面扩展)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  6. Java程序猿的JavaScript学习笔记(9—— jQuery工具方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  7. Java程序猿的JavaScript学习笔记(6——面向对象模拟)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  8. Java程序猿的JavaScript学习笔记(5——prototype和Object内置方法)

    计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScript ...

  9. JavaScript:学习笔记(8)——对象扩展运算符

    JavaScript:学习笔记(8)——扩展运算符 对象的扩展运算符 扩展运算符是三个点(...).用于取出参数对象的所有可遍历属性,然后拷贝到当前对象之中. 如上图所示,新建了一个对象a,然后通过扩 ...

随机推荐

  1. java 复习整理(一 java简介和基础语法)

    现在公司用的是封装太多东西的平台开发,觉着之前学的东西很多都忘了,所以想好好总结回顾一下.之前总是想学很多编程语言像python.s6.node.react,但现在越来越体会到编程语言只是一个开发的工 ...

  2. java 符号引用与直接引用

    简单来说: 符号引用就是字符串,这个字符串包含足够的信息,以供实际使用时可以找到相应的位置.你比如说某个方法的符号引用,如:“java/io/PrintStream.println:(Ljava/la ...

  3. tips server ssh 正向 反向 代理

    1. ssh userxxxxname@115.28.87.102           (直接使用ssh的连接方式连接到远程主机,而不是使用http,ftp等方式连接到具体远程主机)          ...

  4. 2590: [Usaco2012 Feb]Cow Coupons

    2590: [Usaco2012 Feb]Cow Coupons Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 306  Solved: 154[Su ...

  5. 关于JSON的简介及取值以及常见面试题

    关于JSON的简介及取值 JSON(JavaScript Object Notation)一种轻量级的数据交互格式 类似于一种数据封装,可以想象为java中student封装类 JSON的数值可以是数 ...

  6. [bzoj1433][ZJOI2009]假期的宿舍——二分图

    题目大意 传送门 题解 显然是二分图匹配. 用一些方法建图就好了. 要注意的是: 本题有多组数据!!! 初始化一定要注意!!! 代码 #include <bits/stdc++.h> us ...

  7. leetcode-Min Cost Climbing Stairs

    题目: On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you ...

  8. Ubuntu 14.04LTS+Git

    Git是我们常用的代码托管工具,作为程序员,Git是必备的. 安装Git的方法很简单,官网就有写:http://git-scm.com/download/linux 根据官网的说明,用: sudo a ...

  9. poj3254(状态压缩DP)

    poj3254 题意 给出一个01矩阵,1表示当前这个位置可以放牛,要求放牛的方案保证牛不能左右或上下相邻,求方案数. 分析 dp[S][i]: 表示到 i 行时的状态S(用二进制数表示),那么状态转 ...

  10. rsync + inotify 同步

    1. 配置rysnc server:同步机,同步被同步机更新的文件,很多台vi /etc/rsyncd.conf uid=rootgid=rootuse chroot=nomax connection ...