Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81144 views
1
/*
2
* Element Traversal methods from Juriy Zaytsev (kangax)
3
* used to emulate Prototype up/down/previous/next methods
4
*/
5
6
(function(D){
7
8
// TODO: all of this needs tests
9
var match = D.match, select = D.select, root = document.documentElement,
10
11
// Use the Element Traversal API if available.
12
nextElement = 'nextElementSibling',
13
previousElement = 'previousElementSibling',
14
parentElement = 'parentElement';
15
16
// Fall back to the DOM Level 1 API.
17
if (!(nextElement in root)) nextElement = 'nextSibling';
18
if (!(previousElement in root)) previousElement = 'previousSibling';
19
if (!(parentElement in root)) parentElement = 'parentNode';
20
21
function walkElements(property, element, expr) {
22
var i = 0, isIndex = typeof expr == 'number';
23
if (typeof expr == 'undefined') {
24
isIndex = true;
25
expr = 0;
26
}
27
while ((element = element[property])) {
28
if (element.nodeType != 1) continue;
29
if (isIndex) {
30
++i;
31
if (i == expr) return element;
32
} else if (match(element, expr)) {
33
return element;
34
}
35
}
36
return null;
37
}
38
39
/**
40
* @method up
41
* @param {HTMLElement} element element to walk from
42
* @param {String | Number} expr CSS expression or an index
43
* @return {HTMLElement | null}
44
*/
45
function up(element, expr) {
46
return walkElements(parentElement, element, expr);
47
}
48
/**
49
* @method next
50
* @param {HTMLElement} element element to walk from
51
* @param {String | Number} expr CSS expression or an index
52
* @return {HTMLElement | null}
53
*/
54
function next(element, expr) {
55
return walkElements(nextElement, element, expr);
56
}
57
/**
58
* @method previous
59
* @param {HTMLElement} element element to walk from
60
* @param {String | Number} expr CSS expression or an index
61
* @return {HTMLElement | null}
62
*/
63
function previous(element, expr) {
64
return walkElements(previousElement, element, expr);
65
}
66
/**
67
* @method down
68
* @param {HTMLElement} element element to walk from
69
* @param {String | Number} expr CSS expression or an index
70
* @return {HTMLElement | null}
71
*/
72
function down(element, expr) {
73
var isIndex = typeof expr == 'number', descendants, index, descendant;
74
if (expr === null) {
75
element = element.firstChild;
76
while (element && element.nodeType != 1) element = element[nextElement];
77
return element;
78
}
79
if (!isIndex && match(element, expr) || isIndex && expr === 0) return element;
80
descendants = select('*', element);
81
if (isIndex) return descendants[expr] || null;
82
index = 0;
83
while ((descendant = descendants[index]) && !match(descendant, expr)) { ++index; }
84
return descendant || null;
85
}
86
D.up = up;
87
D.down = down;
88
D.next = next;
89
D.previous = previous;
90
})(NW.Dom);
91
92