#javascript #html #function #callback
#javascript #HTML #функция #обратный вызов
Вопрос:
Я довольно новичок в Javascript и пытаюсь создать свою первую программу.
По сути, программа предоставляет пользователям ряд выпадающих списков, и все их выбранные элементы будут сопоставлены в конце, чтобы сформировать объединенную текстовую строку. Мой оригинальный JSFiddle показывает, что программа корректно работает для одного выпадающего списка, и теперь я пытаюсь переделать его в функцию, чтобы этот процесс можно было повторить для нескольких разных выпадающих списков.
Мой НОВЫЙ JSFiddle показывает, что я теперь переписал свой код как функцию и принимаю два параметра (categoryOptions — разные массивы для заполнения полей выбора) и (selector — фактический выбор в документе HTML для целевого назначения).
// Step 4 - Function which will print the selected value into the content HTML element
// Need helping turning this into a callback for the function above.
// I want this function to run but only when the select box is changed.
function printSelection() {
var finalSelection = selector.value;
console.log(document.getElementById("content").innerHTML = finalSelection);
}
}
populateSelects (progressOptions, progressSelector);
Теперь я хочу напечатать значение, выбранное пользователем, на странице и присвоить ему значение «Окончательный выбор». К сожалению, в нем говорится «Неперехваченная ошибка ссылки: селектор не определен», но я не уверен, как передать ему значение, которое они выбрали.
Я понимаю, что мне нужно сделать это как обратный вызов, который выполняется «при изменении», но я не уверен, как это сделать с помощью основной функции populateSelects .
Любая помощь приветствуется!
Ответ №1:
Вы можете создать функцию и при onchange выбора вы можете вызвать функцию, передав это в качестве аргумента. это указывает на html-элемент, вызывающий функцию. Вы можете попробовать приведенный ниже фрагмент. Также я немного изменил populateSelects, чтобы иметь возможность создавать все выпадающие списки за один вызов.
// Step 1 - Store Strings to be passed to categoryOptions Parameter
let progressOptions = ["Just testing!", "XX has made excellent progress", "XX has made good progress", "XX has made poor progress"];
// Behaviour Options
let behaviourOptions = ["XX has excellent behaviour", "XX has good behaviour", "XX has poor behaviour"];
// Attendance Options
let attendanceOptions = ["XX has excellent attendance", "XX has good attendance", "XX has poor attendance"];
// Punctuality Options
let punctualityOptions = ["XX has excellent punctuality", "XX has good punctuality", "XX has poor punctuality"];
// Improvement Options
let improvementsOptions = ["XX should carry on as they have", "XX could make some improvements", "XX must improve"];
// Step 2 - Target the ID; objects to be used in the select below.
let dropDownConfig = [{
id: "progressDropdown",
categoryOptions: progressOptions
},
{
id: "behaviourDropdown",
categoryOptions: behaviourOptions
},
{
id: "attendanceDropdown",
categoryOptions: attendanceOptions
},
{
id: "punctualityDropdown",
categoryOptions: punctualityOptions
},
{
id: "improvementsDropdown",
categoryOptions: improvementsOptions
},
]
// Step 3 - For Loop Passing the Values from progressOptions as option elements in HTML
function populateSelects(dropDownConfig) {
for (let di = 0; di < dropDownConfig.length; di ) {
for (let i = 0; i < dropDownConfig[di].categoryOptions.length; i ) {
let opt = dropDownConfig[di].categoryOptions[i];
let el = document.createElement("option");
el.text = opt;
el.value = opt;
document.getElementById(dropDownConfig[di].id).add(el);
}
}
}
// Step 4 - Function which will print the selected value into the content HTML element
// Need helping turning this into a callback for the function above.
// I want this function to run but only when the select box is changed.
function printSelection(e) {
document.getElementById("content").innerHTML = e.value ' ';
}
populateSelects(dropDownConfig);
<body>
<select id="progressDropdown" onchange="printSelection(this)">
<option>Progress Dropdown</option>
</select>
<select id="behaviourDropdown" onchange="printSelection(this)">
<option>Behaviour Dropdown</option>
</select>
<select id="attendanceDropdown" onchange="printSelection(this)">
<option>Attendance Dropdown</option>
</select>
<select id="punctualityDropdown" onchange="printSelection(this)">
<option>Punctuality Dropdown</option>
</select>
<select id="improvementsDropdown" onchange="printSelection(this)">
<option>Improvements Dropdown</option>
</select>
<div id="content"></div>
</body>
Комментарии:
1. Вау, спасибо за такой быстрый ответ и такое умное решение. Я только что попробовал, и он работает отлично, и я собираюсь изучить ваш код, чтобы убедиться, что я точно понимаю, что происходит в каждой части (хотя я думаю, что я понимаю). Еще раз спасибо!
Ответ №2:
Вы можете создать функцию, в которой вы можете передавать выпадающий элемент и извлекать его значение.
function printSelected(element){
document.getElementById("content").innerHTML = element.value;
}
И измените свой HTML как :
<select id="progressDropdown" onchange="printSelected(this)">
<option>Progress Dropdown</option>
</select>
Вы можете использовать эту функцию со всеми другими выпадающими списками.
Комментарии:
1. Спасибо за такое умное решение. Я пробовал другое решение, предоставленное другим пользователем, но я многому научился и у вас. Спасибо!