Я начал работать над своим первым проектом для Flatiron School, который представлял собой простое веб-приложение, извлекающее данные из БД коктейлей для возврата случайных коктейлей на основе пользовательского ввода через DOM.
Первоначально я разработал интерфейс таким образом, чтобы пользователь мог ввести свой предпочтительный дух в текстовое поле, и это текстовое значение будет добавлено к веб-адресу в вызове fetch. Очевидно, что это совсем не годится, так как было бы очень легко сломать приложение, просто набрав все, что они хотят, чтобы получить следующий несуществующий адрес:
fetch('https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=' + formInput.value) fetch(‘https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=RandomTextRuiningMyApplication’)
Я решил изменить пользовательский ввод с открытого текстового поля на выпадающий список со списком духов, включенных в базу данных.
Это повлекло за собой, во-первых, изменение моего HTML-кода для удаления тега ‹form›…
<form action="" method="get"> <label for="spirit">Write your favorite spirit</label> <input type="text" id="spirit" name="spirit"><br><br> <input type="submit" id="submitted" value="Get a random recipe!"></form>
…и добавьте тег ‹select› и ‹button› для раскрывающегося списка.
<label for="spirit">Choose your favorite spirit</label> <select name="spirit-list" id="spirit-list"> <option value="choose"></option> <option value="gin">Gin</option> <option value="vodka">Vodka</option> <option value="rum">Rum</option> <option value="tequila">Tequila</option> <option value="bourbon">Bourbon</option> <option value="scotch">Scotch</option> <option value="brandy">Brandy</option> </select> <button id="button">Get a random recipe!</button>
Следующим шагом было изменить мой код JavaScript, чтобы изменить захват переменных из формы…
const form = document.querySelector('form') const formInput = document.querySelector("#spirit") form.addEventListener('submit', fetchRecipeForm);
…на кнопку, убедившись, что прослушиватель событий срабатывает при событии click’, а не при submit’е.
const button = document.getElementById('button') const buttonInput = document.querySelector("#spirit-list") button.addEventListener('click', fetchRecipe)
Наконец, мне нужно немного изменить функцию выборки. Обратите внимание, что верхний фрагмент кода (функция, написанная для работы с исходной формой) содержит строку e.preventDefault(), которая используется для предотвращения перезагрузки браузера при отправке. В этом нет необходимости при использовании события «щелчок» на кнопке, и оно было исключено из нижнего фрагмента.
function fetchRecipeForm(e) { recipeDisplay.innerHTML = '' e.preventDefault(); fetch('https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=' + formInput.value) .then(res => res.json()) .then(displayRecipes) } function fetchRecipe() { recipeDisplay.innerHTML = '' fetch('https://www.thecocktaildb.com/api/json/v1/1/filter.php?i=' + buttonInput.value) .then(res => res.json()) .then(displayRecipes) }
С добавлением этих небольших изменений у пользователя теперь есть ограниченный набор духов на выбор, а не пустое текстовое поле, в которое можно ввести любую строку букв.