blob: 71fb17dc0c8ce5de2d5ca8b28df73b2c5100a472 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
const EventEmitter = require('events')
const self = new EventEmitter()
self._items = []
self._selectedItemIndex = -1
self._nodes = {
search: document.querySelector('#search'),
input: document.querySelector('input[type="search"]'),
autocomplete: document.querySelector('.autocomplete')
}
self.getSelectedItem = function () {
if (self.getItems() === []) return
if (self.getSelectedItemIndex() === -1) {
return self.getItems()[0]
} else {
return self.getItems()[self.getSelectedItemIndex()]
}
}
self.getSelectedItemIndex = function () {
return self._selectedItemIndex
}
self.getItems = function () {
return self._items
}
self.removeAllItems = function () {
while (self._nodes.autocomplete.firstChild) {
self._nodes.autocomplete.removeChild(self._nodes.autocomplete.firstChild)
}
self._items = []
self._selectedItemIndex = -1
}
self.addItem = function (item) {
const listItem = document.createElement('li')
listItem.textContent = item.value
self._nodes.autocomplete.appendChild(listItem)
self._items.push(item)
}
self._moveSelected = function (shift) {
if (self._selectedItemIndex + shift >= self.getItems().length) {
self._selectedItemIndex = -1
} else if (self._selectedItemIndex + shift < -1) {
self._selectedItemIndex = self.getItems().length - 1
} else {
self._selectedItemIndex += shift
}
for (let i = 0; i < self.getItems().length; i++) {
self._nodes.autocomplete.children[i].classList.remove('selected')
}
if (self._selectedItemIndex >= 0) {
self._nodes.autocomplete
.children[self._selectedItemIndex].classList.add('selected')
}
}
self._handleItemClick = function (event) {
if (!self._nodes.autocomplete.contains(event.target)) return
const itemIndex = Array.prototype.indexOf
.call(self._nodes.autocomplete.children, event.target)
self._selectedItemIndex = itemIndex
self.emit('select', self.getSelectedItem())
}
self._handleKeydown = function (event) {
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {
event.preventDefault()
if (event.key === 'ArrowDown') {
self._moveSelected(1)
} else if (event.key === 'ArrowUp') {
self._moveSelected(-1)
}
}
}
self._nodes.autocomplete.addEventListener('click', self._handleItemClick)
self._nodes.input.addEventListener('keydown', self._handleKeydown)
module.exports = self
|