Java程序猿的JavaScript學習筆記(12——jQuery-擴展選擇器)
阿新 • • 發佈:2017-05-05
type write number article mat 我們 content ace val
計劃按例如以下順序完畢這篇筆記:
這是筆記的第12篇,本篇我們嘗試擴展jQuery選擇器。同一時候這也是一個jQuery源代碼解讀的過程。
從架構角度能夠簡化的話,能提高程序可讀性,提高效率。
從字面分析jQuery.expr和jQuery.expr[":"]應該是我們的著力點。
比想象的簡單太多!
問過度娘,psedudos中定義的選擇器使用方法是:
undefined
undefined
undefined
undefined
header
footer
undefined
2 // 找到兩個
function code ...
object div //footer的dom。並且僅僅有這個,已經做好篩選了, [] 中的篩選是不須要我寫代碼就能獲得的
object #document //文檔根對象
boolean false
關於調用者,依據function code找到了
還是沒可以獲得選擇表達式中寫的參數。一定是姿勢不正確。
object div // elem
number 0 // 什麽?
object ["uitype", "uitype", "", "xx"] //得到了 xx 。這個正是我想要的
整理代碼框架例如以下:
header xx
footer xx
能限制你的僅僅有你的想象力了!
- Java程序猿的JavaScript學習筆記(1——理念)
- Java程序猿的JavaScript學習筆記(2——屬性復制和繼承)
- Java程序猿的JavaScript學習筆記(3——this/call/apply)
- Java程序猿的JavaScript學習筆記(4——this/閉包/getter/setter)
- Java程序猿的JavaScript學習筆記(5——prototype)
- Java程序猿的JavaScript學習筆記(6——面向對象模擬)
- Java程序猿的JavaScript學習筆記(7——jQuery基本機制)
- Java程序猿的JavaScript學習筆記(8——jQuery選擇器)
- Java程序猿的JavaScript學習筆記(9——jQuery工具方法)
- Java程序猿的JavaScript學習筆記(10——jQuery-在“類”層面擴展)
- Java程序猿的JavaScript學習筆記(11——jQuery-在“對象”層面擴展)
- Java程序猿的JavaScript學習筆記(12——jQuery-擴展選擇器)
- Java程序猿的JavaScript學習筆記(13——jQuery UI)
- 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;
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-擴展選擇器)