|
5 | 5 | var classNone = 'none';
|
6 | 6 | var classHeader = 'header';
|
7 | 7 |
|
8 |
| - var selectorNone = '.' + classNone; |
9 |
| - var selectorNotNone = ':not(' + selectorNone + ')'; |
| 8 | + var selectorIsNone = '.' + classNone; |
| 9 | + var selectorNotNone = ':not(' + selectorIsNone + ')'; |
10 | 10 | var selectorItem = '.item-list > li:not(.' + classHeader + '):not(.parent)';
|
11 |
| - var selectorItemNone = selectorItem + selectorNone; |
| 11 | + var selectorItemIsNone = selectorItem + selectorIsNone; |
12 | 12 | var selectorItemNotNone = selectorItem + selectorNotNone;
|
13 | 13 |
|
14 | 14 | var leavingEvent = typeof window.onpagehide !== strUndef ? 'pagehide' : 'beforeunload';
|
|
34 | 34 | var lastFocused;
|
35 | 35 |
|
36 | 36 | function enableFilter() {
|
37 |
| - // pre check |
38 | 37 | var filter = document.body.querySelector('.filter');
|
39 |
| - if (!filter) { |
40 |
| - return; |
41 |
| - } |
| 38 | + if (!filter) return; |
42 | 39 |
|
43 | 40 | var input = filter.querySelector('input');
|
44 |
| - if (!input) { |
45 |
| - return; |
46 |
| - } |
| 41 | + if (!input) return; |
47 | 42 |
|
48 | 43 | var clear = filter.querySelector('button');
|
49 | 44 |
|
50 |
| - // event handler |
51 | 45 | var timeoutId;
|
52 | 46 | var lastFilterText = '';
|
53 | 47 | var doFilter = function () {
|
54 | 48 | var filterText = input.value.trim().toLowerCase();
|
55 |
| - if (filterText === lastFilterText) { |
56 |
| - return; |
57 |
| - } |
58 |
| - |
59 |
| - var selector, items, i; |
| 49 | + if (filterText === lastFilterText) return; |
60 | 50 |
|
61 |
| - if (!filterText) { // filter cleared, show all items |
| 51 | + var items |
| 52 | + if (filterText) { |
62 | 53 | 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 { |
71 |
| - if (clear) { |
72 |
| - clear.style.display = 'block'; |
| 54 | + clear.classList.remove(classNone) |
73 | 55 | }
|
| 56 | + |
| 57 | + var selector |
74 | 58 | if (filterText.indexOf(lastFilterText) >= 0) { // increment search, find in visible items
|
75 | 59 | selector = selectorItemNotNone;
|
76 | 60 | } else if (lastFilterText.indexOf(filterText) >= 0) { // decrement search, find in hidden items
|
77 |
| - selector = selectorItemNone; |
| 61 | + selector = selectorItemIsNone; |
78 | 62 | } else {
|
79 | 63 | selector = selectorItem;
|
80 | 64 | }
|
81 | 65 |
|
82 | 66 | items = document.body.querySelectorAll(selector);
|
83 |
| - for (i = items.length - 1; i >= 0; i--) { |
84 |
| - var item = items[i]; |
| 67 | + if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge |
| 68 | + items.forEach(function (item) { |
85 | 69 | var name = item.querySelector('.name');
|
86 |
| - if (name && name.textContent.toLowerCase().indexOf(filterText) < 0) { |
87 |
| - item.classList.add(classNone); |
| 70 | + if (name.textContent.toLowerCase().indexOf(filterText) < 0) { |
| 71 | + if (selector !== selectorItemIsNone) { |
| 72 | + item.classList.add(classNone); |
| 73 | + } |
88 | 74 | } else {
|
89 |
| - item.classList.remove(classNone); |
| 75 | + if (selector !== selectorItemNotNone) { |
| 76 | + item.classList.remove(classNone); |
| 77 | + } |
90 | 78 | }
|
| 79 | + }); |
| 80 | + } else { // filter cleared, show all items |
| 81 | + if (clear) { |
| 82 | + clear.classList.add(classNone) |
91 | 83 | }
|
| 84 | + items = document.body.querySelectorAll(selectorItemIsNone); |
| 85 | + if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge |
| 86 | + items.forEach(function (item) { |
| 87 | + item.classList.remove(classNone); |
| 88 | + }); |
92 | 89 | }
|
93 | 90 |
|
94 | 91 | lastFilterText = filterText;
|
|
98 | 95 | clearTimeout(timeoutId);
|
99 | 96 | timeoutId = setTimeout(doFilter, 350);
|
100 | 97 | };
|
101 |
| - input.addEventListener('input', onValueMayChange, false); |
102 |
| - input.addEventListener('change', onValueMayChange, false); |
| 98 | + input.addEventListener('input', onValueMayChange); |
| 99 | + input.addEventListener('change', onValueMayChange); |
103 | 100 |
|
104 | 101 | var onEnter = function () {
|
105 | 102 | clearTimeout(timeoutId);
|
|
124 | 121 | e.preventDefault();
|
125 | 122 | break;
|
126 | 123 | }
|
127 |
| - }, false); |
| 124 | + }); |
128 | 125 |
|
129 | 126 | clear && clear.addEventListener('click', function () {
|
130 | 127 | clearTimeout(timeoutId);
|
|
136 | 133 | // init
|
137 | 134 | if (hasStorage) {
|
138 | 135 | var prevSessionFilter = sessionStorage.getItem(location.pathname);
|
139 |
| - sessionStorage.removeItem(location.pathname); |
| 136 | + if (prevSessionFilter) { |
| 137 | + input.value = prevSessionFilter; |
| 138 | + } |
| 139 | + if (prevSessionFilter !== null) { |
| 140 | + sessionStorage.removeItem(location.pathname); |
| 141 | + } |
140 | 142 |
|
141 | 143 | window.addEventListener(leavingEvent, function () {
|
142 | 144 | if (input.value) {
|
143 | 145 | sessionStorage.setItem(location.pathname, input.value);
|
144 | 146 | }
|
145 |
| - }, false); |
| 147 | + }); |
146 | 148 |
|
147 |
| - if (prevSessionFilter) { |
148 |
| - input.value = prevSessionFilter; |
149 |
| - } |
150 | 149 | }
|
151 | 150 | if (input.value) {
|
152 | 151 | doFilter();
|
|
0 commit comments