jQuery serializeArray не включает кнопку отправки, которая была нажата

У меня есть форма, которая имеет две кнопки. Один для сохранения записи, а другой для отмены процедуры сохранения. Я использую rails.js (обычный плагин AJAX / jQuery для тех из вас, кто не знает) javascript-файл, который работает с jQuery для ненавязчивых вызовов javascript / ajax. Когда я отправляю данные формы через ajax, я хочу, чтобы имя и значение кнопки, которую я нажал, отправляли вместе с остальными данными, чтобы я мог принять решение о том, что делать, на основе которой была нажата кнопка.

Метод в файле rails.js использует .serializeArray() для отправки данных формы на сервер. Проблема в том, что это не включает пару имя / значение кнопки, которую я нажал. На веб-сайте jQuery говорится, что они делают это специально (хотя мое мнение, что они должны):

«Метод .serializeArray() использует стандартные правила W3C для успешных элементов управления, чтобы определить, какие элементы он должен включать, в частности, элемент нельзя отключить и должен содержать атрибут имени. Значение кнопки отправки не сериализуется, поскольку форма не была отправлена ​​с использованием кнопка.”

Как они могут предположить, что форма не была отправлена ​​с помощью кнопки? Полагаю, это не имеет смысла и ошибочного предположения.

В соответствии с правилами W3C кнопка, которая была активирована для подачи формы, считается успешным контролем .

Поскольку разработчики jQuery решили сделать это специально, могу ли я предположить, что существует еще один метод, который НЕ исключает активированную кнопку в сериализации?

EDIT: Вот быстрый пример того, как может выглядеть моя форма …

      $(document).ready(function() { $('#form').submit(function(e) { // put your breakpoint here to look at e var x = 0; }); });    

Это не так, поведение основано на событии 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')+'='; } 
Interesting Posts

Подстрока T-SQL – разделение имени и фамилии

Как OSX должен работать без мыши?

Есть ли способ полностью удалить Chrome OS на chromebook – и установить Linux (не с двойной загрузкой)

16 ГБ моей 32 ГБ памяти непригодны для использования, отмеченные как «зарезервированные аппаратные средства»

Excel – Как объединить строки из 2 таблиц на основе общего столбца?

Скопировать структуру каталогов без копирования файлов в Mac OS X

Добавление jQuery в PrimeFaces приводит к тому, что Uncaught TypeError по всему месту

Как отклонить индикатор выполнения, даже если нет представления о заполнении в FirebaseListAdapter?

Синхронизировать локальные и удаленные каталоги с помощью rsync?

В любом случае, чтобы создать SMTP-сервер в Windows 7?

Как проверить, пусто ли текстовое поле или нет в быстрой

Как получить аудио 5.1 в Google Chrome?

Совместимость с RAM

Почему System.Timers.Timer выживает GC, но не System.Threading.Timer?

Как остановить Proguard от удаления параметров типа?

Давайте будем гением компьютера.