Przypsianie kilku zmiennym wartości z tablicy

1

Jest kilka błędów:

  1. Warunek sprawdzający zaznaczenie powinien wyglądać w ten sposób: input[i].checked === true (tzn. brakuje Ci odwołania do konkretnego elementu tablicy).
  2. Instrukcja return true jest umieszczona w dobrym miejscu. Natomiast w złym miejscu jest umieszczona instrukcja return false. Nie powinna być umieszczona w pętli, tylko zaraz za nią. Dlaczego? Ogólnie jeśli jest umieszczona w pętli, to pętla zostanie przerwana, zanim się zakończy. W Twoim przypadku logika działania funkcji validateIfChecked powinna być taka: "dla każdego elementu input[i] sprawdź, czy ten element jest zaznaczony; jeśli tak, zwróć true, a jeśli nie, kontynuuj sprawdzanie".
  3. W handlerze kliknięcia używasz operatora przecinka. Ten operator powoduje u Ciebie wykonanie obu funkcji i zwraca wartość ostatniej (zobacz jego dokumentację -> https://developer.mozilla.org[...]ence/Operators/Comma_Operator). Jest to niepoprawne; poprawnie powinno być tak, że uzależniasz wyświetlenie następnego pytania od tego, co zwróci funkcja validateIfChecked, czyli kod podobny do poniższego:

    if (validateIfChecked() === true) {
      // Wyświetl następne pytanie
    } else {
      // Powiedz użytkownikowi, że musi coś zaznaczyć
    }
0

Chciałbym jeszcze zaimplementować funkcjonalność że po odświeżeniu nie wyświetla się następne pytanie i że pole input type radio jest puste po odświeżeniu strony

0

Napisałem tak ale nie działa https://jsfiddle.net/pf4maowq/

0

To jest to https://jsfiddle.net/L5ukq69o/. Chce jeszcze popracować nad tym żeby po przeładowaniu strony nie zmieniało się pytanie i napisać sobie licznik i to by było na tyle jeśli chodzi o ten projekt

0

@piotrek1998: jeśli chcesz, by po przeładowaniu strony nie zmieniało się ostatnie pytanie, to kod musi wiedzieć, czy którykolwiek element input był zaznaczony. Wystarczy wartość boolean. Ale trzeba ją zapisywać gdzieś, np. w localStorage. Nie jestem jednak pewien, czy jest możliwe skorzystanie z localStorage w JSFiddle.

0

@piotrek1998: powinno to wyglądać w ten sposób, że:

  1. Zmieniasz kod

    const displayQuestQizIndex = getRandomQuestion();

    na następujący kod

    let displayQuestQizIndex = -1;
    if (sessionStorage.getItem('selected') === 'false') {
      displayQuestQizIndex = sessionStorage.getItem('lastQuestionIndex');
    } else if (sessionStorage.getItem('selected') === 'true') {
      displayQuestQizIndex = getRandomQuestion();
      sessionStorage.setItem('lastQuestionIndex', displayQuestQizIndex);
      sessionStorage.setItem('selected', 'false');
    }
  2. Poza tym trzeba dodać handler zdarzenia click dla każdego elementu o klasie answer, a w nim wywołać następujący kod:

    sessionStorage.setItem('selected', 'true');

Możesz opakować powyższe wywołania metod obiektu sessionStorage w funkcje, ale zauważ, że trzeba ustawić dwie różne rzeczy w sessionStorage. W takim wypadku trzeba napisać dwie funkcje, każdą dla jednej rzeczy. Wyglądałoby to jakoś tak:

function setSSSelected(value) {
    sessionStorage.setItem('selected', value); // JSON.stringify jest niepotrzebne
}
function setSSLastQuestionIndex(value) {
    sessionStorage.setItem('lastQuestionIndex', value); // JSON.stringify jest niepotrzebne
}
0

To o czym piszesz tutaj Poza tym trzeba dodać handler zdarzenia click dla każdego elementu o klasie answer, a w nim wywołać następujący kod: to mogę wywołać w tym handlerze

btnSubmit.addEventListener('click', function() {

    if (validateIfChecked() === true) {
        showRandomQuestion();
        return true;
    }
    return false;
});

czy musze robić nowy?

1

W zasadzie powinienem był napisać: do każdego elementu przechowywanego w tablicy input.

Następujący kod:

input[i](sessionStorage.setItem('selected', 'true'));

jest niepoprawny. Oznacza on: "wywołaj funkcję input[i]" – a przecież input[i] nie jest u Ciebie funkcją. Poza tym to, o czym pisałem, należy zrobić w zasięgu globalnym, a nie w handlerze kliknięcia na przycisk.

W związku z powyższym, kod powinien wyglądać tak:

for (let i = 0; i < input.length; i++) {
    input[i].addEventListener('click', function() {
        sessionStorage.setItem('selected', 'true');
    });
}

i powinien być umieszczony tuż przed ostatnią linijką (tą z wywołaniem showRandomQuestion()).

Poza tym usuń instrukcje return true i return false z handlera kliknięcia w przycisk (tylko z tego handlera). Nie są one poprawne w tamtym miejscu. PS A dlaczego nie są poprawne w tym handlerze? Dlatego, że nigdzie nie wykorzystujesz tej zwróconej wartości. Innymi słowy, w tym kodzie ten handler nie powinien nic zwracać.

0

Wszystko ładnie tylko z jakiegoś powodu otrzumuje komunikat quizArr[questionIndex] is undefiend

1 użytkowników online, w tym zalogowanych: 0, gości: 0, botów: 1

Robot: CCBot