Przypsianie kilku zmiennym wartości z tablicy

Przypsianie kilku zmiennym wartości z tablicy
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1
  1. Chciałbym zapytać, czy ten kod ma jakiś cel obecnie?
Kopiuj
let arrAnswerVaranty = ['a', 'b', 'c', 'd'];

Jeśli nie ma, to ja bym go usunął, żeby nie robić bałaganu. Później można go zawsze dodać.

  1. Myślę, że jeszcze jedna funkcja się nada. Od razu ją zaimplementujmy. Będzie ona podobna w założeniu do getRandomAnswers – będzie losować pytanie i je zwracać. Wiem, że już podobna była, ale napiszmy ją od początku, żeby wszystko było jasne.
    2.1. Niech nazywa się getRandomQuestion.
    2.2. Nie powinna mieć parametrów.
    2.3. Umieść w niej następujący kod. To nie jest nowy kod, już go wcześniej pisałeś. Zrobiłem tylko dwie zmiany: zmieniłem nazwę zmiennej randomQuestIndex na currentRandomIndex, żeby była bardziej intuicyjna, oraz przeniosłem deklarację tej zmiennej przed pętlę, żeby działanie kodu było bardziej intuicyjne:
Kopiuj
var currentRandomIndex;
do {
    currentRandomIndex = Math.floor(Math.random() * questArr.length);
} while (currentRandomIndex === randomIndex);
randomIndex = currentRandomIndex;

2.4. Dodatkowo niech ta funkcja zwraca element tablicy questArr o indeksie currentRandomIndex.


edytowany 3x, ostatnio: Silv
P1
Jeśli pytasz o ten kod arrAnswerVaranty to w ten sposób chciałem przypisywać konkretne odpowiedzi do konkretnych waraintów odpowiedzi czyli A,B,C,D. Zresztą nie ja wpadłem na to rozwiąznie tylko podsunął mi @szatkus tyle tylko że ja to wyodrębniłem do zmiennej
Silv
PS Niech zostanie, bo i tak, sądzę, będziemy podobnego kodu potrzebować. Najwyżej przeniesiemy w inne miejsce.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

A tą zmienną jslet oldQuestionIndex = -1; usunąć czy zmieniłeś jej nazwe na var currentIndex bez żadnej wartości?

P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

To jest mój dotychczasowy kod https://jsfiddle.net/8hn2m4vz/. Nie jestem tylko pewien co do zmiennej js let oldQuestionIndex = -1 ponieważ nie wiem czy ją usunąłeś czy zmieniłeś jej nazwe?

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Trochę się nie zrozumieliśmy. :)

  1. Sama zmienna currentRandomIndex nie jest nowa. Nazywała się tylko inaczej – randomQuestIndex. Ponadto w kodzie była deklaracja tej zmiennej wraz z inicjalizacją (w jednej linijce), a ja te dwie rzeczy rozdzieliłem. Stąd pojawiła się w kodzie ode mnie instrukcja var currentRandomIndex; – i powinieneś ją umieścić w funkcji getRandomQuestion, tak samo jak pętlę (a nie poza funkcją).
  2. Instrukcja let oldQuestionIndex = -1; powinna zostać na swoim miejscu, tak, jak była.
  3. Funkcja showRandomQuestion powinna zostać na swoim miejscu, tak, jak była (a widzę, że ją usunąłeś).
  4. Funkcja getRandomQuestion to powinna być nowa funkcja.

edytowany 12x, ostatnio: Silv
P1
Aha no dobra. Teraz mam jasność sytuacji. Dzięki
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Czy teraz jest ok https://jsfiddle.net/74vj3ckf/?

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Jeszcze nie do końca: w funkcji getRandomQuestion masz dwie zmienne, randomQuestIndex oraz currentRandomIndex. Chodzi o to, żeby była tylko jedna – currentRandomIndex. Powinieneś więc zamienić linijkę

Kopiuj
var randomQuestIndex = Math.floor(Math.random() * answers.length);

na

Kopiuj
currentRandomIndex = Math.floor(Math.random() * answers.length);

P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
1
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

Brakuje jeszcze zwracania przez funkcję getRandomQuestion elementu tablicy questArr o indeksie currentRandomIndex. Zauważ, że nazwa funkcji zaczyna się na get, a to sugeruje, że powinna ona coś zwracać.

I jak to już zrobisz, to dalej zaimplementujmy funkcję showRandomQuestion:

  1. Wywołaj w niej funkcję getRandomQuestion i zapisz wynik tego wywołania do zmiennej (sam wymyśl nazwę; postaraj się, żeby była w miarę opisowa).
  2. Przypisz tę nowo utworzoną zmienną do właściwości innerHTML obiektu headerQuestion.

edytowany 5x, ostatnio: Silv
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
1
edytowany 1x, ostatnio: piotrek1998
Silv
Niepoprawny link.
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0
  1. Błąd – linijka:
Kopiuj
currentRandomIndex = Math.floor(Math.random() * answers.length);

powinna wyglądać tak:

Kopiuj
currentRandomIndex = Math.floor(Math.random() * quizArr.length);
  1. Zapomniałem o jednej rzeczy w funkcji getRandomQuestion. Nie powinna ona zwracać "obiektu pytania" (bo nie ma to sensu dla jej obecnego przeznaczenia), tylko samo pytanie (ciąg znaków). Dlatego trzeba linjkę:
Kopiuj
return quizArr[currentRandomIndex];

zamienić na:

Kopiuj
return quizArr[currentRandomIndex].question;
  1. Literówka: instrukcję showRandomQuestions(); zamień na showRandomQuestion();
  2. Widzisz teraz pytanie po uruchomieniu kodu. :) Zmienia się ono na inne i losowe po naciśnięciu przycisku "Wyślij".

Przejdźmy od razu do implementowania funkcji getRandomVariants. Nie znalazłem kodu w tym wątku, który by odpowiadał dokładnie temu, co trzeba zrobić, więc od początku napiszemy:

  1. Funkcja powinna mieć jeden parametr – indeks "obiektu pytania".
  2. Losowanie odpowiedzi można zrobić na co najmniej dwa sposoby: 1) poprzez skopiowanie tablicy z odpowiedziami z obiektu pytania o podanym indeksie i w miarę losowania kolejnych odpowiedzi usuwanie z tej skopiowanej tablicy wylosowanych już odpowiedzi; 2) poprzez stworzenie pustej tablicy i w miarę losowania kolejnych odpowiedzi dodawanie ich do niej. Moim zdaniem lepiej wybrać wariant nr 2, bo jest mniej podatny na błędy (nie wiem, czy potrzebujesz uzasadnienie). Algorytm powinien przebiegać tak:
    2.1. Tworzysz pustą tablicę answersIndices.
    2.2. Dla każdej odpowiedzi pytania o danym indeksie: (2.2.1.) losujesz indeks odpowiedzi dotąd, aż nie będzie on już obecny w tablicy answersIndices; (2.2.2.) dodajesz ten indeks do tablicy answersIndices.
  3. Funkcja powinna zwracać tablicę answersIndices.

Zamieszczę tu kod całej funkcji, bo zdaję sobie sprawę, że powyższy algorytm jest niezbyt czytelny. Jak czegoś nie rozumiesz, pytaj:

Kopiuj
function getRandomVariants(id) { // Punkt 1
    const answersIndices = []; // Punkt 2.1
    for (const a of quizArr[id].answers) { // Cała pętla for to punkt 2.2
        let r = -1;
        do {
            r = Math.floor(Math.random() * quizArr[id].answers.length);
        } while (answersIndices.includes(r)); // Cała pętla do-while to punkt 2.2.1
        answersIndices.push(r); // Punkt 2.2.2
    }
    return answersIndices; // Punkt 3
}

Warto wspomnieć, że funkcja getRandomVariants zwraca tablicę indeksów, a więc trochę nienajlepiej odpowiada to jej nazwie. Ja jestem zdania, że ważniejsza jest spójność kodu niż intuicyjność, więc na razie nie będziemy tego ruszać. Po skończeniu całości możemy się zastanowić nad zmianą nazw.


edytowany 2x, ostatnio: Silv
Zobacz pozostałe 2 komentarze
P1
4. Wyświetlają się pytania po naciśnięciu przycisku
P1
Zastanawiam się nad użyciem pętli for w tym przypadku. Nie chce w żaden sposób dywersyfikować tego kodu bo dla mnie jest jak najbardzie wporządku tylko czy po prostu sama pętla do while by w tym przypadku nie wystarczyła?
Silv
Chodziło Ci zapewne o "deprecjonowanie" tego kodu? — O ile potrafię tak na szybko ocenić, to sama pętla do-while wystarczyłaby korzystając ze sposobu nr 1 (tego bardziej podatnego na błędy), a korzystając ze sposobu nr 2 musimy mieć dwie pętle.
Silv
PS Związane jest to prawdopodobnie z tym, że w sposobie nr 1 nie musimy sprawdzać, czy wylosowaliśmy nowy element (bo każdy wylosowany element usuwamy), a więc zostaje jedyni kontrolowanie liczby elementów (jedna pętla); natomiast w sposobie nr 2 musimy zarówno kontrolować to, czy element wylosowany jest nowy (u nas pętla do-while), jak i kontrolować liczbę elementów (u nas pętla for). (Mam nadzieję, że się nie pomyliłem w tych szacunkach).
P1
Ok. Już wszystko jasne
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Tak to wygląda https://jsfiddle.net/ymuj2ca0/. Co dalej?

Silv
Rozumiesz cały dotychczas napisany kod?
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

Co do obecnego kodu:

  1. Zmieniłbym nazwę parametru funkcji getRandomVariants na questionIndex; uważam, że obecna nie jest intuicyjna; wolałbym uniknąć późniejszych pomyłek.
  2. Nazwa zmiennej powinna być answerIndices, a nie answerIndicies (zauważ brak ostatniej litery i; "indices" to jedna z form liczby mnogiej rzeczownika "index" -> https://www.diki.pl/slownik-angielskiego?q=index).
  3. Literówka w jednym miejscu: powinno być answersIndicies, a nie answerIndicies (zauważ literkę s po ciągu znaków answer).

Zanim zaczniemy wyświetlać odpowiedzi, trzeba poprawić dwie rzeczy:

  1. Funkcja getRandomQuestion powinna zwracać zmienną currentRandomIndex. Wiem, że wcześniej napisałem co innego, ale teraz uważam, że dla spójności kodu trzeba to zmienić. Z nazwą co prawda będzie taki sam problem, jak przy funkcji getRandomVariants (o czym wcześniej pisałem), ale nie ma co się teraz tym przejmować (spójność nad intuicyjność).
  2. Kod HTML: masz nieodpowiednie elementy oznaczone jako "etykiety". Żeby było intuicyjnie, to zrób tak, żeby elementy <label> miały tę wartość atrybutu id, co obecnie elementy <input>, a elementy <input> żeby miały tę wartość atrybutu id, co obecnie elementy <label>. Poza tym wartość atrybutu for elementów label trzeba zmienić na wartość atrybutu id elementów <input> po zmianie opisane w poprzednim zdaniu. Czyli, przykładowo:
Kopiuj
<input type="radio" id="label-answer_A" name="answer" class="answer">
  <label id="a" for="label-answer_A"></label>

trzeba zmienić na

Kopiuj
<input type="radio" id="a" name="answer" class="answer">
  <label id="label-answer_A" for="a"></label>

edytowany 2x, ostatnio: Silv
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

https://jsfiddle.net/s9bf21yv/ chyba coś jest nie tak?

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
2
  1. return answersIndicies; zmień na return answersIndices; (zauważ usunięcie ostatniej litery "i").
  2. Rzeczywiście jest nie tak, o tyle, że zapomniałem wcześniej powiedzieć, że za zmianą wartości zwracanej z funkcji getRandomQuestion powinna iść zmiana kodu w funkcji showRandomQuestion. A więc:
    2.1. Nazwę zmiennej displayQuestQiz zmień na displayQuestQizIndex.
    2.2. Stwórz nową zmienną questionObject i przypisz jej wyrażenie quizArr[displayQuestQizIndex].
    2.2. Właściwości innerHTML przypisz wyrażenie questionObject.question.

I po poprawieniu tych rzeczy możesz przejść do wyświetlania odpowiedzi:

  1. Stwórz nową zmienną variants.
  2. Właściwości innerHTML każdego z obiektów labelAnswerA, labelAnswerB, labelAnswerC i labelAnswerD przypisz wyrażenie questionObject.answers[variants[X]];, gdzie X zmieniaj na kolejne liczby: 0, 1, 2 oraz 3.
  3. Powinny wyświetlać się odpowiedzi, co kończyłoby nasz kod; podane wymagania funkcjonalne zostały zaimplementowane. :) (Przypomnę: tutaj są opisane -> https://4programmers.net/Forum/JavaScript/349748-przypsianie_kilku_zmiennym_wartosci_z_tablicy?p=1758236#id1758236). Jeśli będziesz mieć jeszcze pytania, pytaj.

edytowany 3x, ostatnio: Silv
P1
Zrozumiałem. Dzięki wielkie
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Coś nie działa https://jsfiddle.net/5k17ghnw/. I czy mogę usunąć tą tablice arrAnswerVaranty bo i tak nigdzie jej nie wykorzystuje

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0
  1. Zapomniałem napisać, że przedostatnie 2 punkty powinny zostać wykonane w funkcji showRandomQuestion (czyli zarówno przypisanie do zmiennej variants, jak i przypisanie do właściwości innerHTML).
  2. Zapomniałem napisać, że zmiennej variants trzeba przypisać wynik wywołania funkcji getRandomVariants z argumentem displayQuestQizIndex.

PS

  1. Jak najbardziej możesz usunąć tablicę arrAnswerVaranty. Okazała się nam nieprzydatna.

edytowany 2x, ostatnio: Silv
P1
I już wszystko jasne. Dzięki
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
1

Tak to powinno wyglądać?https://jsfiddle.net/s6ocqh59/1/

P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Chciałem cie zapytać o ten kod https://jsfiddle.net/gvk5urzs/5/. Bo chce napisać pewną fukcjonalność że jeżeli użytkownik mi nie zaznaczy żadnej odpowiedzi to nie pozwalam mu przejść do następnego pytania. Po zaznaczeniu przechodzi dalej. Ja napisałem tylko taki poglądowy kod na temat jak ja to widze. Wiem że to jest jedna z prostszych funkcjonalności w tej aplikacji ale dla mnie każda linijka kodu jest niezwykle ważna nawet jeżeli wydaje się błacha i chce zapytać po prostu o rade czy taki kod nadaje się do tego co chce zaimplementować czy raczej nie bardzo. Czy byś coś dodał, zmienił badź ewentualnie coś usnął

szatkus
Zawęż selektor raczej do input[type="radio"], przeleć pętlą po wynikach z querySelectorAll i wrzuć return true/return false, gdzie trzeba.
Silv
Masz literówkę: "błacha" -> "błaha"
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1
  1. Jeśli chodzi o kod HTML, to widzę, że opuściłeś znaczniki <body> oraz </body>. Co prawda zgodnie z dokumentacją MDN jest to dopuszczalne (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/body), ale myślę, że mógłbyś rozważyć, czy jednak nie pisać tych znaczników – dla czytelności.
  2. Jeśli chodzi o kod JavaScript, to kilka rzeczy:
    2.1. @szatkus wspomniał w komentarzu o zawężeniu selektora w wywołaniu metody document.querySelector do input[type="radio"]. Mógłby być zawężony; moim zdaniem jeszcze lepiej pobierać po klasie albo po ID. Niemniej w tym kodzie nie ma to znaczenia i rozumiem, że zrobiłeś tak dla prostoty kodu.
    2.2. @szatkus wspomniał w komentarzu o rozróżnieniu między metodami document.querySelector, a document.querySelectorAll. Ta pierwsza metoda pobiera pierwszy dopasowany element, ta druga pobiera wszystkie. W tym kodzie nie ma znaczenia, której użyjesz; ale ogólnie pamiętaj, że pobieranych elementów może być więcej niż jeden, a wtedy trzeba będzie użyć tej drugiej metody.
    2.3. Dla czytelności zmieniłbym nazwę zmiennej inputForm na input. Słowo "form" jest dla mnie zbyt ogólne, a poza tym samo słowo "input" pasuje do użytego selektora (którym jest właśnie input). W szczególności może się kiedyś zdarzyć, że będziesz mieć na stronie kilka formularzy, a w każdym z nich kilka elementów INPUT, i w takiej sytuacji być może każdy element trzeba będzie nazwać inaczej. Moim zdaniem nawet w tak prostym kodzie warto zawsze zmienne nazywać jak najbardziej czytelnie.
    2.4. Dla czytelności zmieniłbym nazwę funkcji checkValidate na validateIfChecked. W pierwszym przypadku można przeznaczenie funkcji odczytywać: "funkcja ma sprawdzać jakieś 'validate'", a w drugim: "funkcja ma walidować, czy coś jest 'checked'". A Tobie, jak myślę, chodzi o to drugie znaczenie.

edytowany 5x, ostatnio: Silv
szatkus
Mój komentarz był w kontekście tego, że docelowo tam będą 4 inputy, a nie jeden.
Silv
Rozumiem. Czy coś źle napisałem?
szatkus
Chyba odpowiadałem do innej wersji, bo coś mi tutaj zniknęło :>
Silv
A. No edytowałem. Czyli teraz OK?
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Jaki jest problem że nie działa https://jsfiddle.net/16kpq7fu/? W złym miejscu daje return true i false?

Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
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/en-US/docs/Web/JavaScript/Reference/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:
Kopiuj
if (validateIfChecked() === true) {
    // Wyświetl następne pytanie
} else {
    // Powiedz użytkownikowi, że musi coś zaznaczyć
}

edytowany 5x, ostatnio: Silv
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
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

edytowany 1x, ostatnio: piotrek1998
Zobacz pozostałe 5 komentarzy
Silv
@szatkus: czy wiesz, co dokładnie robi "Run" w JSFiddle?
szatkus
Na pewno nie działa tak samo jak reload w przeglądarce, bo tam nie miałem w ogóle tego problemu z autocomplete, ale się domyśliłem, o co chodzi.
Silv
Ale gdy ja zrobię "Run", to właśnie wszystkie elementy inputodznaczone, choć żaden nie ma atrybutu autocomplete="off"… Coś źle zrozumiałem?
P1
Tak powinno być. Po przejściu do następnego pytania też wszystkie inputy powinny być odznaczone tak samo jak po odświeżeniu strony. Odświeżam strone i wszystkie inputy są odznaczone. Przechodze do następnego pytania jest tak samo. Tylko teraz u mnie jak przejde do następnego pytania to mam zaznaczonego inputa a nie powinno
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

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

P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
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

Zobacz pozostały 1 komentarz
P1
Tak. Chodzi o to że jak np. wylosuje mi się pytanie np. 'What year was JavaScript launched?' z odpowiedziami '1996', '1995', '1994', 'none of the above' to gdy wcisne f5 to mam zostać przy tym pytaniu a nie pojawić ma się następne. Po prostu. Po wciśnięciu przycisku f5 zostaje przy aktualnym pytaniu a nie przechodze do kolejnego. Żeby przejść do kolejnego służy przycisk wyślij a nie f5
Silv
@piotrek1998: w JSFiddle F5 nie działa prawdopodobnie tak samo jakbyś np. załadował statyczny plik HTML do przeglądarki. Tam można "uruchomić" kod przez CTRL+ENTER. Nie wiem, jaka jest różnica.
szatkus
Zapisz sobie do localStorage.
P1
A tak https://10projects10hours.netlify.app/quiz-app/index.html. To jest co prawda projekt taki sam jak mój ale tutaj można zobaczyć o co chodzi
P1
Chodzi tylko o to żeby nie móc przechodzić do następnego pytania po wciśnięciu przycisku f5
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
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.


Zobacz pozostałe 14 komentarzy
P1
Jedyne co się może zadziać ale to już działa to gdy użytkownik zaznaczy mi jakąś odpowiedź będąc przykładowo przy tym pytaniu Who is the president of US to następuje odznaczenie odpowiedzi jaką zaznaczył tak żeby żadna odpowiedź po odświeżeniu nie była zaznaczona
Silv
Pokażesz obecny kod?
Silv
Czyli tylko tę jedną funkcję dodałeś?
P1
No na razie tak? No bo myśle gdzie ją wywołam
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

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

  1. Zmieniasz kod
Kopiuj
const displayQuestQizIndex = getRandomQuestion();

na następujący kod

Kopiuj
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');
}
  1. Poza tym trzeba dodać handler zdarzenia click dla każdego elementu o klasie answer, a w nim wywołać następujący kod:
Kopiuj
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:

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

edytowany 6x, ostatnio: Silv
Silv
Poprawiłem parę rzeczy.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
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

Kopiuj
btnSubmit.addEventListener('click', function() {
	
	if (validateIfChecked() === true) {
		showRandomQuestion();
		return true;
	}
	return false;
});

czy musze robić nowy?

P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

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

Następujący kod:

Kopiuj
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:

Kopiuj
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ć.


edytowany 5x, ostatnio: Silv
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

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

edytowany 3x, ostatnio: piotrek1998
Silv
Kod kod kod pokaż. :)
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)