Skip to content

Commit 6348d48

Browse files
committed
refactor(defaultTheme): refine filter logic
use `NodeList.foreach()` instead of iterate manually.
1 parent 408e0e4 commit 6348d48

File tree

1 file changed

+55
-51
lines changed

1 file changed

+55
-51
lines changed

src/tpl/defaultTheme/frontend/index.js

Lines changed: 55 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
var classNone = 'none';
1313
var classHeader = 'header';
1414

15-
var selectorNone = '.' + classNone;
16-
var selectorNotNone = ':not(' + selectorNone + ')';
15+
var selectorIsNone = '.' + classNone;
16+
var selectorNotNone = ':not(' + selectorIsNone + ')';
1717
var selectorPathList = '.path-list';
1818
var selectorItemList = '.item-list';
19-
var selectorItem = selectorItemList + ' > li:not(.' + classHeader + '):not(.parent)';
20-
var selectorItemNone = selectorItem + selectorNone;
19+
var selectorItem = 'li:not(.' + classHeader + '):not(.parent)';
20+
var selectorItemIsNone = selectorItem + selectorIsNone;
2121
var selectorItemNotNone = selectorItem + selectorNotNone;
2222

2323
var leavingEvent = typeof window.onpagehide !== strUndef ? 'pagehide' : 'beforeunload';
@@ -33,75 +33,77 @@
3333
} catch (err) {
3434
}
3535

36+
var filteredText = '';
37+
38+
function matchFilter(input) {
39+
return input.toLowerCase().indexOf(filteredText) >= 0;
40+
}
41+
3642
var lastFocused;
3743

3844
function enableFilter() {
39-
// pre check
4045
var filter = document.body.querySelector('.filter');
41-
if (!filter) {
42-
return;
43-
}
46+
if (!filter) return;
4447

4548
var input = filter.querySelector('input');
46-
if (!input) {
47-
return;
48-
}
49+
if (!input) return;
4950

5051
var clear = filter.querySelector('button');
52+
if (!clear) clear = document.createElement('button');
53+
54+
var itemList = document.querySelector(selectorItemList)
5155

52-
// event handler
5356
var timeoutId;
54-
var lastFilterText = '';
5557
var doFilter = function () {
56-
var filterText = input.value.trim().toLowerCase();
57-
if (filterText === lastFilterText) {
58-
return;
59-
}
58+
var filteringText = input.value.trim().toLowerCase();
59+
if (filteringText === filteredText) return;
6060

61-
var selector, items, i;
61+
var items
62+
if (filteringText) {
63+
clear.style.display = 'block';
6264

63-
if (!filterText) { // filter cleared, show all items
64-
if (clear) {
65-
clear.style.display = '';
66-
}
67-
selector = selectorItemNone;
68-
items = document.body.querySelectorAll(selector);
69-
for (i = items.length - 1; i >= 0; i--) {
70-
items[i].classList.remove(classNone);
71-
}
72-
} else {
73-
if (clear) {
74-
clear.style.display = 'block';
75-
}
76-
if (filterText.indexOf(lastFilterText) >= 0) { // increment search, find in visible items
65+
var selector
66+
if (filteringText.indexOf(filteredText) >= 0) { // increment search, find in visible items
7767
selector = selectorItemNotNone;
78-
} else if (lastFilterText.indexOf(filterText) >= 0) { // decrement search, find in hidden items
79-
selector = selectorItemNone;
68+
} else if (filteredText.indexOf(filteringText) >= 0) { // decrement search, find in hidden items
69+
selector = selectorItemIsNone;
8070
} else {
8171
selector = selectorItem;
8272
}
73+
filteredText = filteringText;
8374

84-
items = document.body.querySelectorAll(selector);
85-
for (i = items.length - 1; i >= 0; i--) {
86-
var item = items[i];
75+
items = itemList.querySelectorAll(selector);
76+
if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge
77+
items.forEach(function (item) {
8778
var name = item.querySelector('.name');
88-
if (name && name.textContent.toLowerCase().indexOf(filterText) < 0) {
89-
item.classList.add(classNone);
79+
if (matchFilter(name.textContent)) {
80+
if (selector !== selectorItemNotNone) {
81+
item.classList.remove(classNone);
82+
}
9083
} else {
91-
item.classList.remove(classNone);
84+
if (selector !== selectorItemIsNone) {
85+
item.classList.add(classNone);
86+
}
9287
}
93-
}
88+
});
89+
} else { // filter cleared, show all items
90+
clear.style.display = '';
91+
filteredText = '';
92+
93+
items = itemList.querySelectorAll(selectorItemIsNone);
94+
if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge
95+
items.forEach(function (item) {
96+
item.classList.remove(classNone);
97+
});
9498
}
95-
96-
lastFilterText = filterText;
9799
};
98100

99101
var onValueMayChange = function () {
100102
clearTimeout(timeoutId);
101103
timeoutId = setTimeout(doFilter, 350);
102104
};
103-
input.addEventListener('input', onValueMayChange, false);
104-
input.addEventListener('change', onValueMayChange, false);
105+
input.addEventListener('input', onValueMayChange);
106+
input.addEventListener('change', onValueMayChange);
105107

106108
var onEnter = function () {
107109
clearTimeout(timeoutId);
@@ -126,7 +128,7 @@
126128
e.preventDefault();
127129
break;
128130
}
129-
}, false);
131+
});
130132

131133
clear && clear.addEventListener('click', function () {
132134
clearTimeout(timeoutId);
@@ -138,17 +140,19 @@
138140
// init
139141
if (hasStorage) {
140142
var prevSessionFilter = sessionStorage.getItem(location.pathname);
141-
sessionStorage.removeItem(location.pathname);
143+
if (prevSessionFilter) {
144+
input.value = prevSessionFilter;
145+
}
146+
if (prevSessionFilter !== null) {
147+
sessionStorage.removeItem(location.pathname);
148+
}
142149

143150
window.addEventListener(leavingEvent, function () {
144151
if (input.value) {
145152
sessionStorage.setItem(location.pathname, input.value);
146153
}
147-
}, false);
154+
});
148155

149-
if (prevSessionFilter) {
150-
input.value = prevSessionFilter;
151-
}
152156
}
153157
if (input.value) {
154158
doFilter();

0 commit comments

Comments
 (0)