Как остановить сброс моей страницы после отправки страницы

#javascript

#javascript

Вопрос:

У меня есть код, который помогает мне переключаться между формами, однако, когда я отправляю форму, страница сбрасывается и снова отображается первая (по умолчанию) вкладка. Может ли кто-нибудь помочь мне понять, как я могу сделать так, чтобы вкладка, с которой я отправляю форму, оставалась там, если отправка завершилась неудачно или даже если отправка прошла успешно?

Формы переключаются с использованием небольшого кода JS и отправляются из формы метода PHP POST.

Пожалуйста, найдите код ниже:

Javascript отвечает за переключение между вкладками:

 function onTabClick(event) {
    let activeTabs = document.querySelectorAll('.active');
    // deactivate existing active tab
    for (let i = 0; i < activeTabs.length; i  ) {
        activeTabs[i].className = activeTabs[i].className.replace('active', '');
    }

    // activate new tab
    event.target.parentElement.className  = 'active';
    document.getElementById(event.target.href.split('#')[1]).className  = 'active';
}

const elements = document.getElementsByClassName('nav-tab-element');

for (let i = 0; i < elements.length; i  ) {
    elements[i].addEventListener('click', onTabClick, false);
}
  

CSS:

 .tab-content {
    display: none;
}

.tab-content.active {
    display: block;
}
  

И вот HTML-формы:

 <body>
    <header>
        <h1 class="main-header">
            Add a New Product
        </h1>
    </header>
    <main>
        <ul id="nav-tab" class="nav">
            <li class="active">
                <a class="nav-tab-element" href="#books">Books</a>
            </li>
            <li>
                <a class="nav-tab-element" href="#dvds">DVD's</a>
            </li>
            <li>
                <a class="nav-tab-element" href="#furniture">Furniture</a>
            </li>
        </ul>

        <form method="POST">
            <div class="tab-content active" id="books">
                <div class="book-tab">
                    <input type="text" name="sku" placeholder="test form for books" autocomplete="off">
                </div>
                <div class="btn">
                    <input type="submit" value="Submit">
                </div>
            </div>
        </form>

        <form method="POST">
            <div class="tab-content " id="dvds">
                <div class="dvd-tab">
                    <input type="text" name="sku" placeholder="test form for DVD" autocomplete="off">
                </div>
                <div class="btn">
                    <input type="submit" value="Submit">
                </div>
            </div>
        </form>

        <form method="POST">
            <div class="tab-content " id="furniture">
                <div class="furniture-tab">
                    <input type="text" name="sku" placeholder="test form for furniture" autocomplete="off">
                </div>
                <div class="btn">
                    <input type="submit" value="Submit">
                </div>
            </div>
        </form>
    </main>

    <script src="main.js"></script>
</body>
  

Комментарии:

1. Чтобы остановить перезагрузку страницы при отправке формы, вам нужно будет отправить эту форму с помощью ajax. Это позволит вам отправлять свою форму без перезагрузки страницы, а также показывать пользователю сообщение об успехе / ошибке на основе ответа от сервера.

Ответ №1:

Щелчок submit отправляет данные формы на страницу, указанную в action атрибуте в форме. Если вы не введете этот атрибут (как вы этого не сделали), по умолчанию выполняется отправка на текущую страницу.

Чтобы устранить возникшую у вас проблему, я бы посоветовал вместо использования отправки ванильной формы отправлять отправку через ajax. Выполнение вызова ajax в jQuery довольно просто, поэтому я рекомендую вам изучить это.

Ответ №2:

Существует событие, которое запускается при отправке формы. Вы можете запретить перезагрузку своей страницы, выполнив следующее:

event.preventDefault()

вы можете найти больше здесь: https://www.w3schools.com/jsref/event_preventdefault.asp или здесь https://www.w3schools.com/jquery/event_preventdefault.asp

Комментарии:

1. Спасибо, возможно ли, что вы скажете мне, где, по вашему мнению, я должен поместить строку event.preventDefault?

2. Есть два способа, или вы включаете onsubmit в свой тег формы следующим образом: <form onsubmit=»onSubmitItems()»> Введите имя: <тип ввода =»текст»> <тип ввода =»отправить»> </form> или onclick в вашем типе ввода submit . затем вы можете создать функцию типа: function onSubmitItems(event) { event.preventDefault() }

3. Спасибо за предложение, однако это останавливает меня от отправки формы вообще. Может быть, у вас есть идея о том, как я могу это реализовать, по-прежнему отправлять форму, но после отправки формы выбранная вкладка по-прежнему отображается вместо возврата страницы к первой вкладке?

4. чтобы не перезагружать страницу, вам нужно сделать то, что я сказал выше. Чтобы выполнить оба действия, отправить и запретить перезагрузку страницы, вам потребуется работа, например, с Axios или Ajax .

5. Да, к сожалению, я тоже пришел к этому. Спасибо за помощь.

Ответ №3:

Все, что вам нужно сделать, это добавить event.preventDefault() в первую строку вашей функции onTabClick(событие). После того, как вы preventDefault, вы можете запустить любую логику, которую вы хотите прямо там.

Способ взаимодействия ванильного html / js заключается в следующем: при отправке формы страница пытается отправить информацию на сервер, а затем обновляется для обновления новой информацией. Рост SPAS изменил желаемое поведение, и вам нужно переопределить поведение браузера по умолчанию, чтобы остановить обновление.

Добавление Ajax / Axios будет работать, поскольку большинство этих библиотек API имеют встроенные функции для переопределения значений по умолчанию, но в этом нет необходимости.

Комментарии:

1. Привет, спасибо за ответ! Я попытался добавить эту строку в свой код, но, к сожалению, не смог заставить ее работать. Возможно ли, чтобы вы сообщили мне, где именно в коде JS я должен это вставить? Я попытался поместить его ниже и поверх переменной activeTabs, но это не сработало.