Приветствия.
Я просматривал документы jQuery , и я думаю, что мы можем сделать это в одной строке с помощью селекторы :
$("#myForm :input[value!='']").serialize() // does the job!
, Очевидно, #myForm получает элемент с идентификатором "myForm", но что было менее очевидно для меня, сначала был то, что пробел необходим между #myForm и: вход, как это потомок оператор.
: вход соответствия весь вход, текстовая область, выбор и элементы кнопки.
[значение! =, ''] атрибут не равный фильтр. Странное (и полезный) вещь то, что все: вход типы элемента имеют атрибуты значения, даже выбирает и флажки и т.д.
Наконец, чтобы также удалить исходные данные, где значение 'было' (как упомянуто в вопросе):
$("#myForm :input[value!=''][value!='.']").serialize()
В этом сопоставлении случая, т.е. размещение двух селекторов атрибута друг рядом с другом , подразумевает И. Используя запятую подразумевает ИЛИ. Извините, если это очевидно для людей CSS!
Вы могли сделать это с regex...
var orig = $('#myForm').serialize();
var withoutEmpties = orig.replace(/[^&]+=\.?(?:&|$)/g, '')
Тесты:
orig = "a=&b=.&c=&d=.&e=";
new => ""
orig = "a=&b=bbb&c=.&d=ddd&e=";
new => "b=bbb&d=ddd&" // dunno if that trailing & is a problem or not
Я посмотрел бы на исходный код для jQuery. В строке последней версии 3287.
я мог бы добавить в функциях "serialize2" и "serializeArray2". конечно, назовите их чем-то meaniful.
Или лучший путь должен был бы записать что-то для вытаскивания неиспользованного Вара из serializedFormStr. Некоторый regex, который ищет = & в середине строки или заканчивающийся в = Какие-либо regex мастера вокруг?
ОБНОВЛЕНИЕ: мне нравится ответ rogeriopvl лучше (+1)... тем более, что я не могу найти хорошие regex инструменты прямо сейчас.
Вы могли бы хотеть посмотреть на .each () функция jQuery, которая позволяет Вам выполнять итерации через каждый элемент селектора, таким образом, этот путь, которым можно пойти, проверяет каждое поле ввода и видит, пусто ли это или не, и затем удалите его из формы с помощью element.remove (). После этого можно сериализировать форму.
Альтернатива решение Rich:
$('#form').submit(function (e) {
e.preventDefault();
var query = $(this).serializeArray().filter(function (i) {
return i.value;
});
window.location.href = $(this).attr('action') + (query ? '?' + $.param(query) : '');
});
Объяснения:
.submit()
рычаги на форму submit
событие e.preventDefault()
препятствует тому, чтобы форма отправила .serializeArray()
, дает нам представление в виде массива строки запроса, которая была отправленной. .filter()
удаляет falsy (включая пустой) значения в том массиве. $.param(query)
создает сериализированное и совместимое URL представление нашего обновленного массива window.location.href
отправляет запрос