Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Можно ли решить задачу без библиотек (jquery и пр.)? (https://javascript.ru/forum/events/84260-mozhno-li-reshit-zadachu-bez-bibliotek-jquery-i-pr.html)

Chile 22.07.2022 18:09

Можно ли решить задачу без библиотек (jquery и пр.)?
 
Здравствуйте, товарищи!

Скажите пожалуйста, можно ли решить подобную задачу без библиотек, на чистом js? Это отправка формы без перезагрузки и вывод сообщения в всплывающем окне.

Если это возможно, то как? :)

$(document).ready(function() {
	$('form').submit(function(event) {
		var json;
		event.preventDefault();
		$.ajax({
			type: $(this).attr('method'),
			url: $(this).attr('action'),
			data: new FormData(this),
			contentType: false,
			cache: false,
			processData: false,
			success: function(result) {
				json = jQuery.parseJSON(result);
				if (json.url) {
					window.location.href = '/' + json.url;
				} else {
					alert(json.status + ' - ' + json.message);
				}
			},
		});
	});
});

ksa 22.07.2022 19:18

Chile, все "библиотеки" написаны на "чистом JS"... ;)

Chile 22.07.2022 19:22

Цитата:

Сообщение от ksa (Сообщение 546787)
Chile, все "библиотеки" написаны на "чистом JS"... ;)

Понятное дело :) но я о том, что хотел бы получить решение «малой кровью», без подключения сторонних ресурсов

ksa 22.07.2022 19:45

Chile, у тебя уже приведен пример отправки без перезагрузки...
Осталось узнать что ты понимаешь под выводом сообщения во всплывающем окне.

ksa 22.07.2022 19:46

Цитата:

Сообщение от Chile
alert(json.status + ' - ' + json.message)

Это вот модальное окно... Чем не устраивает?

Chile 22.07.2022 19:49

Цитата:

Сообщение от ksa (Сообщение 546790)
Это вот модальное окно... Чем не устраивает?

А оно не работает без вот этого:

<script src="http://…jquery.js"></script>

:)

ksa 22.07.2022 20:01

Окно работает и без этого...
alert('Опа!')


А отправку данных можно сделать нативным fetch()...
https://learn.javascript.ru/fetch

Chile 22.07.2022 20:06

Цитата:

Сообщение от ksa (Сообщение 546792)
Окно работает и без этого...
alert('Опа!')


А отправку данных можно сделать нативным fetch()...
https://learn.javascript.ru/fetch

Это очень хорошо, но я очень плохо понимаю джаваскрипт, только пэхапэ б/м сносно… :(

ksa 22.07.2022 20:11

Цитата:

Сообщение от Chile
я очень плохо понимаю джаваскрипт

Вот еще статья на тему отправки форм...
https://www.mousedc.ru/learning/593-...ript-formdata/

Т.ч. придется таки понимать начать. Как иначе?

Chile 22.07.2022 20:28

Цитата:

Сообщение от ksa (Сообщение 546794)
Вот еще статья на тему отправки форм...
https://www.mousedc.ru/learning/593-...ript-formdata/

Т.ч. придется таки понимать начать. Как иначе?

Маловероятно, что у меня что-то выйдет, но всё равно большое спасибо за участие и материалы :)

Aetae 22.07.2022 20:40

document.addEventListener('DOMContentLoaded', () => {
  document.querySelector('form').addEventListener('submit', async (event) => {
    event.preventDefault();

    const { currentTarget: form } = event;
    const { method, action } = form;

    const response = await fetch(action, { method, body: new FormData(form) });
    const json = await response.json();

    if (json.url) {
      window.location.href = '/' + json.url;
    } else {
      alert(json.status + ' - ' + json.message);
    }    
  })
})

Chile 22.07.2022 21:16

Цитата:

Сообщение от Aetae (Сообщение 546796)
document.addEventListener('DOMContentLoaded', () => {
  document.querySelector('form').addEventListener('submit', async (event) => {
    event.preventDefault();

    const { currentTarget: form } = event;
    const { method, action } = form;

    const response = await fetch(action, { method, body: new FormData(form) });
    const json = await response.json();

    if (json.url) {
      window.location.href = '/' + json.url;
    } else {
      alert(json.status + ' - ' + json.message);
    }    
  })
})

К сожалению, не работает :(

Может быть я что-то не то делаю. Мне нужно как-то адаптировать этот код или просто заменить текущий?

рони 22.07.2022 22:15

Цитата:

Сообщение от Chile
просто заменить текущий?

:yes:

Chile 22.07.2022 22:25

Всё равно не работает :))

Просто вот это выводится на белой странице:

{"status":"success","message":"post added successfully"}

т. е. результат пэхэпэшной валидации:

if ($titleLen < 10 or $titleLen > 100) {
$this->error = 'name should be from 10 to 100 char';
return false;


Не то пишу. Выводится сообщение об успехе:

$this->view->message('success', "post added successfully");

Chile 24.07.2022 23:21

Проверил всё ещё раз, нигде ничего не пропущено в коде, но всё равно не хочет работать :(

Точка с запятой пропущена была. Вопрос снят. Всем огромное спасибо! :)


Часовой пояс GMT +3, время: 15:42.