Можно ли использовать оператор else if для поэтапного раскрытия элементов с помощью JavaScript?

Редактировать: Спасибо! Эта проблема решена. Это был мой первый вопрос о StackExchange, и вы все были очень любезны, ответив так быстро, проницательно и подробно.

Я создаю страницу с кнопкой «добавить еще одну задачу». При каждом нажатии один скрытый элемент должен изменить свойства CSS со «скрытого» на «видимое», добавляя на страницу еще одну строку входных данных. Мне удалось показать их все одновременно, но я пытаюсь показать строки по одной.

Вот что я написал на данный момент. В противном случае, если утверждения имели для меня наибольший смысл, судя по сообщениям SE, которые я читал о них, но при первом нажатии кнопки обе скрытые строки («задача2» и «задача3») открываются одновременно. Я использую неправильный условный оператор? Или операторы должны находиться внутри своих собственных функций внутри функции showNextTask? Буду признателен за любую помощь!

function showNextTask() {
                let task2 = document.querySelector("#task-2-row");
                let task3 = document.querySelector("#task-3-row");

                if ((task2.style.visibility === "hidden")) {
                    task2.style.visibility = "visible";
                    task2.style.maxHeight = "80px";
                } else if (
                    (task2.style.visibility === "visible") &&
                    (task3.style.visibility === "hidden")
                ) {
                    task3.style.visibility = "visible";
                    task3.style.maxHeight = "80px";
                }
            }

let nextInputTask = document.querySelector("#add-another-task-button");
nextInputTask.addEventListener("click", showNextTask);

Как указано ниже, вот HTML-код задачи 2 (задача 3 идентична):

<div id = "task-2-row">
                    <form id = "add-task-2">
                        <span class = "add-task-2-description">
                            <input
                                type = "text"
                                placeholder = "Task 2"
                                autocomplete = "off"
                                id = "task-input-bar-2"
                                class = "task-input-field"
                            />
                        </span>
                        <span class = "add-task-2-time">
                            <input
                                type = "time"
                                id = "timer-field-2"
                                class = "task2 timer-field"
                                name = "appt"
                            />
                            <input
                                type = "submit"
                                id = "submit-task-2-button"
                                class = "button add-timer-button"
                                value = "Add Task"
                            />
                        </span>
                    </form>
                </div>

И CSS:

    #task-2-row {
                visibility: hidden;
                max-height: 0;
            }
= — присвоение, === — сравнение.
Pointy 15.07.2024 15:12

Что вы планируете делать, когда пользователь захочет добавить 10 задач или 20?

trincot 15.07.2024 15:12

Конечно, имеет смысл вместо того, чтобы показывать скрытые элементы, добавлять новый элемент в конце каждый раз, когда происходит щелчок?

Paulie_D 15.07.2024 15:15

но при первом нажатии кнопки обе скрытые строки ("задача2" и "задача3") открываются одновременно" - не понимаю, как это могло быть на самом деле (даже с учетом уже упомянутой ошибки сравнения); ветки if и else не могут выполняться «одновременно».

CBroe 15.07.2024 15:15

@Pointy, да, ты прав! Я это исправил, спасибо. Я обновлю вопрос.

J Park 15.07.2024 15:41

@trincot Я работаю над тем, чтобы превратить эту функцию во что-то масштабируемое! Сейчас я просто демонстрирую, как будет работать кнопка, если пользователь нажмет ее один или два раза, в качестве примера.

J Park 15.07.2024 15:43

@Paulie_D ты прав, это имеет больше смысла. У меня пока недостаточно опыта, чтобы это сделать, но я почитаю об этом и попробую это вместо этого в своей следующей итерации.

J Park 15.07.2024 15:44

Можете ли вы добавить HTML, который вы используете? И какой-нибудь CSS?

trincot 15.07.2024 15:47

почему бы вам не использовать скрытую видимость для обеих задач в условии if

Tony 15.07.2024 15:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
9
81
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы используете оператор присваивания = вместо оператора равенства == или ===.

Вместо этого я предлагаю вам попытаться создать более общую функцию, чтобы добавить N задач с помощью кнопки

Пытаться

 <style>
    .task-row {
        visibility: hidden;
        max-height: 0;
        overflow: hidden;
        transition: max-height 0.3s ease-out, visibility 0.3s ease-out;
        margin-bottom: 10px;
    }
</style>
<body>

<button id = "add-another-task-button">Add Task</button>
<div id = "task-container">
    <!-- Tasks will be created dynamically -->
</div>

<script>
    let taskCount = 0;

    function addNewTask() {
        taskCount++;
        const taskContainer = document.querySelector("#task-container");
        const newTask = document.createElement("div");
        newTask.id = `task-${taskCount}-row`;
        newTask.className = "task-row";
        newTask.innerHTML = `Task ${taskCount}: <input type = "text">`;

        taskContainer.appendChild(newTask);

        // Make new task visible
        setTimeout(() => {
            newTask.style.visibility = "visible";
            newTask.style.maxHeight = "80px"; 
        }, 0);
    }

    document.addEventListener("DOMContentLoaded", (event) => {
        let nextInputTask = document.querySelector("#add-another-task-button");
        nextInputTask.addEventListener("click", addNewTask);
    });
</script>

Этот подход поможет создать любое количество задач с помощью CTA «Добавить задачу».

Ага, понятно! Я думаю, это то, что Paulie_D предложил выше: вводить новый элемент при каждом нажатии кнопки - и вы предоставили здесь весь формат. Я принимаю это как лучший ответ и думаю, что создам эту функцию с использованием рекомендованного вами подхода, чтобы ее было легче масштабировать до более чем трех элементов «Новая задача» (спасибо @trincot за указание на это!) . Спасибо, Ашиш Ядав!

J Park 15.07.2024 15:57

Просто чтобы определить, почему ваш if..else не работает:

Вы проверяете task2.style.visibility, но этот стиль так и не был установлен. Вместо этого у вас есть класс CSS, который применяется к этому элементу, но это не одно и то же. Чтобы узнать, как все применимые стили CSS влияют на видимость task2, вы можете использовать getComputedStyle. Тогда это сработает.

Еще одно замечание: в случае else вы уже знаете, что task2 виден, поэтому нет необходимости еще раз явно проверять это.

Итак, измените это:

if ((task2.style.visibility === "hidden")) {
    task2.style.visibility = "visible";
    task2.style.maxHeight = "80px";
} else if (
    (task2.style.visibility === "visible") &&
    (task3.style.visibility === "hidden")
) {
    task3.style.visibility = "visible";
    task3.style.maxHeight = "80px";
}

к этому:

if ((getComputedStyle(task2).visibility === "hidden")) {
    task2.style.visibility = "visible";
    task2.style.maxHeight = "80px";
} else if (getComputedStyle(task3).visibility === "hidden") {
    task3.style.visibility = "visible";
    task3.style.maxHeight = "80px";
}

Но, как уже отмечалось, на самом деле это не масштабируемый подход. Кроме того, такая игра с maxHeight действительно показывает, что вы хотите использовать свойство display, а не visibility. Обратите внимание, что display принимает разные значения, поэтому обязательно посмотрите.

Спасибо, что вернулись к этому! Я оставлю getComputedStyle в своем наборе инструментов на будущее, а сейчас я изменил свой код на что-то более простое для масштабирования в будущем. Что касается свойства видимости и отображения, то, к сожалению, это требование проекта, над которым я работаю, хотя я могу вернуться и изменить его, как только оно будет рассмотрено. Еще раз большое спасибо!

J Park 16.07.2024 01:05

Другие вопросы по теме