#javascript
#javascript
Вопрос:
У меня есть простое поле выбора выпадающего списка с использованием html и js. В настоящее время все элементы в выпадающем списке являются статическими. В другом месте у меня есть таблица, доступная для редактирования пользователем. Я пытаюсь получить текстовые значения всех ячеек с определенным классом, которые будут в раскрывающемся списке.
Вот что у меня есть до сих пор:
<input type="text" placeholder="Account" id="new_account" onkeyup="filterFunction()" onclick="myFunction()">
<div id="myDropdown" class="dropdown-content">
<a id="accselect1" onclick="selectAccount">About</a>
<a id="accselect2" onclick="selectAccount">Blogg</a>
<a id="accselect3" onclick="selectAccount">Blog</a>
<a id="accselect4" onclick="selectAccount">Contact</a>
<a id="accselect5" onclick="selectAccount">Custom</a>
<a id="accselect6" onclick="selectAccount">Support</a>
<a id="accselect7" onclick="selectAccount">Tools</a>
</div>
function myFunction() {
document.getElementById("myDropdown").classList.toggle("show");
}
function filterFunction() {
var input, filter, ul, li, a, i;
input = document.getElementById("new_account");
filter = input.value.toUpperCase();
div = document.getElementById("myDropdown");
a = div.getElementsByTagName("a");
for (i = 0; i < a.length; i ) {
txtValue = a[i].textContent || a[i].innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
a[i].style.display = "";
} else {
a[i].style.display = "none";
}
}
}
В другом месте на моей странице у меня есть:
<div class="content" id="acc_list"><table class="acc_table" id="acc_table1">
<tr id=acc_row1acc_table1><td id="acc_name1" class="accname">Cash</td><td id="acc_balance1" class="accbal">$5322.54</td><td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td></tr>
<tr id=acc_row2acc_table1><td id="acc_name2" class="accname">Credit Card</td><td id=acc_balance2 class="accbal">$1362.21</td><td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td></tr>
<tr id=acc_row3acc_table1><td id="acc_name3" class="accname">Checking Account</td><td id=acc_balance3 class="accbal">$4322.50</td><td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td></tr>
<tr id=acc_row4acc_table1><td id="acc_name4" class="accname">Savings Account</td><td id=acc_balance4 class="accbal">$12322.50</td><td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td></tr>
</table><div><h4 id="acc">amp;nbsp<button data-modal-target="#modal" class="add_account" id="editaccounts" onclick="sayadd(); accounttablenum('acc_table1')"> </button></h4></div></div>
Я пытаюсь получить текст всех td с class .accname для заполнения выпадающего списка.
Ответ №1:
document.querySelectorAll(".accname").forEach(element=>{
//get all elements with class .accname and for each of them:
let dropdown=document.querySelector("#myDropdown");
//get drop-down element
let options=document.querySelectorAll("#myDropdown > a").length;
//get number of current options
dropdown.innerHTML = dropdown.innerHTML '<a id="accselect' (options 1) '" onclick="selectAccount"> ' element.innerText ' </a>'
// append new option with current id 1 and elements inner text
});
оберните все function options (){...}
это, затем вызовите загрузку страницы : options()
Имейте в виду, что вам, вероятно, придется вызывать его и в sayadd()
функции, но вы не показали полный код…
Рабочий пример:
function myFunction() {
document.getElementById("myDropdown").classList.toggle("show");
}
function filterFunction() {
var input, filter, ul, li, a, i;
input = document.getElementById("new_account");
filter = input.value.toUpperCase();
div = document.getElementById("myDropdown");
a = div.getElementsByTagName("a");
for (i = 0; i < a.length; i ) {
txtValue = a[i].textContent || a[i].innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
a[i].style.display = "";
} else {
a[i].style.display = "none";
}
}
}
function options() {
document.querySelectorAll(".accname").forEach(element => {
let dropdown = document.querySelector("#myDropdown");
let options = document.querySelectorAll("#myDropdown > a").length;
dropdown.innerHTML = dropdown.innerHTML '<a id="accselect' (options 1) '" onclick="selectAccount"> ' element.innerText ' </a>'
});
}
options()
<input type="text" placeholder="Account" id="new_account" onkeyup="filterFunction()" onclick="myFunction()">
<div id="myDropdown" class="dropdown-content">
<a id="accselect1" onclick="selectAccount">About</a>
<a id="accselect2" onclick="selectAccount">Blogg</a>
<a id="accselect3" onclick="selectAccount">Blog</a>
<a id="accselect4" onclick="selectAccount">Contact</a>
<a id="accselect5" onclick="selectAccount">Custom</a>
<a id="accselect6" onclick="selectAccount">Support</a>
<a id="accselect7" onclick="selectAccount">Tools</a>
</div>
<div class="content" id="acc_list">
<table class="acc_table" id="acc_table1">
<tr id=acc_row1acc_table1>
<td id="acc_name1" class="accname">Cash</td>
<td id="acc_balance1" class="accbal">$5322.54</td>
<td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td>
</tr>
<tr id=acc_row2acc_table1>
<td id="acc_name2" class="accname">Credit Card</td>
<td id=acc_balance2 class="accbal">$1362.21</td>
<td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td>
</tr>
<tr id=acc_row3acc_table1>
<td id="acc_name3" class="accname">Checking Account</td>
<td id=acc_balance3 class="accbal">$4322.50</td>
<td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td>
</tr>
<tr id=acc_row4acc_table1>
<td id="acc_name4" class="accname">Savings Account</td>
<td id=acc_balance4 class="accbal">$12322.50</td>
<td class=edtbutton><button class="edit_account" data-modal-target="#modal" id="editaccounts" onclick="sayedit()">✎</button></td>
</tr>
</table>
<div>
<h4 id="acc">amp;nbsp<button data-modal-target="#modal" class="add_account" id="editaccounts" onclick="sayadd(); accounttablenum('acc_table1')"> </button></h4>
</div>
</div>
Комментарии:
1. Работает, спасибо! Если элементы удалены из таблицы, как я могу удалить их из выпадающего списка? Функция options вызывается onclick при вводе учетной записи.
2. @smurf41 Как я уже упоминал в своем ответе, в конце каждого изменения в списке вы должны
options ()
снова вызывать функцию. Таким образом, он повторно заполняет параметры новым состоянием.3. Я сделал это, но он просто продолжает добавлять все элементы в выпадающий список при каждом нажатии. Новые элементы продолжают добавляться как дубликаты.
4. Трудно сказать, и именно по этой причине вы должны опубликовать весь соответствующий код, о котором идет речь. Но в вашей функции удаления вы можете добавить строку, в которой она будет соответствовать удалению.innerText с помощью выпадающего item.innerText и удалить его…
5. Вот мой полный код (только соответствующие части): codepen.io/schinken82/pen/bGebOPr