/
jquery-extra-selectors.js
executable file
·55 lines (52 loc) · 1.49 KB
/
jquery-extra-selectors.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
* jQuery Extra Selectors - (c) Keith Clark freely distributable under the terms of the MIT license.
*
* twitter.com/keithclarkcouk
* www.keithclark.co.uk
*/
(function($) {
function getNthIndex(cur, dir) {
var t = cur, idx = 0;
while (cur = cur[dir] ) {
if (t.tagName == cur.tagName) {
idx++;
}
}
return idx;
}
function isNthOf(elm, pattern, dir) {
var position = getNthIndex(elm, dir), loop;
if (pattern == "odd" || pattern == "even") {
loop = 2;
position -= !(pattern == "odd");
} else {
var nth = pattern.indexOf("n");
if (nth > -1) {
loop = parseInt(pattern, 10) || parseInt(pattern.substring(0, nth) + "1", 10);
position -= (parseInt(pattern.substring(nth + 1), 10) || 0) - 1;
} else {
loop = position + 1;
position -= parseInt(pattern, 10) - 1;
}
}
return (loop<0 ? position<=0 : position >= 0) && position % loop == 0
}
var pseudos = {
"first-of-type": function(elm) {
return getNthIndex(elm, "previousSibling") == 0;
},
"last-of-type": function(elm) {
return getNthIndex(elm, "nextSibling") == 0;
},
"only-of-type": function(elm) {
return pseudos["first-of-type"](elm) && pseudos["last-of-type"](elm);
},
"nth-of-type": function(elm, i, match) {
return isNthOf(elm, match[3], "previousSibling");
},
"nth-last-of-type": function(elm, i, match) {
return isNthOf(elm, match[3], "nextSibling");
}
}
$.extend($.expr[':'], pseudos);
}(jQuery));