Reputation: 159
I am trying to create a function to put options inside a select through the classes of these selects.
function selectOptionsClass(selectClass, arrayOptions) {
let selects = document.querySelectorAll("." + selectClass);
for (let i = 0; i < arrayOptions.length; i++) {
let option = document.createElement("option");
option.value = arrayOptions[i];
option.text = arrayOptions[i];
selects.forEach(select => {
select.innerHTML += `${option}`;
console.log(select);
});
}
}
let testeOptions = [0, 10, 20];
selectOptionsClass('select-teste', testeOptions);
<!DOCTYPE html>
<html lang="en">
<head>
<title>Teste</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" />
</head>
<body>
<div class="form-group col-2">
<label for="teste">Teste</label>
<select name="teste" id="teste" class="form-control select-teste" required></select>
</div>
<div class="form-group col-2">
<label for="teste">Teste</label>
<select name="teste" id="teste" class="form-control select-teste" required></select>
</div>
<div class="form-group col-2">
<label for="teste">Teste</label>
<select name="teste" id="teste" class="form-control select-teste" required></select>
</div>
</body>
</html>
But the function is returning an [object HTMLOptionElement] inside select, not the object element I'd like.
Can someone help me? Thank you!
Upvotes: 1
Views: 2665
Reputation: 9130
Edit:
Looping over the selectClass
, then the arrayOptions
and using appendChild
instead of using innerHTML
resolves the issues.
innerHTML
treats a "string" as if it was predefined HTML, but as you are creating an element, you need to use appendChild
instead.
From “innerHTML += …” vs “appendChild(txtNode)” : Setting innerHTML does indeed invalidate any references to elements within the target element you may be holding -- because those elements don't exist anymore, you removed them and then put in new ones (that look very similar) when you set innerHTML.
function selectOptionsClass(selectClass, arrayOptions) {
let selects = document.querySelectorAll("." + selectClass);
let option;
selects.forEach(select => {
arrayOptions.forEach(opt => {
option = document.createElement("option");
option.value = opt;
option.text = opt;
select.appendChild(option);
});
});
}
let testeOptions = [0, 10, 20];
selectOptionsClass('select-teste', testeOptions);
<label for="teste">Teste</label>
<select name="teste1" id="teste1" class="form-control select-teste" required></select>
<label for="teste">Teste</label>
<select name="teste2" id="teste2" class="form-control select-teste" required></select>
<label for="teste">Teste</label>
<select name="teste3" id="teste3" class="form-control select-teste" required></select>
Upvotes: 1
Reputation: 2238
You're trying to treat an HTML Object in JavaScript like you would a string with this..
select.innerHTML += `${option}`;
You should try something like.
select.appendChild(option)
This actually adds the option as a DOM element as a child of the select.
Upvotes: 1