как переписать jquery на javascript
$("form").submit(function() { //Change
var th = $(this);
$.ajax({
type: "POST",
url: "mail.php", //Change
data: th.serialize()
}).done(function() {
alert("Thank you!");
setTimeout(function() {
// Done Functions
th.trigger("reset");
}, 1000);
});
return false;
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
Как сделать тоже самое на js?
Ответы (1 шт):
Пойдём по порядку:
$("form")- это ничто иное как document.querySelector. Значит пишемdocument.querySelector('form'). НО! Это вам вернёт первый попавшийся<form>...</form>. Так что если вам надо чтобы все формы при сабмите вызывали одну и ту же ф-ию, то вам надо использовать document.querySelectorAll, который вернёт список всех форм в виде NodeList. Но к счастью у него есть метод forEach, так вам просто надо будет запустить следующие шаги внутри методаforEach.submit(...)- это тоже самое, что назначить слушатель (ВАЖНО что внутри скобок есть ф-ия иначе это будет вызов событияsubmit). Значит у нас есть 2 возможности:Про их разницу очень подробно можно прочитать тут и в разных вариациях этот вопрос уже обсуждался 100500 раз, так что думаю найти инфу будет не проблема :). Но если прям очень в кратце, с помощью метода 1 можно задать несколько обработчиков на 1 событие, а с помощью метода 2 только 1 обработчик можно навесить, причём он перетерёт то что было до него. Повторюсь это очень в кратце для общего понимания, лучше прочитайте дополнительно
var th = $(this);- мы так же можем заменить разными способами в зависимости от того в каком виде ф-ия была передана в слушатель:- Если была передана ф-ия вида
function() {...}, тогда у нас единнственный способ замены это:const target = this
- Если была передана ф-ия вида
function(e) {...}, тогда у нас два способа замены это:const target = thisconst target = e.target
- Если была передана ф-ия вида
() => {...}, тогда мы не сможем ни на что заменить, т.к. у стрелочной ф-ии нетthisи не был переданEventTarget. Но есть небольшая хитрость, если заранее сохранить найденную форму в какую-то переменную, то можно обратиться к ней. В случае сforEachдаже отдельно перезаписывать не придётся т.к. нужный элемент уже будет передан в начале методе. Так что если у нас где-то заранее была сохранена форма, то у нас единнственный способ замены это:const target = form
- Если была передана ф-ия вида
(e) => {...}, тогда у нас единнственный способ замены это:const target = e.target
Подробнее про всё это можно прочитать тут
- Если была передана ф-ия вида
th.serialize()- заменям наnew FormData(target)$.ajax({TYPE, URL, DATA})- заменяем наfetch(URL, {method: TYPE, body: new FormData(target)}).done(...)- заменеяем на.then(res => res.json()).then(...)th.trigger("reset");- заменяем наtarget.reset();Ну и не забываем
return falseв конце, чтобы страница не перезагружалась после сабмита формы