Запрос на выборку приводит к перезагрузке нежелательной страницы

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

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

Обратите внимание, что я использую EJS в качестве механизма шаблонов и Bootstrap 4 в качестве внешней библиотеки.

Пожалуйста, взгляните на мой код ниже. Любые советы, чтобы избежать перезагрузки страницы, очень ценятся.

Интерфейсный HTML:

// detailjs.ejs

<div class = "row">
    <form>
        <button class = "btn btn-outline-primary" onclick = "UpdateArchiveStatus(this)" id = "btn-move-to-inbox"><i class = "fas fa-inbox"></i> Flytt til innboks</button>
        <button class = "btn btn-outline-primary" onclick = "UpdateArchiveStatus(this)" id = "btn-move-to-archive"><i class = "fas fa-archive"></i> Arkiver</button>
    </form>
</div>

<div class = "row">
    <input type = "hidden" name = "resolved-status" id = "resolved-status" value = "<%= message.status.isResolved %>">
    <input type = "hidden" name = "archive-status" id = "archive-status" value = "<%= message.status.isArchived %>">
</div>

<!-- Script include --!>
<script src = "/assets/js/messages/message-admin.js">

Внешний JavaScript

//message-admin.js

const UpdateArchiveStatus = btn => {
var messageId = $('#message-id').val();
var currentArchiveStatus = $('#archive-status').val();
var newArchiveStatus = null;

if (currentArchiveStatus == 'true') {
    newArchiveStatus = false;
 } else {
   newArchiveStatus = true;
 }
 StoreArchiveStatus(messageId, newArchiveStatus);
};

function StoreArchiveStatus (messageId, archiveStatus) {
    fetch(`/backoffice/api/messages/archive/${messageId}/${archiveStatus}`, 
    {
        method: 'GET',
    })
    .then(result => {
         return result.json();
    })
    .then(data => {
        $('#archive-status').val(data.status);
        CheckArchiveStatus();
        console.info(data.message);
    })
    .catch(err => {
        console.info(err);
     });
    };

function ToggleArchivedInterface () {
    var inboxButton   = $('#btn-move-to-inbox');
    var archiveButton = $('#btn-move-to-archive');

    inboxButton.removeClass('invisible');
    archiveButton.addClass('invisible');
};

function ToggleInboxInterface () {
    var inboxButton   = $('#btn-move-to-inbox');
    var archiveButton = $('#btn-move-to-archive');

    archiveButton.removeClass('invisible');
    inboxButton.addClass('invisible');
};

async function CheckArchiveStatus () {
    var archiveStatus = $('#archive-status').val();
    if (archiveStatus == 'true') {
        ToggleArchivedInterface();
    } else {
        ToggleInboxInterface();
    }
};

Задний маршрут:

//routes/backoffice.js

router.get('/api/messages/archive/:messageId/:archiveStatus', authenticate, backofficeController.apiUpdateMessageArchiveStatus);

Функция внутреннего контроллера:

//controllers/backoffice.js

exports.apiUpdateMessageResolvedStatus = (req, res, next) => {
    var messageId      = req.params.messageId;
    var resolvedStatus = req.params.resolvedStatus;

    VisitorMessage.findOneAndUpdate(
        { '_id' : messageId },
        { $set: {
            'status.isResolved': resolvedStatus
        }
    }).then((message) => {
        res.status(200).json({message: `Message status was changed`, status: resolvedStatus})
   }).catch((err) => {
       console.info('The following error occured during update:\n' + err);
       res.status(500).json({message: 'An error occured during update.'});
   })
};

запросы на выборку не вызывают перезагрузки страницы.

Kevin B 06.03.2019 21:59

Возможный дубликат нажмите событие обновить мою страницу

Kevin B 06.03.2019 22:00

Да, почти уверен, что поскольку кнопка находится в форме, по умолчанию она представляет собой отправку.

SpeedOfRound 06.03.2019 22:03
Поведение ключевого слова "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) для оценки ваших знаний,...
2
3
7 570
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как прокомментировал SpeedOfRound, он совершенно прав. Сам я этой проблемы не видел. Спасибо вам за помощь!

Решение: Удалите лишние теги <form> в файле detailjs.ejs. Эти теги заставляли страницу обновляться, хотя я использовал запрос на выборку.

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

Проблема в том, что при нажатии кнопки форма отправляется и вызывает перезагрузку страницы.

Вы можете увидеть проблему в действии здесь.

function btnclick(e) {
  // comment and uncomment e.preventDefault to see the differences
  e.preventDefault()
}

Предотвратите действие события по умолчанию, и проблема будет решена.

Спасибо, Мишель. Я отметил ваш ответ как решение. Это немного другой подход, чем другое предложение, но это тоже помогло.

Michael Sagnes 06.03.2019 22:18

Боже, почему за это минусуют? Это точно правильно.

Izkata 06.01.2020 18:01

Я столкнулся с той же проблемой, и вместо предотвращения дефолта я бы рекомендовал пересмотреть, нужна ли вам форма вообще. В моем случае я просто заменил форму на div.

Krisztián Kis 10.03.2020 22:55

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