Как сбросить входное значение формы при изменении входного значения?

После того, как я отправлю форму с именем актера / актрисы, и в ней будут перечислены фильмы, если я захочу снова выполнить поиск, введя другое имя, при первом нажатии кнопки ВВОД будут возвращены те же фильмы, что и при первом поиске, и если я затем снова нажмите Enter с введенным новым именем, в нем перечислены фильмы этого актера / актрисы. Таким образом, в основном он перечисляет фильмы при каждой второй отправке (учитывая, что имя актера / актрисы изменилось). Это можно обойти? Я попытался добавить sessionStorage.clear() в функцию отправки формы, но это не сработало. Я также пробовал actor.value.clear(), но это очищает значение ввода формы и ничего не перечисляет. Любая помощь приветствуется, заранее большое спасибо. Вот код:

const form = document.getElementById("form");
form.addEventListener("submit", (e)=>{
    var actor = document.getElementById("actor").value;
    var byActor = document.getElementById("byActor");
    byActor.innerHTML = actor;
    discoverByActor(actor);
    moviesByActor();
    e.preventDefault();
})
function discoverByActor(actor){
    axios.get("https://api.themoviedb.org/3/search/person?api_key=<API_KEY>&language=en-US&query = "+actor+'&page=1&include_adult=false')
        .then((response)=>{
            let actorId = response.data.results[0].id;
            sessionStorage.setItem("theActorId", actorId);
        })
};
function moviesByActor(){
    let actorId = sessionStorage.getItem("theActorId");
    axios.get("https://api.themoviedb.org/3/discover/movie?api_key=<API_KEY>&language=en-US&sort_by=popularity.desc&include_adult=false&include_video=false&page=1&with_people = "+actorId)
        .then((response)=>{
            console.info(response);
            let movies = response.data.results;
            let output = "";

            $.each(movies, (index, movie)=>{
                output +=`
                <div class = "card">
                        <img src = "http://image.tmdb.org/t/p/w300/${movie.poster_path}" onerror = "this.onerror=null;this.src='../images/image2.png';">
                        <h3>${movie.title}</h3>
                        <p>${movie.vote_average} <strong>IMDB Rating</strong></p>
                        <p>Release date: <strong>${movie.release_date}</strong></p>
                        <a onclick = "movieSelected('${movie.id}')" class = "btn" href = "#"> Movie Details </a>
                    </div>
                `
            })
            let moviesInfo = document.getElementById("movies");
            moviesInfo.innerHTML = output;
            //Display pages buttons.
            let pages = document.querySelector(".pages");
            pages.style.display = "flex";
            var actor = document.getElementById("actor");
        })
}

зачем вы храните его в sessionStorage? Я имею в виду, зачем тебе это нужно?

Muhammad Usman 04.05.2018 23:05

Сбросьте значение с помощью document.getElementById ('"субъект"). Value = ""; не ясно()

Satish Kumar 04.05.2018 23:05

Джордж, я храню идентификатор актера в sessionStorage, поэтому я могу использовать его, чтобы он отображал фильмы, в которых играет этот конкретный актер. Запрос API на обнаружение фильмов with_people (второй запрос) использует идентификатор Актера (предоставленный первым запросом API) для вывода списка фильмов, в которых он играет. Я понял, что так и должно быть, но я также могу ошибаться, поскольку я довольно новичок в JavaScript (учился самостоятельно около 3 недель), потому что первый запрос API не содержит данных о фильмах. сами по себе второй запрос не может связать фильм с актером. Только так ..

Petar 05.05.2018 01:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
sessionStorage.setItem("theActorId", actorId);

не происходит, пока вы не получите ответ от axios.get. Однако перед этим вы вызываете moviesByActor, что делает

let actorId = sessionStorage.getItem("theActorId");

Вероятно, вы захотите:

form.addEventListener("submit", (e)=>{
    // ...
    discoverByActor(actor).then(moviesByActor);
    // ...
})

function discoverByActor(actor){
    return axios.get("https://api.themoviedb.org/3/search/person?api_key=<API_KEY>&language=en-US&query = "+actor+'&page=1&include_adult=false')
    .then((response)=>{
        let actorId = response.data.results[0].id;
        sessionStorage.setItem("theActorId", actorId);
    })
};

Кроме того, если вам действительно не нужен actorId в сеансе, вы можете:

form.addEventListener("submit", (e)=>{
    // ...
    discoverByActor(actor).then(moviesByActor);
    // ...
})

function discoverByActor(actor){
    return axios.get("https://api.themoviedb.org/3/search/person?api_key=<API_KEY>&language=en-US&query = "+actor+'&page=1&include_adult=false')
    .then((response)=>{
        return response.data.results[0].id;
    })
};

function moviesByActor(actorId) {
    axios.get( /* ... */ );
    // ...
}

В JavaScript есть модель параллелизма, основанная на «цикле событий». Очень интересным свойством модели цикла событий является то, что JavaScript, в отличие от многих других языков, никогда не блокируется (за исключением alert или синхронного XHR и, я уверен, некоторых других).

axios.get(url).then(doSomething) является асинхронным, поэтому, когда вы делаете это, вы говорите компьютеру: «иди и принеси все, что находится по этому URL-адресу, а как только вы получите ответ, отправь ответ на doSomething. А пока продолжай выполнять остальную часть этого кода.

Итак, когда вы делали discoverByActor(actor); moviesByActor();, вы вызывали moviesByActorдаже если, вы ничего не получали от discoverByActor.

Конечно, было бы сложно программировать, если бы вы не могли контролировать порядок, в котором происходят события, поэтому для решения этой проблемы мы используем то, что называется Promises.

С помощью обещания мы можем сказать, идите и получите этот URL-адрес с помощью axios.get, .then использует этот результат для выполнения другой задачи, .then использует все, что возвращает что, для выполнения другой задачи.

Итак, у меня discoverByActor возвратил axios.get, так что я мог получить доступ к методу .then, чтобы я мог терпеть, что moviesByActor будет иметь данные, необходимые для запуска.

Спасибо, трюк сработал, теперь все работает как положено. Поскольку я все еще новичок в JavaScript (и языках программирования в целом), не могли бы вы, если у вас есть свободное время, объяснить мне, почему мне пришлось поместить «discoverByActor (актер) .then (moviesByActor)» в функцию отправки формы и » вернуть "перед axios.get, чтобы заставить его работать?"

Petar 05.05.2018 01:23

Счастлив! Я просто добавил объяснение, дайте мне знать, если в нем больше смысла

dave 05.05.2018 01:45

Большое спасибо, я очень ценю это, теперь это имеет смысл. Спасибо ! : D

Petar 05.05.2018 01:54

Другие вопросы по теме