Skip to content

Commit 423f9e4

Browse files
author
Adam Bradley
committed
fix(active): Updated which elements to set active class along w/ tests, closes #857
1 parent c653e83 commit 423f9e4

File tree

2 files changed

+122
-16
lines changed

2 files changed

+122
-16
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
describe('Ionic Element Activator', function() {
2+
3+
window.setTimeout = ionic.requestAnimationFrame = function(cb) { cb(); };
4+
5+
it('Should activate an <a>', function() {
6+
var e = { target: document.createElement('a') };
7+
ionic.activator.start(e);
8+
expect(e.target.classList.contains('active')).toEqual(true);
9+
});
10+
11+
it('Should activate a <button>', function() {
12+
var e = { target: document.createElement('button') };
13+
ionic.activator.start(e);
14+
expect(e.target.classList.contains('active')).toEqual(true);
15+
});
16+
17+
it('Should activate an element with ng-click', function() {
18+
var e = { target: document.createElement('div') };
19+
e.target.setAttribute('ng-click', 'test()');
20+
ionic.activator.start(e);
21+
expect(e.target.classList.contains('active')).toEqual(true);
22+
});
23+
24+
it('Should activate a .button', function() {
25+
var e = { target: document.createElement('div') };
26+
e.target.className = 'button';
27+
ionic.activator.start(e);
28+
expect(e.target.classList.contains('active')).toEqual(true);
29+
});
30+
31+
it('Should not activate just .item', function() {
32+
var e = { target: document.createElement('div') };
33+
e.target.className = 'item';
34+
ionic.activator.start(e);
35+
expect(e.target.classList.contains('active')).toEqual(false);
36+
});
37+
38+
it('Should activate .item with a child "a"', function() {
39+
var itemEle = document.createElement('div');
40+
itemEle.className = 'item';
41+
42+
var aEle = document.createElement('a');
43+
itemEle.appendChild(aEle);
44+
45+
var e = { target: aEle };
46+
47+
ionic.activator.start(e);
48+
expect(itemEle.classList.contains('active')).toEqual(true);
49+
expect(aEle.classList.contains('active')).toEqual(false);
50+
});
51+
52+
it('Should activate .item with a child "div.item-content a"', function() {
53+
var itemEle = document.createElement('div');
54+
itemEle.className = 'item';
55+
56+
var itemContentEle = document.createElement('div');
57+
itemContentEle.className = 'item-content';
58+
itemEle.appendChild(itemContentEle);
59+
60+
var aEle = document.createElement('a');
61+
itemContentEle.appendChild(aEle);
62+
63+
var e = { target: aEle };
64+
65+
ionic.activator.start(e);
66+
expect(itemEle.classList.contains('active')).toEqual(true);
67+
expect(itemContentEle.classList.contains('active')).toEqual(false);
68+
expect(aEle.classList.contains('active')).toEqual(false);
69+
});
70+
71+
it('Should activate .item with a child "div.item-content div[ng-click]"', function() {
72+
var itemEle = document.createElement('div');
73+
itemEle.className = 'item';
74+
75+
var itemContentEle = document.createElement('div');
76+
itemContentEle.className = 'item-content';
77+
itemEle.appendChild(itemContentEle);
78+
79+
var divEle = document.createElement('div');
80+
divEle.setAttribute('ng-click', 'test()');
81+
itemContentEle.appendChild(divEle);
82+
83+
var e = { target: divEle };
84+
85+
ionic.activator.start(e);
86+
expect(itemEle.classList.contains('active')).toEqual(true);
87+
expect(itemContentEle.classList.contains('active')).toEqual(false);
88+
expect(divEle.classList.contains('active')).toEqual(false);
89+
});
90+
91+
});

js/utils/activator.js

+31-16
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,34 @@
55
var activeElements = {}; // elements that are currently active
66
var keyId = 0; // a counter for unique keys for the above ojects
77

8-
function onStart(e) {
9-
// when an element is touched/clicked, it climbs up a few
10-
// parents to see if it is an .item or .button element
8+
ionic.activator = {
119

12-
ionic.requestAnimationFrame(function(){
13-
var x, ele = e.target;
14-
for(x=0; x<5; x++) {
15-
if(!ele || ele.tagName === 'LABEL') break;
16-
if( ele.classList.contains('item') || ele.classList.contains('button') ) {
10+
start: function(e) {
11+
// when an element is touched/clicked, it climbs up a few
12+
// parents to see if it is an .item or .button element
13+
ionic.requestAnimationFrame(function(){
14+
var ele = e.target;
15+
var eleToActivate;
1716

17+
for(var x=0; x<4; x++) {
18+
if(!ele) break;
19+
if(eleToActivate && ele.classList.contains('item')) {
20+
eleToActivate = ele;
21+
break;
22+
}
23+
if( ele.tagName == 'A' || ele.tagName == 'BUTTON' || ele.getAttribute('ng-click') ) {
24+
eleToActivate = ele;
25+
}
26+
if( ele.classList.contains('button') ) {
27+
eleToActivate = ele;
28+
break;
29+
}
30+
ele = ele.parentElement;
31+
}
32+
33+
if(eleToActivate) {
1834
// queue that this element should be set to active
19-
queueElements[keyId] = ele;
35+
queueElements[keyId] = eleToActivate;
2036

2137
// in XX milliseconds, set the queued elements to active
2238
// add listeners to clear all queued/active elements onMove
@@ -29,12 +45,11 @@
2945
}
3046

3147
keyId = (keyId > 19 ? 0 : keyId + 1);
32-
break;
3348
}
34-
ele = ele.parentElement;
35-
}
36-
});
37-
}
49+
50+
});
51+
}
52+
};
3853

3954
function activateElements() {
4055
// activate all elements in the queue
@@ -76,8 +91,8 @@
7691
// use window.onload because this doesn't need to run immediately
7792
window.addEventListener('load', function(){
7893
// start an active element
79-
document.body.addEventListener('touchstart', onStart, false);
80-
document.body.addEventListener('mousedown', onStart, false);
94+
document.body.addEventListener('touchstart', ionic.activator.start, false);
95+
document.body.addEventListener('mousedown', ionic.activator.start, false);
8196

8297
// clear all active elements after XX milliseconds
8398
document.body.addEventListener('touchend', onEnd, false);

0 commit comments

Comments
 (0)