jQuery serializeArray не включает кнопку отправки, которая была нажата
У меня есть форма, которая имеет две кнопки. Один для сохранения записи, а другой для отмены процедуры сохранения. Я использую rails.js
(обычный плагин AJAX / jQuery для тех из вас, кто не знает) javascript-файл, который работает с jQuery для ненавязчивых вызовов javascript / ajax. Когда я отправляю данные формы через ajax, я хочу, чтобы имя и значение кнопки, которую я нажал, отправляли вместе с остальными данными, чтобы я мог принять решение о том, что делать, на основе которой была нажата кнопка.
Метод в файле rails.js
использует .serializeArray()
для отправки данных формы на сервер. Проблема в том, что это не включает пару имя / значение кнопки, которую я нажал. На веб-сайте jQuery говорится, что они делают это специально (хотя мое мнение, что они должны):
«Метод .serializeArray()
использует стандартные правила W3C для успешных элементов управления, чтобы определить, какие элементы он должен включать, в частности, элемент нельзя отключить и должен содержать атрибут имени. Значение кнопки отправки не сериализуется, поскольку форма не была отправлена с использованием кнопка.”
- Может ли пиксель CSS быть дробным?
- Как загрузить org.w3c.dom.Document из XML в строку?
- вертикальное выравнивание текстового элемента в SVG
- Недопустимый селектор CSS заставляет исключить правило: что такое обоснование?
- Каков самый короткий путь для красивой печати org.w3c.dom.Document в stdout?
Как они могут предположить, что форма не была отправлена с помощью кнопки? Полагаю, это не имеет смысла и ошибочного предположения.
В соответствии с правилами W3C кнопка, которая была активирована для подачи формы, считается успешным контролем .
Поскольку разработчики jQuery решили сделать это специально, могу ли я предположить, что существует еще один метод, который НЕ исключает активированную кнопку в сериализации?
EDIT: Вот быстрый пример того, как может выглядеть моя форма …
$(document).ready(function() { $('#form').submit(function(e) { // put your breakpoint here to look at e var x = 0; }); });
- Является ли цитирование значения url () действительно необходимым?
- Почему проценты margin / padding в CSS всегда вычисляются по ширине?
- Существуют ли какие-либо опции стиля для выбора даты в формате HTML5?
- Можно ли использовать любую другую TAG внутри вместе с ?
- В чем смысл крахмальных полей CSS?
- В CSS Flexbox, почему нет свойств «justify-items» и «justify-self»?
- Является ли CSS3 официальным стандартом?
Это не так, поведение основано на событии submit
, а не на кнопке , например, при нажатии или вызове .submit()
в JavaScript. Вы смешиваете 2 понятия здесь: .serialize()
или .serializeArray()
могут иметь или не иметь ничего общего с нажатием кнопки – это просто отдельное событие в целом, они не связаны. Эти методы на более высоком уровне, чем это: вы можете сериализовать форму (или ее подмножество) в любое время по любой причине.
Однако вы можете добавить пару имени / значения submit, как обычная форма, отправляемая с этой кнопки, если вы отправляете с кнопки, например:
$("#mySubmit").click(function() { var formData = $(this).closest('form').serializeArray(); formData.push({ name: this.name, value: this.value }); //now use formData, it includes the submit button });
Я использую следующий fragment, в основном добавляет скрытый элемент с тем же именем
var form = $("form"); $(":submit",form).click(function(){ if($(this).attr('name')) { $(form).append( $("").attr( { name: $(this).attr('name'), value: $(this).attr('value') }) ); } }); $(form).submit(function(){ console.log($(this).serializeArray()); });
Это решение является «универсальным», так как в нем будут обрабатываться все ваши входные представления, передавая их как переменную формы при отправке.
$(document).ready(function(){ $('input:submit').each(function(){ $(this).click(function(){ var formData = $(this).closest('form').serializeArray(); formData.push({ name: $(this).attr('name'), value: $(this).val() }); }); }); });
var form = button.closest('form'); var serialize = form.serialize(); if (button.attr('name') !== undefined) { serialize += '&'+button.attr('name')+'='; }