Mesuti
@Mesuti

Как отдельной кнопкой отправить форму через общий скрипт XMLHttpRequest и не потерять контекст у формы?

Привет!
На сайте все формы отправляются так:

Типовая форма:
<form class="enter">
    <input type="text">
    <button type="submit">Enter</button>
</form>


Отправка:
// берем форму
const enterForm = document.querySelector('.enter');

// вешаем на форму событие при отправке
enterForm.addEventListener('submit', sender);


// УНИВЕРСАЛЬНЫЙ СКРИПТ ОТПРАВКИ ВСЕХ ФОРМ
function sender(e) {
    e.preventDefault();

   // Берем все данные из отправляемой формы, здесь она в this
    var formData = new FormData(this);

   // Собираем объект из данных формы
    formData.forEach(function (value, key) {
        object[key] = value;
    });
    var xhr = new XMLHttpRequest();
    xhr.open('POST', './func/functions.php');
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

   // Отправляем объект в виде JSON
    xhr.send('param=' + JSON.stringify(object));
    xhr.addEventListener("readystatechange", () => {
           console.log(xhr.response);
        }
    });
}


Однако, столкнулся с проблемой потери this из лексического пространства, если отправлять форму кнопкой вне формы:
<form class="otherForm">
    <input type="text">
</form>
<button class="otherBtn">Other</button>


ВОПРОС: как сохранить this при отправке формы через общий XMLHttpRequest, если кнопка отправки вне формы ?


Безуспешно пробовал через цепочку функций. Кнопка вызывает отправку формы
document.querySelector('.otherBtn').addEventListener('click', otherSend);
function otherSend() {
   document.querySelector('.otherForm').submit();
} 

document.querySelector('.otherForm').addEventListener('click', sender);
  • Вопрос задан
  • 143 просмотра
Решения вопроса 2
SeaInside
@SeaInside
15 лет пилю все эти штуки
Привязанное событие "submit" не вызывается, если мы руками триггерим "form.submit()".

Как вариант решения - в каждую форму добавить скрытую кнопку, и чтобы стриггерить submit, тыкать эту кнопку вместо прямого вызова .submit()

У меня, честно говоря, нет ощущения, что это идеальное решение - костыль какой-то, но этот костыль определённо лучше того, что предлагает сам автор.

Ответ написан
Mesuti
@Mesuti Автор вопроса
ОТВЕТ
Использовать .bind
Тогда у общего скрипта отправки данных нужный this - отправляемая форма

Вариант из моего примера:
// otherForm - переменная с отдельной формой
// otherBtn - переменная с отдельной кнопкой  
otherBtn.addEventListener('click', sender.bind(otherForm))


https://qna.habr.com/answer?answer_id=489919#answe...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы