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