ここ最近、

さて、
jQuery.classFilter()
1637: classFilter: function(r,m,not){
1638: m = " " + m + " ";
1639: var tmp = [];
1640: for ( var i = 0; r[i]; i++ ) {
1641: var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
1642: if ( !not && pass || not && !pass )
1643: tmp.push( r[i] );
1644: }
1645: return tmp;
1646: },
1647:
jQuery.
jQuery.filter()
jQuery.
1648: filter: function(t,r,not) {
1649: var last;
1650:
1651: // Look for common filter expressions
1652: while ( t && t != last ) {
1653: last = t;
1654:
1655: var p = jQuery.parse, m;
1656:
1657: for ( var i = 0; p[i]; i++ ) {
1658: m = p[i].exec( t );
1659:
1660: if ( m ) {
1661: // Remove what we just matched
1662: t = t.substring( m[0].length );
1663:
1664: m[2] = m[2].replace(/\\/g, "");
1665: break;
1666: }
1667: }
1668:
1669: if ( !m )
1670: break;
1671:
1648行目から見ていきましょう。第1引数 t にセレクタ式、
1653行目でlastの値として、
1655行目のjQuery.
1672: // :not() is a special case that can be optimized by
1673: // keeping it out of the expression list
1674: if ( m[1] == ":" && m[2] == "not" )
1675: // optimize if only one selector found (most common case)
1676: r = isSimple.test( m[3] ) ?
1677: jQuery.filter(m[3], r, true).r :
1678: jQuery( r ).not( m[3] );
1679:
1680: // We can get a big speed boost by filtering by class here
1681: else if ( m[1] == "." )
1682: r = jQuery.classFilter(r, m[2], not);
1683:
1684: else if ( m[1] == "[" ) {
1685: var tmp = [], type = m[3];
1686:
1687: for ( var i = 0, rl = r.length; i < rl; i++ ) {
1688: var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
1689:
1690: if ( z == null || /href|src|selected/.test(m[2]) )
1691: z = jQuery.attr(a,m[2]) || '';
1692:
1693: if ( (type == "" && !!z ||
1694: type == "=" && z == m[5] ||
1695: type == "!=" && z != m[5] ||
1696: type == "^=" && z && !z.indexOf(m[5]) ||
1697: type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
1698: (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
1699: tmp.push( a );
1700: }
1701:
1702: r = tmp;
1703:
1674行目は、
1681行目は、
1684行目は、
1704: // We can get a speed boost by handling nth-child here
1705: } else if ( m[1] == ":" && m[2] == "nth-child" ) {
1706: var merge = {}, tmp = [],
1707: // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
1708: test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
1709: m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
1710: !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
1711: // calculate the numbers (first)n+(last) including if they are negative
1712: first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
1713:
1714: // loop through all the elements left in the jQuery object
1715: for ( var i = 0, rl = r.length; i < rl; i++ ) {
1716: var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
1717:
1718: if ( !merge[id] ) {
1719: var c = 1;
1720:
1721: for ( var n = parentNode.firstChild; n; n = n.nextSibling )
1722: if ( n.nodeType == 1 )
1723: n.nodeIndex = c++;
1724:
1725: merge[id] = true;
1726: }
1727:
1728: var add = false;
1729:
1730: if ( first == 0 ) {
1731: if ( node.nodeIndex == last )
1732: add = true;
1733: } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
1734: add = true;
1735:
1736: if ( add ^ not )
1737: tmp.push( node );
1738: }
1739:
1740: r = tmp;
1741:
1705行目からは、
そして、
1730行目ですが、
1736行目にて、
1742: // Otherwise, find the expression to execute
1743: } else {
1744: var f = jQuery.expr[m[1]];
1745: if ( typeof f != "string" )
1746: f = jQuery.expr[m[1]][m[2]];
1747:
1748: // Build a custom macro to enclose it
1749: f = eval("false||function(a,i){return " + f + "}");
1750:
1751: // Execute it against the current filter
1752: r = jQuery.grep( r, f, not );
1753: }
1754: }
1755:
1756: // Return an array of filtered elements (r)
1757: // and the modified expression string (t)
1758: return { r: r, t: t };
1759: },
1760:
以上のどのセレクタ式でもない場合ですが、
最後に1758行目にて、
jQuery.dir()
1761: dir: function( elem, dir ){
1762: var matched = [];
1763: var cur = elem[dir];
1764: while ( cur && cur != document ) {
1765: if ( cur.nodeType == 1 )
1766: matched.push( cur );
1767: cur = cur[dir];
1768: }
1769: return matched;
1770: },
1771:
jQuery.
jQuery.nth()
1772: nth: function(cur,result,dir,elem){
1773: result = result || 1;
1774: var num = 0;
1775:
1776: for ( ; cur; cur = cur[dir] )
1777: if ( cur.nodeType == 1 && ++num == result )
1778: break;
1779:
1780: return cur;
1781: },
1782:
jQuery.
なお、
jQuery.sibling()
1783: sibling: function( n, elem ) {
1784: var r = [];
1785:
1786: for ( ; n; n = n.nextSibling ) {
1787: if ( n.nodeType == 1 && (!elem || n != elem) )
1788: r.push( n );
1789: }
1790:
1791: return r;
1792: }
1793: });
1794:
jQuery.