Przypsianie kilku zmiennym wartości z tablicy

Przypsianie kilku zmiennym wartości z tablicy
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
1

Napisałęm coś takiego

Kopiuj
function getRandomVariants() {
	do {
		var randomQuestIndex = Math.floor(Math.random() * quizArr.length);
	} while (randomQuestIndex === randomIndex);
	randomIndex = randomQuestIndex;
	headQuestions.innerHTML = quizArr[randomQuestIndex].question;
}

ale ja raczej chciałem uzyskać coś podobnego do tej funkcji

Kopiuj
function getRandomQuestion() {
	const headQuestions = document.getElementById('header-questions');
	do {
		var randomQuestIndex = Math.floor(Math.random() * questArr.length);
	} while (randomQuestIndex === randomIndex);
	randomIndex = randomQuestIndex;
	headQuestions.innerHTML = questArr[randomQuestIndex];
}

a nie zmienić raptem jeden element

szatkus
Wygląda jak pętla nieskończona.
Silv
@szatkus: ta pętla kończy się po wylosowaniu elementu pytania różnego od poprzedniego. Brakuje tylko deklaracji randomIndex.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
1
Kopiuj
let randomIndex = -1;
function getRandomVariants() {
	do {
		var randomQuestIndex = Math.floor(Math.random() * quizArr.length);
	} while (randomQuestIndex === randomIndex);
	randomIndex = randomQuestIndex;
	headQuestions.innerHTML = quizArr[randomQuestIndex].question;
}
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

Co do funkcji getRandomQuestion – ten kod:

Kopiuj
headQuestions.innerHTML = questArr[randomQuestIndex];

wyświetla cały obiekt pytania (jeśli go wykonałeś, to widzisz). A powinieneś raczej przypisać właściwość question tego obiektu. Poza tym funkcja getRandomQuestion wygląda w miarę dobrze; może tylko nazwałbym inaczej: showQuestion (ale dalej w tym poście użyję jeszcze obecnej nazwy).

Co do funkcji getRandomVariants, powinna być wywoływana w każdym wywołaniu funkcji getRandomQuestion. Powinna być napisana inaczej – rozumiem, że to jeszcze będziesz zmieniać. Między innymi zamiast quizArr.length trzeba użyć quizArr[randomQuestIndex].answers.length.


PS Dla funkcji getRandomVariants potrzeba deklaracji podobnej do let randomIndex = -1;. Teoretycznie można umieścić ją w zasięgu globalnym, poza funkcjami, ale moim zdaniem bardziej intuicyjnie umieścić ją w funkcji getRandomQuestion. UPDATE Mój błąd – trzeba umieścić ją w funkcji getRandomQuestion, bo inaczej losowania odpowiedzi dla różnych pytań będą zależeć od siebie (a nie powinny).


edytowany 3x, ostatnio: Silv
P1
Ok rozumiem. Dzięki za cenne wskazówki. Każda pomoc jest na wage złota
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
1

Czyli w tej funkcji getRandomQuestion zamiast zanpisać tak headQuestions.innerHTML = questArr[randomQuestIndex]; powinienem zapisać to tak headQuestions.innerHTML = questArr[randomQuestIndex].question? Czy tak?

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

Jeśli chodzi o tą funkcje getRandomVariants to ja chce zrobić tą funckje zarówno dla pytań jak i odpowiedzi. Tylko ja na razie ją nazwałem getRandomVariants bo nie miałem pomysłu na inną nazwe. Ona nie tyczy się tylko pytań. Na razie chce ją napisać dla pytań, a jak już wszystko będzie ok to dodać do niej też pytania.

P1
Przepraszam za błąd: a jak już wszystko będzie ok to dodać do niej też odpowiedzi
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

Nie wiem, czy tak się da, żeby tę samą funkcję dla obu rzeczy zrobić. Bo, jak napisałem, według mnie jedna funkcja powinna być wywoływana w drugiej. Ale spróbuj, zobaczymy.


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

Dobrze. Ustalmy pewne rzeczy żeby nie było nieścisłości. Co konkretnie powinna robić ta nowa funkcja. Bo wnioskuje z tego co ty mi napisałeś żeby stworzyć nową funkcje i zostawić jednocześnie te trzy

Kopiuj
function getRandomQuestion() {
	const headQuestions = document.getElementById('header-questions');
	do {
		var randomQuestIndex = Math.floor(Math.random() * questArr.length);
	} while (randomQuestIndex === randomIndex);
	randomIndex = randomQuestIndex;
	headQuestions.innerHTML = questArr[randomQuestIndex].question;
}

function answerQuiz() {
	let arrVariantsAns = [ 'a', 'b', 'c', 'd' ];
	for (const i in arrVariantsAns) {
		var elements = (document.getElementById(arrVariantsAns[i]).innerHTML = arrAnswersQuiz[i]);
	}
	return elements;
}

function randomAnswersQuiz() {
	for (const id of [ 'a', 'b', 'c', 'd' ]) {
		const element = document.getElementById(id);
		const answerIndex = Math.floor(Math.random() * answers.length);
		element.innerText = answers[answerIndex];
		answers.splice(answerIndex, 1);
	}
}

bo nie ukrywam od początku tak chciałem zrobić, a nie wrzucać wszystko do jednej funkcji. Oraz wywoływać funckje getRandomVaraints(nie zwracaj uwagi na nazwe tej funckji i tak ją potem jeszcze zmienie) w funkcji getRandomQuestion

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

Ten kod wygląda teraz tak https://jsfiddle.net/1zwerjdv/. Czy o to chodziło czy jeszcze nie do końca.

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

Wiesz co, zaczyna robić się bałagan. Moim zdaniem usuń wszystko poza tym kodem:

Kopiuj
let randomIndex = -1;
const btnSubmit = document.querySelector('.btn-submit');
let quizArr = [
    ... // Tutaj cała tablica, już jej nie kopiowałem tutaj dla czytelności
];
function getRandomQuestion() {
    getRandomVariants();
}
function getRandomVariants() {
    // Tu puste na razie
}
btnSubmit.addEventListener('click', function() {
    // Tu puste na razie
});

I będziemy dalej zmieniać. Trzeba będzie pozmieniać nazwy, by były bardziej czytelne. Prawie cały (cały?) usunięty kod jest i tak w tym wątku zamieszczony, więc nie ma straty.


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

Spoko

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

Ok gotowe

Kopiuj
let randomIndex = -1;

const btnSubmit = document.querySelector('.btn-submit');

let quizArr = [
	{
		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 Lamborginis'
		]
	},
	{
		question: 'What year was JavaScript launched?',
		answers: [ '1996', '1995', '1994', 'none of the above' ]
	}
];

function getRandomQuestion() {
	getRandomVariants();
}

function getRandomVariants() {}

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

od czego najpierw powinienem zacząć?

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

Wiesz staram się pisać kod w miare możliwości sam ale w związku iż jestem początkujący jestem też ciekaw twojej koncepcji na rozwiązanie danego problemu. Oczywiście nie chce żebyś podawał mi rozwiązanie na tacy ale z chęcią naucze się czegoś nowego

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

Zmieniamy nazwy:

  1. Nazwa randomIndex jest niedokładna. W tak prostym kodzie jak Twój problemu nie widać, ale warto sobie wyrobić nawyk nazywania zmiennych możliwie dokładnie (w ogólnym przypadku takie działanie zależy od kilku czynników, między innymi języka programowania). Lepiej: oldQuestionIndex. Bo ta zmienna przechowuje dokładnie to: poprzedni (= "stary") indeks pytania.
  2. Nazwa getRandomQuestion trochę przeczy logice kodu – nie tylko pobierasz pytanie, ale również je wyświetlasz. Ponownie: w taki prostym kodzie nie widać, w większym byłoby widać (np. gdyby miał 10 tys. linii). Lepiej: showRandomQuestion, albo displayRandomQuestion, albo podobnie (jeśli masz jakąś inną propozycję).

Bonus: moim zdaniem, tak bardziej kosmetycznie, warto zmienić deklarację let quizArr. Słowo kluczowe let sugeruje, że zmienna quizArr może się zmieniać (i jednocześnie na to zezwala). Nie chodzi tutaj o zawartość tablicy, tylko to, że tej zmiennej może na przykład zostać przypisana inna tablica. Ponieważ sądzę, że nie planujesz przypisywać tej zmiennej nic innego, to możesz zmienić tę deklarację na const quizArr. Słowo kluczowe const zarówno sugeruje, jak i w ogóle zabrania przypisywania tej zmiennej czegokolwiek innego. Znów: w tak prostym kodzie po prostu pamiętasz, żeby tej zmiennej nic nie przypisywać. W kodzie o 10 tys. linii będzie ciężko pamiętać o wszystkich zmiennych. Lub: gdybyś rozwijał projekt pół roku czy rok, to duża szansa, że zapomniałbyś, że danej zmiennej nie chciałeś na początku nic przypisywać.


szatkus
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Postów:227
1

Najlepiej jakbyś wziął kod z poprzedniej strony i wrzucił w osobną funkcję. Nazwij to np. putAnwsers czy jak tam chcesz, przekazuj tablicę z odpowiedziami i niech ta sobie je losowo porozrzuca po tych obiektach a, b, c, d. Wywołuj to w showRandomQuestion. W ten sposób będziesz miał w miarę działający quiz. Dorzuciłbym też pole correctAnswer do definicji pytań i na tym zbudował np. jakiś licznik punktów.


𐤃𐤐𐤀
Silv
@szatkus: ale ja mu właśnie poradziłem parę postów wcześniej, żeby kod wyrzucił...
szatkus
@Silv: no i dobrze, bo sporo tam było śmieci. Ale to co dostał na poprzedniej stronie w temacie losowania odpowiedzi to wystarczy ładnie ubrać w funkcję i mu to ładnie dopełni obecny stan rzeczy.
Silv
OK, planuję do tego dojść. Po kolei, powoli. :)
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Ok zrobione. Co dalej?

Silv
Jeśli to nie problem, to czy mógłbyś podawać linki do JSFiddle z nowym kodem? Będzie mi łatwiej odnosić się do kodu po poszczególnych zmianach.
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Mamy dwa cele; można by je nazwać wymaganiami funkcjonalnymi. Czyli:

  1. po załadowaniu strony wyświetlić losowe pytanie;
  2. po naciśnięciu przycisku "Wyślij" wyświetlić losowe pytanie, różne od bieżącego.

Przy okazji zauważyłem pewien problem. Każde pytanie ma inne odpowiedzi. W związku z tym idea wyświetlania odpowiedzi w losowej kolejności nie ma sensu. Jak myślisz? Chyba że… chciałbyś mieć kolejność odpowiedzi dla danego wyświetlenia danego pytania różną od kolejności odpowiedzi dla poprzedniego wyświetlenia tego pytania?

Niezależnie od Twojej odpowiedzi na te pytania, już teraz możemy zacząć implementować wspomniane dwa wymagania. Umieść wywołanie funkcji showRandomQuestion (nie wiem, jaką nazwę ostatecznie nadałeś) w dwóch miejscach: (1) w handlerze kliknięcia na przycisk btnSubmit, (2) na samym końcu całego kodu.


edytowany 1x, ostatnio: Silv
Silv
No… Rozumiem, że chodzi Ci o pierwsze z pytań. A drugie?
Silv
PS Już w poście odpowiedz.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Zrozumiałem zarówno pierwsze jak i drugie pytanie

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

Ok. Teraz jest ok https://jsfiddle.net/tqyovh6a/.

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

Powiedz co dalej mam zrobić. Teraz wychodze z założenia że powinienem zająć się odpowiedziami?

szatkus
Do czego Ci pozwolenie ludzi z internetu? Skoro chcesz zrobić odpowiedzi to zajmij się odpowiedziami.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Zastanwiałem się czy aby móc losować odpowiedzi mógłbym użyć teoretycznie zagnieżdżonych pętli. Myślałem nad czymś takim https://jsfiddle.net/g58y1n0p/ żeby móc przypisywać kilku wariantom różne odpowiedzi ponieważ obecny kod powoduje coś takiego https://jsfiddle.net/ztwqvk67/1/. Oczywiście to jest tylko poglądowa wersja z tymi pętlami które napisałem ale być może dałoby się zrobić z tego jakiś użytek ponieważ obecne działanie tych pętli odbiego od tego co chciałbym uzyskać

Zobacz pozostałe 12 komentarzy
szatkus
@LukeJL: ja bym mu nie mieszał jeszcze bardziej. Szczególnie, że ten jego kod z drugiego linku jest dość bliski działania.
P1
Chciałbym to napisać na zasadzie pętla w pętli. Wiem że chodzi tutaj o dobre praktyki pisania kodu i nie robienia z kodu tzw spaghetti lecz na razie chce to napisać żeby w ogóle zadziałało, a potem zajme się refaktoryzacją
szatkus
@piotrek1998: napisałem wyżej. Popraw ten kod z drugiego linku i będzie grało. Nie potrzebujesz do tego podwójnej pętli, ani nawet nie widzę jak by to mogło działać z użyciem podwójnej pętli.
P1
Ok. Tylko chce zostać przy tym obiekcie quizArr. Nie chce go usuwać
szatkus
No i nie musisz.
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Ten kod który tutaj jest

Kopiuj
const objectName = [
	{
		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 Lamborginis'
		]
	},
	{
		question: 'What year was JavaScript launched?',
		answers: [ '1996', '1995', '1994', 'none of the above' ]
	}
];
for(let i = 0; i < objectName.length; i++){
		for(let j = 0; j < objectName[i][value].length; j++){
			console.log(objectName[i][value][j]);
	}
}

chce wykorzystać do tablic answers w obiekcie quizArr

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

@szatkus:
To jest obecny kod

Kopiuj
function showRandomQuestions() {
	do {
		var randomQuestIndex = Math.floor(Math.random() * quizArr.length);
	} while (randomQuestIndex === oldQuestionIndex);
	oldQuestionIndex = randomQuestIndex;
	headerQuestions.innerHTML = quizArr[randomQuestIndex].question;
}
function showAnswersQuiz(answers) {
	let arrAnswerVaranty = [ 'a', 'b', 'c', 'd' ];
	for (const id in arrAnswerVaranty) {
		var displayAnswersVaranty = document.getElementById((arrAnswerVaranty[id].innerHTML = answers[id]));
	}
	return displayAnswersVaranty;
}

kod w funkcji showRandomQuestions zostaje czy go usunąć i wstawić tam wywołanie tej funkcji showAnswersQuiz z tablicą odpowiedzi?

szatkus
Nie usuwaj tylko dopisz wywołanie showAnswersQuiz. I popraw nawiasy, bo teraz nic z tego nie wyjdzie. I po co ten return?
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Tak to miało wyglądać?

Kopiuj

function showRandomQuestions() {
	do {
		var randomQuestIndex = Math.floor(Math.random() * quizArr.length);
	} while (randomQuestIndex === oldQuestionIndex);
	oldQuestionIndex = randomQuestIndex;
	headerQuestions.innerHTML = quizArr[randomQuestIndex].question;
	showAnswersQuiz([ 'Java', 'C', 'Python', 'JS' ]);
	showAnswersQuiz([ 'Florin Pop', 'Joe Biden', 'Ivan Saldano', 'Mihai Andrei' ]);
	showAnswersQuiz([
		'Hypertext Markup Language',
		'Cascading Style Sheet',
		'Jason Object Notation',
		'Helicopters Terminals Motorboats Lamborginis'
	]);
	showAnswersQuiz([ '1996', '1995', '1994', 'none of the above' ]);
}
function showAnswersQuiz(answers) {
	let arrAnswerVaranty = [ 'a', 'b', 'c', 'd' ];
	for (const id in arrAnswerVaranty) {
		var displayAnswersVaranty = document.getElementById((arrAnswerVaranty[id].innerHTML = answers[id]));
	}
}
szatkus
Pozamiatałeś
szatkus
showAnswersQuiz(quizArr[randomQuestIndex].answers)
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Dostaje answers is not defined https://jsfiddle.net/esz79bxj/1/

szatkus
Bo na samym dole wywołujesz tę funkcję bez argumentów
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Ok błędu już nie ma ale nadal nie wyświetlają się pytania https://jsfiddle.net/L3kujr7b/

edytowany 1x, ostatnio: piotrek1998
Zobacz pozostałe 6 komentarzy
P1
W funkcji showAnswersQuiz?
szatkus
Z tego, co widzę to tak
P1
No to nie wiem. Sprawdzam różne możliwości i nie działa
szatkus
document.getElementById(arrAnswerVaranty[id]).innerHTML = answers[id];
P1
Ok. Dzięki. Już widze gdzie robiłem błąd
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:5 minut
  • Postów:8405
1

@piotrek1998

Dobra ok. A nie mogę wykorzystać tego kodu z tymi pętlami. Nie chce od razu korzystać z metod wbudowanych —

no właśnie, jak to zrobić bez sortowania po randomie? Można by to zrobić tak, żeby budować nową tablicę losując za każdym razem indeks elementu. I teraz - żeby się elementy nie powtarzały, to zapamiętywać, które indeksy się powtórzyły. I jeśli dany wylosowany indeks nie wystąpił wcześniej, to spoko, możemy dać push dodając nowy element do naszej nowej tablicy. Jeśli jednak już wystąpił, to zwiększamy o 1 indeks elementu (jak trafimy na koniec tablicy, to lecimy od zera) i lecimy dalej w pętli, aż w końcu natrafimy na puste miejsce i dopiero tam to damy (możemy też użyć dzielenia z resztą index % arr.length, wtedy nie będziemy musieli dawać warunku czy jest koniec tablicy, to 0, bo dzielenie z resztą samo nam to zrobi.


P1
Chciałbym się nauczyć pisać też bardziej skomplikowany kod. Więc chce użyć pętli zostając jednocześnie przy tym obiekcie
LukeJL
No to rozwiązanie, które zaproponowałem, zakłada robienie pętli, a nawet dwóch. Chociaż można podejść do tego na różne sposoby i szczerze mówiąc nie wiem, jak to zrobić najbardziej elegancko (a zbyt wiele pętli to nie jest eleganckie rozwiązanie. Tzn. jak masz 4 elementy w tablicy, to nie ma to takiego znaczenia, ale jakbyś miał np. tablice po ileś tysięcy elementów, to już należałoby mocniej pomyśleć o złożoności algorytmicznej. Ale kurczę nie wiem, sam jestem ciekaw, jaki jest książkowy sposób na rozwiązanie czegoś takiego).
P1
Rozumiem. Tylko wydaje mi się że zagnieżdżanie pętli nie ogranicza się tylko do wieloelementowej tablicy. W takim przypadku również jak masz wiele tablic w obiekcie
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
0

@piotrek1998: przepraszam, ale jeśli chodzi o mnie, to ja jednak wrócę do kodu sprzed Twoich ostatnich modyfikacji (acz już implementującego to, co napisałem ostatnio). Nie będę brać pod uwagę ani Twojego ostatniego kodu, ani propozycji @LukeJL oraz @szatkus Inaczej pogubię się. (Jeśli wolisz ich porady, mogę się wycofać, choćby tymczasowo).

Niech naszym kodem wyjściowym będzie teraz poniższy kod:

Kopiuj
let oldQuestionIndex = -1;

const btnSubmit = document.querySelector('.btn-submit');

const quizArr = [
    {
        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 Lamborginis'
        ]
    },
    {
        question: 'What year was JavaScript launched?',
        answers: [ '1996', '1995', '1994', 'none of the above' ]
    }
];

function showRandomQuestion() {
    getRandomVariants();
}

function getRandomVariants() {}

btnSubmit.addEventListener('click', function() {
    showRandomQuestion();
});

showRandomQuestion();

Zmieniłem nazwę showRandomQuestions na showRandomQuestion w stosunku do Twojego ostatniego kodu (zauważ brak literki s na końcu).

Teraz dobrze, żebyś był pewien, jak ten kod działa:

  1. Po załadowaniu strony dzieją się następujące rzeczy (mniej-więcej w tej kolejności):
    1.1. Deklarowana jest zmienna oldQuestionIndex i przypisywana jest jej liczba -1.
    1.2. Wywoływana jest metoda querySelector obiektu document, a tym samym pobierany jest przycisk (czyli element HTML) o klasie btn-submit. Dalej: deklarowana jest zmienna btnSubmit. Na końcu pobrany przycisk jest przypisywany tej zmiennej.
    1.3. Deklarowana jest zmienna quizArr i przypisywana jest jej tablica z pytaniami.
    1.4. Deklarowana jest funkcja showRandomQuestion.
    1.5. Deklarowana jest funkcja getRandomVariants.
    1.6. Wywoływana jest metoda addEventListener przycisku btnSubmit.
    1.7. Wywoływana jest funkcja showRandomQuestion.
  2. Po wywołaniu metody addEventListener dzieją się następujące rzeczy:
    2.1. Przypisywana jest funkcja anonimowa do zdarzenia click przycisku btnSubmit.
  3. Po kliknięciu przycisku btnSubmit (czyli nadejściu jego zdarzenia click) dzieją się następujące rzeczy:
    3.1. Wywoływana jest funkcja anonimowa przypisana do tego zdarzenia, a tym samym wywoływana jest funkcja showRandomQuestion.
  4. Po wywołaniu funkcji showRandomQuestion dzieją się następujące rzeczy:
    4.1. Wywoływana jest funkcja getRandomVariants.

Powyższy opis działania jest tylko pomocniczy. Nie musisz z niego korzystać w dalszej pracy, choć dobrze, jak będziesz to działanie rozumieć.

Na razie tyle. Żeby nie wszystko naraz, napiszę ciąg dalszy jutro.


@LukeJL , @szatkus – przepraszam, że nie korzystam z Waszego kodu i propozycji.


edytowany 7x, ostatnio: Silv
P1
Dobrze. Dzięki stary. Każda forma pomocy pomaga mi jeszcze bardziej
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
1

Doprecyzujmy nasze cele. Przypomnę, że oryginalne były takie:

Silv napisał(a):

Mamy dwa cele; można by je nazwać wymaganiami funkcjonalnymi. Czyli:

  1. po załadowaniu strony wyświetlić losowe pytanie;
  2. po naciśnięciu przycisku "Wyślij" wyświetlić losowe pytanie, różne od bieżącego.

Poprzednio zapytałem Cię, czy chciałbyś mieć kolejność odpowiedzi dla danego wyświetlenia danego pytania różną od kolejności odpowiedzi dla poprzedniego wyświetlenia tego pytania. Nie odpowiedziałeś, ale to nic, bo obecnie myślę, że nie jest to najlepsze pytanie; wymagałoby zmiany tablicy quizArr, a tego wolę nie robić, bo za dużo pracy by było naraz. Moim zdaniem po prostu wyświetlajmy odpowiedzi w losowej kolejności. Nie ma to co prawda większego znaczenia – i tak nie będzie tego widać, bo dla każdego pytania są inne odpowiedzi. Ale zróbmy tak, żeby nie komplikować. Zgadzasz się?


PS Przepraszam, że tak to ciągnę, ale to kluczowa rzecz według mnie, a wczoraj nie pomyślałem o tym.


edytowany 1x, ostatnio: Silv
P1
Oczywiście. Na razie głównym celem jest napisanie tego tak żeby to w ogóle zadziałało. A potem będę zajmował się dodatkami
Silv
Moderator Wiki
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa
2

Teraz tak:

  1. Trzeba udostępnić w kodzie element HTML, w którym będzie wyświetlane pytanie. To już zrobiłeś w ostatnim swoim kodzie. Tylko więc przekleję:
Kopiuj
const headerQuestions = document.getElementById('header-questions');

Moim zdaniem nazwa tej zmiennej i identyfikator tego elementu mogły by być inne. Obecne sugerują, że w tym nagłówku będzie kolekcja pytań, a nie jedno pytanie. Proponowałbym zarówno w identyfikatorze, jak i w nazwie zmiennej usunięcie literki s z końca (pamiętaj o zmianie identyfikatora także w kodzie HTML).

  1. Trzeba udostępnić w kodzie elementy HTML, w których będą wyświetlane odpowiedzi. To też zrobiłeś w ostatnim swoim kodzie. Przekleję:
Kopiuj
const answerA = document.getElementById('a');
const answerB = document.getElementById('b');
const answerC = document.getElementById('c');
const answerD = document.getElementById('d');

Te zmienne i identyfikatory można by również inaczej nazwać, żeby zachować obecną konwencję, jaką widzę u Ciebie. Proponowałbym poprzedzenie nazwy każdej zmiennej ciągiem label (i oczywiście zmianę litery a na A), oraz poprzedzenie każdego identyfikatora ciągiem label- (zauważ kreskę na końcu; pamiętaj o kodzie HTML).


edytowany 2x, ostatnio: Silv
P1
Jasne nie ma sprawy. Już sie robi
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
1

Teraz jest ok https://jsfiddle.net/3muL20rq/. Czy coś musze poprawić jeszcze?

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)