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

Miejsce deklaracji zmiennych globalnych

Można postawić pytanie: czy wszystkie zmienne globalne powinny być deklarowane w zasięgu globalnym? Przeanalizujmy. Jest pięć zmiennych globalnych:

  1. headerQuestion,
  2. input,
  3. oldQuestionIndex,
  4. btnSubmit,
  5. quizArr.

Ad 1. Zmienna headerQuestion reprezentuje element HTML przechowujący pytanie. Jest używana tylko w jednym miejscu, w funkcji showRandomQuestion. Tak więc lepiej zrobić ją lokalną. Przenieś jej deklarację do funkcji showRandomQuestion.

Ad 2. Zmienna input reprezentuje listę elementów HTML przechowujących odpowiedzi. Jest używana w dwóch miejscach: w funkcji validateIfChecked oraz w handlerze kliknięcia na przycisk Submit. Tak więc lepiej zrobić ją lokalną. Przenieś jej deklarację w dwa miejsca: do funkcji validateIfChecked oraz do handlera kliknięcia na przycisk Submit.

Ad 3. Zmienna oldQuestionIndex reprezentuje indeks poprzedniego pytania. Jest używana tylko w jednym miejscu, w funkcji getRandomQuestion. Powinna być "zewnętrzna" w stosunku do kodu wyświetlającego poszczególne pytania. Jedyne miejsce, jakie mi przychodzi do głowy, to właśnie to, gdzie jest obecnie; więc – tutaj nic nie zmieniaj, zmienna powinna zostać globalna.

Ad 4. Zmienna btnSubmit reprezentuje przycisk Submit. Jest używana tylko w jednym miejscu, w zasięgu globalnym. Tutaj nie da się nic zmienić; zmienna powinna zostać globalna.

Ad 5. Zmienna quizArr reprezentuje listę pytań i wariantów odpowiedzi. Jest używana w trzech miejscach: w funkcji getRandomQuestion, w funkcji getRandomVariants oraz w funkcji showRandomQuestion. Ponieważ lista pytań i wariantów odpowiedzi jest jakby konfiguracją aplikacji, to myślę, że najlepiej będzie zostawić ją globalną.

Sposób wykorzystania zmiennych globalnych

Wszystkie zmienne globalne, które jeszcze zostały, powinny być deklarowane globalnie. Niemniej można postawić następne pytanie: czy ze wszystkich z nich funkcje powinny korzystać tak jak ze zmiennych globalnych? Inaczej mówiąc, czy nie można by tych zmiennych przekazać w parametrze funkcji? Przeanalizujmy. Po zmianach, o których napisałem wyżej, powinny zostać trzy zmienne globalne:

  1. oldQuestionIndex,
  2. btnSubmit,
  3. quizArr.

Ad 1. Zmienna oldQuestionIndex nie może być przekazana jako parametr funkcji getRandomQuestion, ponieważ jest w niej zmieniana. Powinna zostać, jak jest.

Ad 2. Zmienna btnSubmit nie może być przekazana jako parametr funkcji, bo jest wykorzystywana w zasięgu globalnym (czyli poza jakąkolwiek funkcją). Powinna zostać, jak jest.

Ad 3. Zmienna quizArr może być przekazana jako parametr wszystkich funkcji, w których jest używana: getRandomQuestion, getRandomVariants oraz showRandomQuestion. Dodaj w każdej z tych funkcji po jednym parametrze o takiej samej nazwie jak ta zmienna.


Na razie tyle. Może się z czymś nie zgadzasz, co napisałem? Może czegoś nie rozumiesz? Pytaj. Jeśli rozumiesz wszystko, to zrób zmiany i zobaczymy, co można dalej w kodzie zrobić.


Zobacz pozostałe 8 komentarzy
Silv
Zmienna quizArr jest wykorzystywana w funkcji showRandomQuestion w tej linii: const questionObject = quizArr[displayQuestQizIndex];
Silv
W rzeczy samej to, co napisałem w tym poście, jest niekompletne. Dopiero następnym krokiem powinno być ustawienie odpowiednich zmiennych jako argumentów w wywołaniach funkcji (dzięki czemu kod zadziała). Nie wspomniałem o tym, żeby nie dawać Ci naraz zbyt wiele, ale może powinienem był opisać od razu całość zmian.
Silv
Czyli teraz dla każdego wywołania każdej funkcji, w której dodałeś parametr quizArr, dodaj argument quizArr.
Silv
PS Ale cieszę się, że jesteś uważny i sprawdzasz mnie. :)
P1
Zrozumiałem. Dzięki
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Gdybym chciał przejść do pisania tego kroku 'Natomaist jeżeli chodzi o to ustalenie po jakiej ilości pytań zakończyć gre(chodzi o to żeby użytkownik odpowiedział na cztery pytania ale żeby każde pytanie było unikatowe a nie występowało po sobie) to chodzi mi o to że użytkwonik może odpowiedzieć na cztery pytania które w moim przypadku wyświetlają się w losowej kolejności i po tych czterech pytaniach pojawia mu się ile zdobył punktów czyli to o czym piszałem wyżej.' od czego muszę zacząć?

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

Powiedziałbym, że wymieniasz tutaj dwie funkcjonalności:

  1. licznik punktów,
  2. wyświetlanie każdego pytania tylko raz.

Są one niezależne, czyli można zaimplementować jedną nie implementując drugiej. Zacznijmy od licznika punktów.

Jakich nowych rzeczy potrzeba:

  1. jedna zmienna, przechowująca stan licznika, czyli ile punktów jest aktualnie; powinna być umieszczona w sessionStorage;
  2. dla każdego pytania jedna zmienna, przechowująca indeks poprawnej odpowiedzi; zmienne te powinny być umieszczone w obiektach pytań;
  3. zwiększenie liczby punktów w zależności od tego, która odpowiedź jest zaznaczona; to powinna być jedna instrukcja if, umieszczona w pętli przechodzącej po wszystkich odpowiedziach w handlerze kliknięcia na przycisk "Submit";
  4. etykieta na stronie, przechowująca stan licznika po każdym pytaniu; może być umieszczona np. pod przyciskiem.

Jakie rzeczy trzeba zmienić:

  1. Trzeba przenieść instrukcję sessionStorage.removeItem('lastQuestIndex'); tuż za pętlę for, bo inaczej nie będzie można określić, dla którego pytania powinniśmy sprawdzać poprawną odpowiedź.

To tak ogólnie. Zacznij, spróbuj zrozumieć. W przypadku niejasności pytaj.


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

Pytanie odnośnie tego jedna zmienna, przechowująca stan licznika, czyli ile punktów jest aktualnie; powinna być umieszczona w sessionStorage;
zacząłem pisać kod. Dobrze?:

Kopiuj
	let startCount = 0;
	if (sessionStorage.getItem('currentlyPoints') === null) {
		sessionStorage.setItem('currentlyPoints', startCount);
	}
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

I mam pytanie odnośnie tego pytania '''dla każdego pytania jedna zmienna, przechowująca indeks poprawnej odpowiedzi; zmienne te powinny być umieszczone w obiektach pytań'''. Chodzi o to żeby do każdej tablicy z pytaniami zrobić zmienną która będzie przechowywać aktualny indeks z poprawną odpowiedzią?
Ad 2:

Kopiuj
const quizArr = [
	{
		question: {
			correctAnswerIndex: getRandomVariants(answer),
			quest: 'What is the most used programming language in 2019?'
		},
		answers: [ 'Java', 'C', 'Python', 'JS' ]
	},
	{
		question: 'Who is the President of US?',
		answers: [ 'Florin Pop', 'Joe Biden', 'Ivan Saldano', 'Mihai Andrei' ]
	},
	{
		question: 'What does HTML stand for?',
		answers: [
			'Hypertext Markup Language',
			'Cascading Style Sheet',
			'Jason Object Notation',
			'Helicopters Terminals Motorboats Lamborgini'
		]
	},
	{
		question: 'What year was JavaScript launched?',
		answers: [ '1996', '1995', '1994', 'none of the above' ]
	}
];
edytowany 1x, ostatnio: piotrek1998
szatkus
Indeks nie bardzo, chyba że będziesz go sobie gdzieś przechwytywać na etapie losowania odpowiedzi. Lepiej string z poprawną odpowiedzią.
Silv
@szatkus: ale jaka to różnica?
szatkus
@Silv: myślę, że wygeneruje mniej kolejnych pytań niż gdyby opierać się na liczbie porządkowej pytania.
Silv
Nie rozumiem. Generowanie jakich pytań masz na myśli?
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

Chodzi o to żeby do każdej tablicy z pytaniami zrobić zmienną która będzie przechowywać aktualny indeks z poprawną odpowiedzią?

Tak, o to chodzi. Ale nie w ten sposób, który pokazałeś wyżej. Zmienna, a dokładnie: właściwość, powinna być zdefiniowana dla "obiektu pytania", a nie dla samego pytania. Mówiąc inaczej, powinna być zdefiniowana "na tym samym poziomie", co właściwości question oraz answers. I powinna być po prostu liczbą (tak zwanym literałem liczbowym), a nie wywołaniem funkcji.

Odnośnie tego kodu wyżej ze zmienną startCount: mnie chodziło o coś innego. Zmienna przechowująca stan licznika powinna być jedynie w sessionStorage, czyli nie powinna być definiowana/deklarowana w zasięgu globalnym przez let, var czy const. Powinna być pobierana i zmieniana jedynie w tej instrukcji if, o której napisałem w punkcie 3.

Zastanawiam się, czy rozumiesz, jak wygląda tzw. przepływ sterowania (control flow) w tym kodzie (w jakiej kolejności wykonywane są poszczególne instrukcje). Jutro postaram się to opisać. Poza tym dobrze by było, żebyś rozumiał, jak działa zasięg (scope) w JavaScripcie -> https://developer.mozilla.org/en-US/docs/Glossary/Scope


UPDATE Przepraszam, okazało się, że jednak zbyt mało wiem, żeby opisać to, co chciałem. Ale nic straconego – już zabrałem się za powtórkę tych zagadnień. Zobaczymy, czy coś z tego wyjdzie. :) Generalnie idźmy dalej w pisaniu kodu, a najwyżej będę tłumaczyć poszczególne rzeczy zamiast całości naraz.


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

Czy teraz jest ok:

Kopiuj
const quizArr = [
	{
		currentAnswerIndex: 0,
		question: 'What is the most used programming language in 2019?',
		answers: [ 'Java', 'C', 'Python', 'JS' ]
	},
	{
		question: 'Who is the President of US?',
		answers: [ 'Florin Pop', 'Joe Biden', 'Ivan Saldano', 'Mihai Andrei' ]
	},
	{
		question: 'What does HTML stand for?',
		answers: [
			'Hypertext Markup Language',
			'Cascading Style Sheet',
			'Jason Object Notation',
			'Helicopters Terminals Motorboats Lamborgini'
		]
	},
	{
		question: 'What year was JavaScript launched?',
		answers: [ '1996', '1995', '1994', 'none of the above' ]
	}
];

Bo z tego co ty tutaj piszesz "Tak, o to chodzi. Ale nie w ten sposób, który pokazałeś wyżej. Zmienna, a dokładnie: właściwość, powinna być zdefiniowana dla "obiektu pytania", a nie dla samego pytania. Mówiąc inaczej, powinna być zdefiniowana "na tym samym poziomie", co właściwości question oraz answers. I powinna być po prostu liczbą (tak zwanym literałem), a nie wywołaniem funkcji.", właśnie wywnioskowałem coś takiego. Czy może raczej tak?:

Kopiuj
const quizArr = [
	{
		currentAnswerIndex: { question: 'What is the most used programming language in 2019?' },
		answers: [ 'Java', 'C', 'Python', 'JS' ]
	},
	{
		currentAnswerIndex: 1,
		question: 'Who is the President of US?',
		answers: [ 'Florin Pop', 'Joe Biden', 'Ivan Saldano', 'Mihai Andrei' ]
	},
	{
		currentAnswerIndex: 2,
		question: 'What does HTML stand for?',
		answers: [
			'Hypertext Markup Language',
			'Cascading Style Sheet',
			'Jason Object Notation',
			'Helicopters Terminals Motorboats Lamborgini'
		]
	},
	{
		currentAnswerIndex: 3,
		question: 'What year was JavaScript launched?',
		answers: [ '1996', '1995', '1994', 'none of the above' ]
	}
];
edytowany 2x, ostatnio: piotrek1998
Silv
Ten pierwszy kod, tylko oczywiście currentAnswerIndex trzeba zdefiniować dla pozostałych obiektów.
Silv
PS Ale, jak widzę, zrobiłeś to już w kodzie poniżej.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Na razie napisałem kod dla tych 3 wymienionych tutaj punktów

jedna zmienna, przechowująca stan licznika, czyli ile punktów jest aktualnie; powinna być umieszczona w sessionStorage;
dla każdego pytania jedna zmienna, przechowująca indeks poprawnej odpowiedzi; zmienne te powinny być umieszczone w obiektach pytań;
zwiększenie liczby punktów w zależności od tego, która odpowiedź jest zaznaczona; to powinna być jedna instrukcja if, umieszczona w pętli przechodzącej po wszystkich odpowiedziach w handlerze kliknięcia na przycisk "Submit";

Tu jest kod https://jsfiddle.net/6d1o8by4/1/

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

Czekaj może po kolei. Staram się ściśle trzymać tego co piszesz dlatego chce żebyś w miare możliwości też sprawdzał co pisze ponieważ potrzebuje kogoś kto wytknie mi jakieś błędy. Chciałem cię zapytać o to co napisałeś tutaj odnośnie tego obiektu z tymi pytaniami i odpowiedzami

Tak, o to chodzi. Ale nie w ten sposób, który pokazałeś wyżej. Zmienna, a dokładnie: właściwość, powinna być zdefiniowana dla "obiektu pytania", a nie dla samego pytania. Mówiąc inaczej, powinna być zdefiniowana "na tym samym poziomie", co właściwości question oraz answers. I powinna być po prostu liczbą (tak zwanym literałem), a nie wywołaniem funkcji.

A tutaj jest fragment kodu za to odpowiedzialny

Kopiuj
const quizArr = [
    {
        currentAnswerIndex: 0,
        question: 'What is the most used programming language in 2019?',
        answers: [ 'Java', 'C', 'Python', 'JS' ]
    },
    {
        question: 'Who is the President of US?',
        answers: [ 'Florin Pop', 'Joe Biden', 'Ivan Saldano', 'Mihai Andrei' ]
    },
    {
        question: 'What does HTML stand for?',
        answers: [
            'Hypertext Markup Language',
            'Cascading Style Sheet',
            'Jason Object Notation',
            'Helicopters Terminals Motorboats Lamborgini'
        ]
    },
    {
        question: 'What year was JavaScript launched?',
        answers: [ '1996', '1995', '1994', 'none of the above' ]
    }
];

Po prostu powiedz co napisałem(oczywiście w kontekście do twoich słow przytoczonych przeze mnie wyżej)źle. Czy powinienm to poprawić czy zostawić to tak jak jest

szatkus
Ale po co się ściśle trzymać. Pisz, eksperymentuj, aż nie wyjdzie.
P1
Tak ale ja jako początkujący chce to dobrze napisać
szatkus
I od ponad 2 miesięcy męczysz ten prosty projekt. Nikt oczekuje od początkującego pięknego kodu, ani też to nie jest zdrowe podejście, bo może doprowadzić do blokady, kiedy człowiek próbuje zrobić idealny kod samemu jeszcze nie wiedząc jak taki powinien wyglądać.
P1
Nie idzie mi jeszcze za dobrze pisanie kodu. Co prawda uczę się na bieżąco ale wole na razie pisać ten kod z kimś, potem starać się go analizować. Czuje się wtedy jakoś pewniej. Nie wiem. Być może to jakiś syndrom u początkujących
szatkus
To może zapytaj @Silv o stawkę i umówcie się na calla? Przez godzinę pisząc kod pod jego okiem to pewnie zrobisz więcej niż pisząc posty w tym wątku przez ostatni tydzień. No i naucz się korzystać z narzędzi, w poście wyżej znowu wrzuciłeś niedziałający kod z prostym do naprawienia błędem. Nawet wcześniej wrzuciłem Ci krótki filmik jak używać debuggera w przeglądarce.
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

Tak, jak napisałem wyżej w komentarzu – ten kod -> https://jsfiddle.net/6d1o8by4/1/ jest ogólnie w porządku, jeśli chodzi o tablicę quizArr. Tylko jeszcze zmień nazwę właściwości – lepsza jest correctAnswerIndex niż currentAnswerIndex; ta druga nazwa nie ma sensu w tym kontekście, bo nie chodzi o odpowiedź "bieżącą" ("current"), tylko "poprawną" ("correct").

Przy okazji: ogólnie nazewnictwo jest jednym z najważniejszych zagadnień w programowaniu; a utarło się, że jednym z najtrudniejszych w informatyce w ogóle. Nie wiem, czy znasz ten cytat (źródło -> https://martinfowler.com/bliki/TwoHardThings.html):

There are only two hard things in Computer Science: cache invalidation and naming things.

W związku z tym pytanie: dlaczego nazwałeś zmienną akurat startCount?

A wracając: ten kod:

Kopiuj
if (input[i].checked) {
    startCount = startCount + 1
}

Dwa pytania odnośnie niego:

  1. Załóżmy, że najpierw odpowiadasz na jedno pytanie (bez różnicy, czy poprawnie czy nie), a potem odświeżasz stronę. Jaką wartość będzie mieć zmienna startCount?
  2. Załóżmy, że odpowiadasz na jedno pytanie niepoprawnie (już bez odświeżania strony). Jaką wartość będzie mieć zmienna startCount?

edytowany 1x, ostatnio: Silv
Zobacz pozostałe 3 komentarze
Silv
OK, jeśli chodzi o komunikat startCount is not defined, to najwidoczniej JSFiddle używa tzw. strict mode, o czym nie pomyślałem. Dobrze, że to zauważyłeś. :) W takim wypadku moje pytanie o wartość nie ma sensu. Niemniej tak czy siak widzisz, że kod nie jest poprawny (bez używania strict mode też nie byłoby dobrze). Cd.
Silv
Cd. (Tzn. póki występuje ten błąd, to nie mają sensu oba moje pytania o wartość). Cd.
Silv
Cd. Jeśli chodzi o pierwsze pytanie, to pośrednio właśnie o to chodzi – zwiększasz wartość tylko do czasu odświeżenia strony. Natomiast "między odświeżeniami" już zwiększona wartość nie będzie zachowywana. A powinna. — Jeśli chodzi o drugie pytanie: powiem Ci, że nie brałem pod uwagę w ogóle funkcji calculatePoints; jeśli Twoim zamiarem było zadeklarować właśnie w niej zmienną startCount, to masz rację, zasięg jest problemem. — startCount jest "not defined" z uwagi na strict mode. Cd.
Silv
Cd. Co do nazwy: OK, pewnie masz rację. Niemniej pamiętaj, że zmienne dobrze nazywać jak najbardziej intuicyjnie; natomiast nie wiem, do czego odwołuje się człon "start". Sugeruje, że zmienna będzie używana tylko na początku czegoś, i nie wiem, jaki ma to związek z jej przeznaczeniem (zliczanie punktów).
P1
Ok. Dzięki. Popracuje nad tym
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Napisałeś tutaj

Jeśli chodzi o drugie pytanie: powiem Ci, że nie brałem pod uwagę w ogóle funkcji calculatePoints;.

Czyli chodzi ci o to żeby w ogóle nie tworzyć nowej funkcji tylko zmienną która przechowuje liczbe punktów zdefiniować w funckji showRandomQuestion i tam zapisywać ją do localStorage, a w handlerze na przycisk zwiększać jej wartość?

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

Bo po prawdzie zastanwiałem się przez tydzień jak do tego podejść. Pytam bo próbuje w jakiś sposób analizować to co napisałeś?

edytowany 1x, ostatnio: piotrek1998
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Generalnie: tak, chodzi mi o to, że nie musi być oddzielnej funkcji. Jeśli koniecznie chciałbyś, mogłaby być, tylko wtedy trzeba byłoby inaczej podejść do pewnych miejsc kodu. A konkretnie: myślałem o takim rozwiązaniu, że liczba punktów przechowywana jest wyłącznie w sessionStorage, i nawet nie ma zmiennych lokalnych, które by ją przechowywały.


UPDATE No, może jest, powiedzmy, jedna; tak to byłoby dość nieporęcznie powiększać liczbę punktów. Ale to już kwestia wygody czy elegancji zapisu, nie logiki kodu.


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

Ok. A gdybym chciał to zrobić w odrębnej funkcji to co konkretnie trzeba zmienić w kodzie. Bo generalnie staram się trzymać schematu że każda funkcja do czegoś innego. Nie chce żeby jedna funkcja robiła n-rzeczy. Pytam tylko tak orientacyjnie gdybym w przyszłości chciał zmienić coś w tym kodzie

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

Trudno mi powiedzieć. Myślę że po prostu spróbuj to zrobić, a ja będę poprawiać w trakcie, jeśli będzie trzeba. :)


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

Ten sessionStorage odnośnie tego licznika punktów powinno być umieszczone w if lub else czy po prostu pojednyncza linijka kodu sessionStorage.setItem pod koniec całego tego waunku:

Kopiuj
	if (sessionStorage.getItem('lastQuestIndex') === null) {
		displayQuestQizIndex = getRandomQuestion(quizArr);
		variants = getRandomVariants(displayQuestQizIndex);
		sessionStorage.setItem('lastQuestIndex', displayQuestQizIndex);
		sessionStorage.setItem('lastAnswersIndices', JSON.stringify(variants));
	} else {
		displayQuestQizIndex = sessionStorage.getItem('lastQuestIndex');
		variants = JSON.parse(sessionStorage.getItem('lastAnswersIndices'));
	}
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Funkcja showRandomQuestion wygląda teraz tak:

Kopiuj
function showRandomQuestion() {
	const headerQuestion = document.getElementById('header-question');
	let displayQuestQizIndex = -1;
	let pointsCounter = 0;
	let variants = [];
	if (sessionStorage.getItem('lastQuestIndex') === null) {
		displayQuestQizIndex = getRandomQuestion(quizArr);
		variants = getRandomVariants(displayQuestQizIndex);
		sessionStorage.setItem('lastQuestIndex', displayQuestQizIndex);
		sessionStorage.setItem('lastAnswersIndices', JSON.stringify(variants));
		sessionStorage.setItem('lastAnswersIndices', pointsCounter);
	} else {
		displayQuestQizIndex = sessionStorage.getItem('lastQuestIndex');
		variants = JSON.parse(sessionStorage.getItem('lastAnswersIndices'));
	}
	const questionObject = quizArr[displayQuestQizIndex];
	const labelAnswerA = document.getElementById('label-answer_A');
	labelAnswerA.innerHTML = questionObject.answers[variants[0]];
	const labelAnswerB = document.getElementById('label-answer_B');
	labelAnswerB.innerHTML = questionObject.answers[variants[1]];
	const labelAnswerC = document.getElementById('label-answer_C');
	labelAnswerC.innerHTML = questionObject.answers[variants[2]];
	const labelAnswerD = document.getElementById('label-answer_D');
	labelAnswerD.innerHTML = questionObject.answers[variants[3]];
	headerQuestion.innerHTML = questionObject.question;
}

dodałem to:

Kopiuj
let pointsCounter = 0;

i to:

Kopiuj
sessionStorage.setItem('lastAnswersIndices', pointsCounter);
Silv
A możesz pokazać kod w JSFiddle?
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Przypisujesz hasłu lastAnswersIndices dwa razy pod rząd wartość. Nie ma to sensu – podczas drugiego przypisywania wartość poprzednio przypisana zostaje usunięta. Hasło lastAnswersIndices powinno zawierać, zgodnie z nazwą, indeksy tych odpowiedzi, które zostały wyświetlone użytkownikowi jako ostatnie (po prawdzie ta nazwa nie jest najlepsza, jeśli chodzi o gramatykę angielską, ale to nie jest ważne w tej chwili).

Proponuję, byś w celu zapisania liczby punktów w sessionStorage stworzył nowe hasło, najlepiej o takiej samej nazwie jak obecna już w kodzie zmienna tymczasowa przechowująca liczbę punktów.


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

Możesz spojrzeć https://jsfiddle.net/a5p1hxd2/? Na razie na samą funkcje showRandomQuestion. Dodałem tam nowy warunek.

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

Powiedz tylko czy odnośnie tego o czym mówisz tutaj jedna zmienna, przechowująca stan licznika, czyli ile punktów jest aktualnie; powinna być umieszczona w sessionStorage; powinna być tylko jedna linijka czy powinien być warunek. I co w tym warunku powinienem napisać.

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

Dodałem ten warunek:

Kopiuj
	if (sessionStorage.getItem('pointsCounter') === null) {
		pointsCounter = getRandomQuestion(quizArr);
		sessionStorage.setItem('pointsCounter', pointsCounter);
	}

odnośnie tego co piszesz tutaj

jedna zmienna, przechowująca stan licznika, czyli ile punktów jest aktualnie; powinna być umieszczona w sessionStorage;

Chce tylko wiedzieć czy to powinno być w warunku czy raczej w pojedynczej linijce sessionStorage.getItem('pointsCounter'). Nie wiem bo być może w tym kodzie wystarczy jedna ta wersja sessionStorage.getItem('pointsCounter') ale być może trzeba będzie stworzyć warunek w którym trzeba będzie coś zawrzeć?

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

Następujący kod

Kopiuj
pointsCounter = getRandomQuestion(quizArr);

nie ma semantycznie sensu; indeks pytania przypisywany jest zmiennej, która ma przechowywać liczbę punktów. Zamiast tego powinno to być przypisanie obecnej liczby punktów zwiększonej o 1.

I takie przypisanie powinno być w warunku, o którym pisałem wcześniej; a warunek powinien być w handlerze kliknięcia na przycisk Submit. Warunek wraz z instrukcjami wykonywanymi, gdy jest spełniony, powinien wyglądać jakoś tak: "jeśli użytkownik zaznaczył tę odpowiedź, która jest oznaczona jako poprawna (właściwość correctAnswerIndex), to zwiększ liczbę punktów".


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)