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

  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){// blablareturn 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 indexeswhile ( 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学习笔记(10—— jQuery-在“类”层面扩展)

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

  3. [原]Java程序员的JavaScript学习笔记(12——jQuery-扩展选择器)

    计划按如下顺序完成这篇笔记: 1.    理念. 2.    属性复制和继承. 3.    this/call/apply. 4.    闭包/getter/setter. 5.    prototy ...

  4. Java程序员的JavaScript学习笔记(13—— jQuery UI)

    千万别做程序员,尤其别做Java这种门槛低,入门快的程序员(别跟我说Java搞精通了也很牛之类的,原因不解释,做5年以上就知道了),程序员本来就是我见过最坑爹的职业了...Java程序员更是,现在满地 ...

  5. [原]Java程序员的JavaScript学习笔记(7——jQuery基本机制)

    计划按如下顺序完成这篇笔记: 理念. 属性复制和继承. this/call/apply. 闭包/getter/setter. prototype. 面向对象模拟. jQuery基本机制. jQuery ...

  6. [原]Java程序员的JavaScript学习笔记(1——理念)

    计划按如下顺序完成这篇笔记: 理念. 属性复制和继承. this/call/apply. this/闭包/getter/setter. prototype. 面向对象模拟. jQuery基本机制. j ...

  7. java程序猿必读的学习书籍,良心推荐!

    每年都有很多人想要学习java技术,有的是自学,有的是报班学习,但是都免不了要看书籍学习,书籍学习带来的知识更加牢记,也可以随时做笔记,下面小编就为大家推荐java程序猿必读的学习书籍,希望能帮助到大 ...

  8. JavaScript学习笔记(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  9. JavaScript 学习笔记 - 12 JavaScript 应用示例

    目录 12.1 使用可折叠菜单 12.2 添加下拉菜单 12.3 改进下拉菜单 12.4 带说明的幻灯片 12.5 一个娱乐姓名生成器 12.6 柱状图生成器 12.7 样式表切换器 12.1 使用可 ...

最新文章

  1. 如何修改influxdb表结构_使用nginx-lua修改influxdb API的返回结构
  2. win10中Android Studio (不含SDK) 安装后如何相关错误跳坑指南
  3. java resources 路径_Java工程读取resources中资源文件路径问题
  4. SpaceVim 语言模块 dart
  5. D-query SPOJ - DQUERY (主席树)
  6. flask url_for()
  7. List中对象model的排序问题
  8. 欲学机器学习必先掌握Shell,AI工程师自制教程,获Reddit网友400+点赞 | PDF+视频...
  9. div默认外边距是多少_CSS盒模型之内边距、边框、外边距 十九问(持续更新)...
  10. c语言encoder作业字符数组,C语言练习题库----数组
  11. python期货程序化交易高手心得_10分钟打造WonderTrader上的期货日内交易策略
  12. 电子计算机的指法,键盘指法图/电脑键盘指法练习
  13. 奥城大学计算机专业,我大四了,托福84,gre1571612.02..._GRE考试_帮考网
  14. 如何用计算机算出男朋友的身高,【趣味物理】如何用物理方法测出男生的真实身高?...
  15. Android获取OAID
  16. c# Dispose实现 MSDN官方教程
  17. 英语会话必须掌握的五种基本结构[转] 1
  18. 2021年跨境电商还值得做吗,怎么选择适合自己的电商平台
  19. 两款非常好看的个人导航页HTML源码
  20. 红蓝对抗-蓝队知识点汇总

热门文章

  1. 从“创业输家”到“创智赢家”
  2. 091023 T GIX4 项目中的 智能部署 和 智能客户端
  3. 03-Java的基础语法
  4. 小巧的日志记录组件 - 开源研究系列文章
  5. java内存模型-JMM
  6. SQLServer On Linux Package List on CentOS
  7. 微信推送模板消息的PHP代码整理
  8. 查询在应用程序运行得很慢, 但在SSMS运行得很快的原因探究
  9. IDP申请直到软件上架流程 - iOS
  10. 区块链技术如何改变我们对DNA的看法