How to limit amount of selected in custom select menu in javascript?
I want to make a custom select menu where you can select items in it. This is my code for now:
JavaScript
x
57
57
1
class CustomSelect {
2
constructor(originalSelect) {
3
this.originalSelect = originalSelect;
4
this.customSelect = document.createElement("div");
5
this.customSelect.classList.add("select");
6
7
this.originalSelect.querySelectorAll("option").forEach((optionElement) => {
8
const itemElement = document.createElement("div");
9
10
itemElement.classList.add("select__item");
11
itemElement.textContent = optionElement.textContent;
12
this.customSelect.appendChild(itemElement);
13
14
if (optionElement.selected) {
15
this._select(itemElement);
16
}
17
18
itemElement.addEventListener("click", () => {
19
if (
20
this.originalSelect.multiple &&
21
itemElement.classList.contains("select__item--selected")
22
) {
23
this._deselect(itemElement);
24
} else {
25
this._select(itemElement);
26
}
27
});
28
});
29
30
this.originalSelect.insertAdjacentElement("afterend", this.customSelect);
31
this.originalSelect.style.display = "none";
32
}
33
34
_select(itemElement) {
35
const index = Array.from(this.customSelect.children).indexOf(itemElement);
36
37
if (!this.originalSelect.multiple) {
38
this.customSelect.querySelectorAll(".select__item").forEach((el) => {
39
el.classList.remove("select__item--selected");
40
});
41
}
42
43
this.originalSelect.querySelectorAll("option")[index].selected = true;
44
itemElement.classList.add("select__item--selected");
45
}
46
47
_deselect(itemElement) {
48
const index = Array.from(this.customSelect.children).indexOf(itemElement);
49
50
this.originalSelect.querySelectorAll("option")[index].selected = false;
51
itemElement.classList.remove("select__item--selected");
52
}
53
}
54
55
document.querySelectorAll(".custom-select").forEach((selectElement) => {
56
new CustomSelect(selectElement);
57
});
JavaScript
1
21
21
1
.select {
2
display: grid;
3
grid-template-columns: repeat(3, 1fr);
4
max-width: 300px;
5
gap: 1px;
6
}
7
8
.select__item {
9
padding: 10px;
10
cursor: pointer;
11
font-family: "Heebo", sans-serif;
12
text-align: center;
13
border-radius: 3px;
14
background: #eeeeee;
15
transition: background 0.1s;
16
}
17
18
.select__item--selected {
19
background: #009578;
20
color: #ffffff;
21
}
JavaScript
1
8
1
<select name="language" class="custom-select" multiple>
2
<option value="html">HTML</option>
3
<option value="css">CSS</option>
4
<option value="javascript">JavaScript</option>
5
<option value="python">Python</option>
6
<option value="sql">SQL</option>
7
<option value="kotlin">Kotlin</option>
8
</select>
What it does now is fine, I just want to add the limitation so that you can only select two items. This is because I want to make a game similar to memory.
Does anyone know how to do this?
Advertisement
Answer
Just count selected items, create variable let count = 0;
, add count increase on selection add check on count before selecting.
JavaScript
1
61
61
1
class CustomSelect {
2
constructor(originalSelect) {
3
this.originalSelect = originalSelect;
4
this.customSelect = document.createElement("div");
5
this.customSelect.classList.add("select");
6
7
let count = 0;
8
9
this.originalSelect.querySelectorAll("option").forEach((optionElement) => {
10
const itemElement = document.createElement("div");
11
12
itemElement.classList.add("select__item");
13
itemElement.textContent = optionElement.textContent;
14
this.customSelect.appendChild(itemElement);
15
16
if (optionElement.selected) {
17
this._select(itemElement);
18
}
19
20
itemElement.addEventListener("click", () => {
21
if (
22
this.originalSelect.multiple &&
23
itemElement.classList.contains("select__item--selected")
24
) {
25
this._deselect(itemElement);
26
count--;
27
} else if (count < 2) {
28
this._select(itemElement);
29
count++;
30
}
31
});
32
});
33
34
this.originalSelect.insertAdjacentElement("afterend", this.customSelect);
35
this.originalSelect.style.display = "none";
36
}
37
38
_select(itemElement) {
39
const index = Array.from(this.customSelect.children).indexOf(itemElement);
40
41
if (!this.originalSelect.multiple) {
42
this.customSelect.querySelectorAll(".select__item").forEach((el) => {
43
el.classList.remove("select__item--selected");
44
});
45
}
46
47
this.originalSelect.querySelectorAll("option")[index].selected = true;
48
itemElement.classList.add("select__item--selected");
49
}
50
51
_deselect(itemElement) {
52
const index = Array.from(this.customSelect.children).indexOf(itemElement);
53
54
this.originalSelect.querySelectorAll("option")[index].selected = false;
55
itemElement.classList.remove("select__item--selected");
56
}
57
}
58
59
document.querySelectorAll(".custom-select").forEach((selectElement) => {
60
new CustomSelect(selectElement);
61
});
JavaScript
1
21
21
1
.select {
2
display: grid;
3
grid-template-columns: repeat(3, 1fr);
4
max-width: 300px;
5
gap: 1px;
6
}
7
8
.select__item {
9
padding: 10px;
10
cursor: pointer;
11
font-family: "Heebo", sans-serif;
12
text-align: center;
13
border-radius: 3px;
14
background: #eeeeee;
15
transition: background 0.1s;
16
}
17
18
.select__item--selected {
19
background: #009578;
20
color: #ffffff;
21
}
JavaScript
1
8
1
<select name="language" class="custom-select" multiple>
2
<option value="html">HTML</option>
3
<option value="css">CSS</option>
4
<option value="javascript">JavaScript</option>
5
<option value="python">Python</option>
6
<option value="sql">SQL</option>
7
<option value="kotlin">Kotlin</option>
8
</select>