Skip to content

Commit af68a8c

Browse files
committed
refactor(defaultTheme): refine filter logic
use `NodeList.foreach()` instead of iterate manually.
1 parent 591a62c commit af68a8c

File tree

1 file changed

+35
-37
lines changed

1 file changed

+35
-37
lines changed

src/tpl/defaultTheme/frontend/index.js

Lines changed: 35 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
var classNone = 'none';
66
var classHeader = 'header';
77

8-
var selectorNone = '.' + classNone;
9-
var selectorNotNone = ':not(' + selectorNone + ')';
108
var selectorItem = '.item-list > li:not(.' + classHeader + '):not(.parent)';
11-
var selectorItemNone = selectorItem + selectorNone;
12-
var selectorItemNotNone = selectorItem + selectorNotNone;
139

1410
var leavingEvent = typeof window.onpagehide !== strUndef ? 'pagehide' : 'beforeunload';
1511

@@ -34,61 +30,63 @@
3430
var lastFocused;
3531

3632
function enableFilter() {
37-
// pre check
3833
var filter = document.body.querySelector('.filter');
39-
if (!filter) {
40-
return;
41-
}
34+
if (!filter) return;
4235

4336
var input = filter.querySelector('input');
44-
if (!input) {
45-
return;
46-
}
37+
if (!input) return;
4738

4839
var clear = filter.querySelector('button');
4940

50-
// event handler
41+
var selectorIsNone = '.' + classNone;
42+
var selectorNotNone = ':not(' + selectorIsNone + ')';
43+
var selectorItemIsNone = selectorItem + selectorIsNone;
44+
var selectorItemNotNone = selectorItem + selectorNotNone;
45+
5146
var timeoutId;
5247
var lastFilterText = '';
5348
var doFilter = function () {
5449
var filterText = input.value.trim().toLowerCase();
55-
if (filterText === lastFilterText) {
56-
return;
57-
}
58-
59-
var selector, items, i;
50+
if (filterText === lastFilterText) return;
6051

61-
if (!filterText) { // filter cleared, show all items
62-
if (clear) {
63-
clear.style.display = '';
64-
}
65-
selector = selectorItemNone;
66-
items = document.body.querySelectorAll(selector);
67-
for (i = items.length - 1; i >= 0; i--) {
68-
items[i].classList.remove(classNone);
69-
}
70-
} else {
52+
var items
53+
if (filterText) {
7154
if (clear) {
7255
clear.style.display = 'block';
7356
}
57+
58+
var selector
7459
if (filterText.indexOf(lastFilterText) >= 0) { // increment search, find in visible items
7560
selector = selectorItemNotNone;
7661
} else if (lastFilterText.indexOf(filterText) >= 0) { // decrement search, find in hidden items
77-
selector = selectorItemNone;
62+
selector = selectorItemIsNone;
7863
} else {
7964
selector = selectorItem;
8065
}
8166

8267
items = document.body.querySelectorAll(selector);
83-
for (i = items.length - 1; i >= 0; i--) {
84-
var item = items[i];
68+
if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge
69+
items.forEach(function (item) {
8570
var name = item.querySelector('.name');
86-
if (name && name.textContent.toLowerCase().indexOf(filterText) < 0) {
87-
item.classList.add(classNone);
71+
if (name.textContent.toLowerCase().indexOf(filterText) < 0) {
72+
if (selector !== selectorItemIsNone) {
73+
item.classList.add(classNone);
74+
}
8875
} else {
89-
item.classList.remove(classNone);
76+
if (selector !== selectorItemNotNone) {
77+
item.classList.remove(classNone);
78+
}
9079
}
80+
});
81+
} else { // filter cleared, show all items
82+
if (clear) {
83+
clear.style.display = '';
9184
}
85+
items = document.body.querySelectorAll(selectorItemIsNone);
86+
if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge
87+
items.forEach(function (item) {
88+
item.classList.remove(classNone);
89+
});
9290
}
9391

9492
lastFilterText = filterText;
@@ -98,8 +96,8 @@
9896
clearTimeout(timeoutId);
9997
timeoutId = setTimeout(doFilter, 350);
10098
};
101-
input.addEventListener('input', onValueMayChange, false);
102-
input.addEventListener('change', onValueMayChange, false);
99+
input.addEventListener('input', onValueMayChange);
100+
input.addEventListener('change', onValueMayChange);
103101

104102
var onEnter = function () {
105103
clearTimeout(timeoutId);
@@ -124,7 +122,7 @@
124122
e.preventDefault();
125123
break;
126124
}
127-
}, false);
125+
});
128126

129127
clear && clear.addEventListener('click', function () {
130128
clearTimeout(timeoutId);
@@ -142,7 +140,7 @@
142140
if (input.value) {
143141
sessionStorage.setItem(location.pathname, input.value);
144142
}
145-
}, false);
143+
});
146144

147145
if (prevSessionFilter) {
148146
input.value = prevSessionFilter;

0 commit comments

Comments
 (0)