• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Optymalizacja kodu JS, uniknięcie powtórzenia...

Object Storage Arubacloud
0 głosów
202 wizyt
pytanie zadane 22 kwietnia 2018 w JavaScript przez Q7V Gaduła (4,250 p.)

Cześć c: Jestem w trakcie tworzenia prostego quizu w JS. Próbuję zoptymalizować wszystko tak aby uniknąć powtórzeń, niestety nie wiem jak to logicznie wpakować do jednego warunku.

Mianowicie mam taki kod

if(document.getElementById("t1").checked){ // jeżeli zaznaczona prawidłową odpowiedź...
document.getElementById("wynik").innerHTML+="1. Tak, String jest zmienną przechowującą wartości tekstowe.<br />"; //zwróć OK
punkty++; //inkrementacja zmiennej
}

else if(document.getElementById("f0").checked){
document.getElementById("falsz0").style.color = 'red';
document.getElementById("wynik").innerHTML+="1. Błędna odpowiedź! Z podanych odpowiedzi, jedynie String może przechowywać wartości tekstowe.<br />"; //jeżeli zaznaczono błędną
}
else if(document.getElementById("f1").checked){
document.getElementById("falsz1").style.color = 'red';
document.getElementById("wynik").innerHTML+="1. Błędna odpowiedź! Z podanych odpowiedzi, jedynie String może przechowywać wartości tekstowe.<br />"; //jeżeli zaznaczono błędną
}
else if(document.getElementById("f2").checked){
document.getElementById("falsz2").style.color = 'red';
document.getElementById("wynik").innerHTML+="1. Błędna odpowiedź! Z podanych odpowiedzi, jedynie String może przechowywać wartości tekstowe.<br />"; //jeżeli zaznaczono błędną
}

Próbowałem umieścić

document.getElementById("wynik").innerHTML+="1. Błędna odpowiedź! Z podanych odpowiedzi, jedynie String może przechowywać wartości tekstowe.<br />"; //jeżeli zaznaczono błędną

w jednym else lub else ifie, próbowałem tak...

if(document.getElementById("t1").checked){ // jeżeli zaznaczona prawidłową odpowiedź...
document.getElementById("wynik").innerHTML+="1. Tak, String jest zmienną przechowującą wartości tekstowe.<br />"; //zwróć OK
punkty++; //inkrementacja zmiennej
}
else{
else if(document.getElementById("f0").checked){
document.getElementById("falsz0").style.color = 'red';
}
else if(document.getElementById("f1").checked){
document.getElementById("falsz1").style.color = 'red';
}
else if(document.getElementById("f2").checked){
document.getElementById("falsz2").style.color = 'red';
}
document.getElementById("wynik").innerHTML+="1. Błędna odpowiedź! Z podanych odpowiedzi, jedynie String może przechowywać wartości tekstowe.<br />"; //jeżeli zaznaczono błędną
}

i tak

if(document.getElementById("t1").checked){ // jeżeli zaznaczona prawidłową odpowiedź...
document.getElementById("wynik").innerHTML+="1. Tak, String jest zmienną przechowującą wartości tekstowe.<br />"; //zwróć OK
punkty++; //inkrementacja zmiennej
}
else if(document.getElementById("t1").checked==false){
else if(document.getElementById("f0").checked){
document.getElementById("falsz0").style.color = 'red';
}
else if(document.getElementById("f1").checked){
document.getElementById("falsz1").style.color = 'red';
}
else if(document.getElementById("f2").checked){
document.getElementById("falsz2").style.color = 'red';
}
document.getElementById("wynik").innerHTML+="1. Błędna odpowiedź! Z podanych odpowiedzi, jedynie String może przechowywać wartości tekstowe.<br />"; //jeżeli zaznaczono błędną
}

Niestety oba sposoby nie działają, jak mogę tylko raz odwołać się do elementu "wynik" aby uniknąć trzykrotnego powtórzenia? c:

2 odpowiedzi

+3 głosów
odpowiedź 24 kwietnia 2018 przez haski Użytkownik (500 p.)
wybrane 24 kwietnia 2018 przez Q7V
 
Najlepsza

Cześć, wiem że pewnie nie o to Ci chodziło, ale ja bym to napisał tak: (Nie jest w 100% optymalnie, ale jest to dobra baza pod ewentualne rozbudowy)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

    <div id="quiz-container">
        
    </div>
    
    <script src="app.js"></script>
</body>
</html>

const div_quiz = document.querySelector('#quiz-container');
var   point_counter = 0;

const questions = {
    'question_1' : {
        'text'    : 'Which item is a vegetable?',
        'answers' : ['Apple', 'Tomato', 'Banan', 'Orange'],
        'right_answer' : 'Tomato'
    }
}

/**
 * Main function, which creates a question with its answers
 */
function createQuestion(question)
{
    addQuestionText(question);
    addAnswers(question);
    addAnswerValues(question);
    insertSubmitButton();
    document.querySelector('#check-answer').addEventListener('click', getAnswer);
}

/**
 * Creates a 'p' element, adds a question text
 * from 'questions' object
 * 
 * @param {string} question 
 */
function addQuestionText(question)
{
    let new_para = document.createElement('p');
    new_para      .setAttribute('id', question);
    new_para      .textContent = questions[question]['text'];
    div_quiz      .appendChild(new_para);
}

/**
 * Creates radio inputs based answer array
 * in the 'questions' object
 * Appends it to the div
 * 
 * @param {string} question 
 */
function addAnswers(question)
{
    for (i = 0; i < questions[question]['answers'].length; i++)
    {
        let answer_radio = document.createElement('input');
        answer_radio     .setAttribute('name', 'answer');
        answer_radio     .setAttribute('class', 'answer');
        answer_radio     .setAttribute('type', 'radio');

        let label        = document.createElement('label');
        label            .setAttribute('class', 'answer-label');

        div_quiz         .appendChild(answer_radio);
        div_quiz         .appendChild(label);
    }

}

/**
 * Adds values to the radio inputs
 * with coresponding labels
 * 
 * @param {string} question 
 */
function addAnswerValues(question)
{
    answer_inputs = document.querySelectorAll('.answer');
    answer_labels = document.querySelectorAll('.answer-label');
    for (i = 0; i < questions[question]['answers'].length; i++)
    {
        answer_inputs[i]    .setAttribute('value', questions[question]['answers'][i]);
        answer_labels[i]    .textContent = questions[question]['answers'][i];
    }
}

/**
 * Inserts a simple button which will be used
 * to fire an event which cheks the proper answer
 */
function insertSubmitButton()
{
    let submit_button = document.createElement('button');
    submit_button      .setAttribute('id', 'check-answer');
    submit_button      .textContent = 'Sprawdź';
    div_quiz.appendChild(submit_button);
}

/**
 * Checks which radio button was chosen by user
 * Then gets a boolean result from compareResult function
 * Then checks the result with the object properties
 */
function getAnswer()
{
    let question_id = document.querySelector('p');
    question_id     = question_id.getAttribute('id')
    let inputs      = document.querySelectorAll('input');
    let user_answer;

    for (let i = 0; i < inputs.length; i++)
    {
        if (inputs[i].checked) 
        {
            user_answer = inputs[i].value;
        }
    }

    let result = compareResult(user_answer, question_id);

    if (result)
    {
        div_quiz.innerHTML = "<p>Udało się. To prawidłowa odpowiedź!</p>";
        point_counter++;
        div_quiz.innerHTML += "<p>Twoja liczba punktów to: " + point_counter + "</p>";
    } else 
    {
        div_quiz.innerHTML = "<p>Niestety, to zła odpowiedź!</p>";
    }
}

/**
 * Checks if the user answer is equal to the right_answer property
 * 
 * @param {string} answer 
 * @param {string} question 
 */
function compareResult(answer, question)
{
    return answer == questions[question]['right_answer'];
}

Odpalasz funkcję createQuestion i jako argument podajesz string z nazwą pytania w tym obiekcie wyżej. i Ci automatycznie tworzy inputy, labele oraz eventListener do sprawdzenia, czy wybrano poprawną odpowiedź. Z tym, że to narazie działa tylko dla jednego pytania. Ale umożliwa łatwe rozbudowanie aplikacji przez dodawanie kolejny elementów obiektu questions.

0 głosów
odpowiedź 22 kwietnia 2018 przez pablop76 VIP (123,180 p.)

Zobacz pola typu chackbox.

Podobne pytania

0 głosów
3 odpowiedzi 324 wizyt
pytanie zadane 6 lutego 2018 w JavaScript przez shy_fox Gaduła (4,320 p.)
0 głosów
2 odpowiedzi 207 wizyt
pytanie zadane 12 stycznia 2018 w JavaScript przez shy_fox Gaduła (4,320 p.)
+1 głos
1 odpowiedź 286 wizyt

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...