I have a little problem here, when i add a new field the select option i created from var won’t show. I have tried a multiple method like changing from id into class, add a var option name into <select>
in var html and it still doesn’t work. I suppose my JS nesting is the problem or something missing? If so any suggestion what code i must change or add here?
JavaScript
x
108
108
1
var data = {
2
Food: [
3
{
4
id: 1,
5
name: 'Fried Rice',
6
price: 10000
7
},
8
{
9
id: 2,
10
name: 'Fried Noodle',
11
price: 9000
12
},
13
{
14
id: 3,
15
name: 'Pancake',
16
price: 8500
17
},
18
{
19
id: 4,
20
name: 'French Fries',
21
price: 7500
22
}
23
],
24
Drink: [
25
{
26
id: 1,
27
name: 'Cola',
28
price: 4600
29
},
30
{
31
id: 2,
32
name: 'Orange Juice',
33
price: 5400
34
},
35
{
36
id: 3,
37
name: 'Mineral Water',
38
price: 3500
39
},
40
{
41
id: 4,
42
name: 'Coffee',
43
price: 5800
44
}
45
]
46
}
47
48
function handleChange() {
49
var x = document.getElementById("category_select").value;
50
51
var dataOptions = data[x]
52
var dataSelect = document.getElementById('type_select')
53
dataSelect.innerHTML = ''
54
55
dataOptions.forEach(function (option) {
56
var optionEle = document.createElement('option')
57
optionEle.value = option.id
58
optionEle.label = option.name
59
optionEle.setAttribute('data-price', option.price)
60
61
dataSelect.appendChild(optionEle)
62
})
63
64
}
65
handleChange()
66
67
$(".addRow").click(function () {
68
var html = '';
69
html += '<div class="row">';
70
html += '<div class="col-md-3">';
71
html += '<button type="button" class="btn btn-danger btn-lg delRow">Del</button>';
72
html += '</div>';
73
html += '<div class="col-md-3">';
74
html += '<select class="form-select form-select-lg mb-3" id="category_select" onChange="handleChange()">';
75
html += '<option value="Food">Food</option>';
76
html += '<option value="Drink">Drink</option>';
77
html += '</select>';
78
html += '</div>';
79
html += '<br>';
80
html += '<div class="col-md-3">';
81
html += '<select class="form-select form-select-lg mb-3" id="type_select">' + $("#type_select option:selected").attr('label') + '</select>'; //select option from var data didn't show here
82
html += '</div>';
83
html += '<div class="col-md-3">';
84
html += '<input type="number" class="form-control form-control-lg mb-3" id="num" placeholder="Qty" min="0">';
85
html += '</div>';
86
html += '</div>';
87
88
$('.container-fluid').append(html);
89
});
90
91
$(document).on('click', '.delRow', function () {
92
$(this).closest('.row').remove();
93
});
94
95
$(document).ready(function () {
96
var selectMenu = {};
97
$(".order").click(function () {
98
var itemName = $("#type_select option:selected").attr('label');
99
var price = Number($("#type_select option:selected").data('price'));
100
var count = Number($("#num").val());
101
var total = price * count;
102
selectMenu[itemName] = total
103
var result = JSON.stringify(selectMenu).replace(/,/g, '<br>').replace(/{|}|"/g, "")
104
105
$(".result").html(result);
106
});
107
108
});
JavaScript
1
12
12
1
button[type=submit] {
2
width: 50%;
3
margin-left: 25%;
4
margin-right: 25%;
5
}
6
7
button[type=button] {
8
font-size: 20px;
9
width: 50%;
10
margin-left: 25%;
11
margin-right: 25%;
12
}
JavaScript
1
33
33
1
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet"
2
integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
3
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
4
5
<div class="container">
6
<div class="container-fluid text-center">
7
<h2 style="font-size:70px; font-family:Lucida Console;">MENU</h2>
8
<br>
9
<div class="row">
10
<div class="col-md-3">
11
<button type="button" class="btn btn-primary btn-lg addRow">Add</button>
12
</div>
13
<div class="col-md-3">
14
<select class="form-select form-select-lg mb-3" id="category_select" onChange='handleChange()'>
15
<option value="Food">Food</option>
16
<option value="Drink">Drink</option>
17
</select>
18
</div>
19
<br>
20
<div class="col-md-3">
21
<select class="form-select form-select-lg mb-3" id="type_select"></select>
22
</div>
23
<div class="col-md-3">
24
<input type="number" class="form-control form-control-lg mb-3" id="num" placeholder="Qty" min="0">
25
</div>
26
</div>
27
</div>
28
</div>
29
<br>
30
<button type="submit" class="btn btn-secondary order">Order</button>
31
<br>
32
<br>
33
<div class="result text-center"></div>
Feel free to add some code or change the code as your preferences
Advertisement
Answer
You can pass this
inside your handleChange
function where this
refer to current select-box which is change then using that get other select-box reference and change values .
Demo Code :
JavaScript
1
87
87
1
var data = {
2
Food: [{
3
id: 1,
4
name: 'Fried Rice',
5
price: 10000
6
},
7
{
8
id: 2,
9
name: 'Fried Noodle',
10
price: 9000
11
},
12
{
13
id: 3,
14
name: 'Pancake',
15
price: 8500
16
},
17
{
18
id: 4,
19
name: 'French Fries',
20
price: 7500
21
}
22
],
23
Drink: [{
24
id: 1,
25
name: 'Cola',
26
price: 4600
27
},
28
{
29
id: 2,
30
name: 'Orange Juice',
31
price: 5400
32
},
33
{
34
id: 3,
35
name: 'Mineral Water',
36
price: 3500
37
},
38
{
39
id: 4,
40
name: 'Coffee',
41
price: 5800
42
}
43
]
44
}
45
46
function handleChange(el) {
47
//if undefined use closest & find to get select value
48
var els_cat = (el != undefined) ? $(el).closest(".outer").find(".cat").val() : $("#category_select").val()
49
console.log(els_cat)
50
var els_type = (el != undefined) ? $(el).closest(".outer").find(".type") : $("#type_select")
51
var dataOptions = data[els_cat]
52
els_type.html('') //empty
53
dataOptions.forEach(function(option) {
54
var optionEle = document.createElement('option')
55
optionEle.value = option.id
56
optionEle.label = option.name
57
optionEle.setAttribute('data-price', option.price)
58
els_type.append(optionEle) //append same
59
})
60
}
61
handleChange()
62
63
$(".addRow").click(function() {
64
var cloned = $("#type_select").clone() //cloned select
65
var html = '';
66
//added one outer class
67
html += '<div class="row outer">';
68
html += '<div class="col-md-3">';
69
html += '<button type="button" class="btn btn-danger btn-lg delRow">Del</button>';
70
html += '</div>';
71
html += '<div class="col-md-3">';
72
html += '<select class="form-select form-select-lg mb-3 cat" onChange="handleChange(this)">'; //use clone for this as well if needed same options ..
73
html += '<option value="Food">Food</option>';
74
html += '<option value="Drink">Drink</option>';
75
html += '</select>';
76
html += '</div>';
77
html += '<br>';
78
html += '<div class="col-md-3">';
79
html += '<select class="form-select form-select-lg mb-3 type">' + $(cloned).html() + '</select>'; //pass same
80
html += '</div>';
81
html += '<div class="col-md-3">';
82
html += '<input type="number" class="form-control form-control-lg mb-3" id="num" placeholder="Qty" min="0">';
83
html += '</div>';
84
html += '</div>';
85
86
$('.container-fluid').append(html);
87
});
JavaScript
1
35
35
1
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous">
2
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
3
4
<div class="container">
5
<div class="container-fluid text-center">
6
<h2 style="font-size:70px; font-family:Lucida Console;">MENU</h2>
7
<br>
8
<!--added classs-->
9
<div class="row outer">
10
<div class="col-md-3">
11
<button type="button" class="btn btn-primary btn-lg addRow">Add</button>
12
</div>
13
<div class="col-md-3">
14
<!--added class cat -->
15
<select class=" form-select form-select-lg mb-3 cat" id="category_select" onChange='handleChange(this)'>
16
<option value="Food">Food</option>
17
<option value="Drink">Drink</option>
18
</select>
19
</div>
20
<br>
21
<div class="col-md-3">
22
<!--added class cat -->
23
<select class="form-select form-select-lg mb-3 type" id="type_select"></select>
24
</div>
25
<div class="col-md-3">
26
<input type="number" class="form-control form-control-lg mb-3" id="num" placeholder="Qty" min="0">
27
</div>
28
</div>
29
</div>
30
</div>
31
<br>
32
<button type="submit" class="btn btn-secondary order">Order</button>
33
<br>
34
<br>
35
<div class="result text-center"></div>