Подтвердить что ты не робот

Удалите пустые значения из параметров формы перед отправкой

У меня есть javascript, который ловит изменения в форме, а затем вызывает форму регулярной функции отправки. Форма представляет собой форму GET (для поиска), и у меня есть множество пустых атрибутов, которые появляются в параметрах. То, что я хотел бы сделать, это удалить все пустые атрибуты перед отправкой, чтобы получить более чистый URL-адрес: например, если кто-то меняет тему "субъект" на "английский", я хочу, чтобы их поисковый URL был

http://localhost:3000/quizzes?subject=English

а не

http://localhost:3000/quizzes?term=&subject=English&topic=&age_group_id=&difficulty_id=&made_by=&order=&style=

как это сейчас. Это просто чисто для того, чтобы иметь более чистый и более значимый URL-адрес для ссылок на закладки и для людей и т.д. Итак, мне нужно что-то в этом роде, но это неправильно, поскольку я не редактирую действительную форму но объект js, сделанный из параметров формы:

  quizSearchForm = jQuery("#searchForm");
  formParams = quizSearchForm.serializeArray();
  //remove any empty fields from the form params before submitting, for a cleaner url
  //this won't work as we're not changing the form, just an object made from it.
  for (i in formParams) {
    if (formParams[i] === null || formParams[i] === "") {
      delete formParams[i];
    }
  }
  //submit the form

Я думаю, что я близок с этим, но мне не хватает того, как редактировать фактические атрибуты формы, а не создавать другой объект и редактировать это.

благодарен за любой совет - max

EDIT - SOLVED - благодаря многим людям, которые опубликовали об этом. Вот что у меня есть, что, кажется, отлично работает.

function submitSearchForm(){
  quizSearchForm = jQuery("#searchForm");
  //disable empty fields so they don't clutter up the url
  quizSearchForm.find(':input[value=""]').attr('disabled', true);
  quizSearchForm.submit();
}
4b9b3361

Ответ 1

Входы с атрибутом disabled, установленным в true, не будут отправлены с формой. Итак, в одной строке jQuery:

$(':input[value=""]').attr('disabled', true);

Ответ 2

$('form#searchForm').submit(function() {
    $(':input', this).each(function() {
        this.disabled = !($(this).val());
    });
});

Ответ 3

Вы не можете сделать это таким образом, если вы вызываете метод формы submit; который представит всю форму, а не массив, который у вас был создан jQuery.

Что вы можете сделать, это отключить поля формы, которые являются пустыми до отправки формы; отключенные поля исключаются из представления формы. Поэтому пройдите элементы формы и для каждого пустого, отключите его, а затем вызовите метод submit в форме. (Если его целью является другое окно, вы захотите вернуться и снова включить поля. Если его целью является текущее окно, это не имеет значения, страница будет заменена в любом случае.)

Ответ 4

Ну, одна вещь, которую вы могли бы сделать, - отключить пустые входы, прежде чем вызывать "serializeArray"

$('#searchForm').find('input, textarea, select').each(function(_, inp) {
  if ($(inp).val() === '' || $(inp).val() === null)
    inp.disabled = true;
  }
});

Процедура "serializeArray()" не будет включать в свои результаты. Теперь вам может потребоваться вернуться и снова включить их, если сообщение формы не приведет к полностью обновленной странице.

Ответ 5

Возможно, некоторые из предлагаемых решений работали в тот момент, когда был задан вопрос (март 2010 г.), но сегодня, в августе 2014 г., решение о отключении пустых входов просто не работает. Отключенные поля также отображаются в моем Google Chrome. Тем не менее, я попытался удалить атрибут "name", и он работал нормально!

$('form').submit(function(){
    $(this).find('input[name], select[name]').each(function(){
        if (!$(this).val()){
            $(this).removeAttr('name');
        }
    });
});

Update: Хорошо, возможно, причина в том, что отключение полей не сработало для меня, это не то, что с 2010 года изменилось. Но все еще не работает в моем Google Chrome. Я не знаю, может быть, это просто версия Linux. В любом случае, я думаю, что удаление имени attr лучше, поскольку, несмотря на то, что политика берет браузер об отключенных полях, нет способа отправить параметры, если имя attr отсутствует. Другим преимуществом является то, что обычно отключение полей подразумевает некоторые изменения стиля, и не приятно видеть изменение стиля в форме за секунду до того, как форма будет окончательно отправлена. Существует также недостаток, как упомянул Макс Уильямс в комментариях, так как решение remove atr не подходит для переключения. Вот способ избежать этой проблемы:

$('form').submit(function(){
    $(this).find('input[name], select[name]').each(function(){
        if (!$(this).val()){
            $(this).data('name', $(this).attr('name'));
            $(this).removeAttr('name');
        }
    });
});

function recoverNames(){
    $(this).find('input[name], select[name]').each(function(){
        if ($(this).data('name')){
            $(this).attr('name', $(this).data('name'));
        }
    });
}

Однако, я думаю, что это не очень распространенный случай, поскольку мы отправляем форму, поэтому предполагается, что нет необходимости восстанавливать недостающее имя attrs.

Ответ 6

Ваша проблема помогла мне разобраться в моей ситуации, которая немного отличается - так, может быть, кто-то может извлечь из нее выгоду. Вместо прямой отправки формы мне нужно было предотвратить сбор пустых элементов формы в сериализованный массив, который затем отправлен через AJAX.

В моем случае мне просто нужно было пропустить элементы формы и отключить все, что было пустым, а затем собрать остатки в массив следующим образом:

// Loop through empty fields and disable them to prevent inclusion in array
$('#OptionB input, select').each(function(){
    if($(this).val()==''){
        $(this).attr('disabled', true); 
    }
});

// Collect active fields into array to submit
var updateData = $('#OptionB input, select').serializeArray();

Ответ 7

Или сериализовать, очистить пустые ключи = пары значений с регулярным выражением и вызвать window.location:

$("#form").submit( function(e){
    e.preventDefault();
    //convert form to query string, i.e. a=1&b=&c=, then cleanup with regex
    var q = $(this).serialize().replace(/&?[\w\-\d_]+=&|&?[\w\-\d_]+=$/gi,""),
    url = this.getAttribute('action')+ (q.length > 0 ? "?"+q : "");
    window.location.href = url;
});

Ответ 8

Другим подходом, который я всегда рекомендую, является выполнение на стороне сервера, поэтому вы можете:

  • Правильно проверьте входные данные.
  • Установить значения по умолчанию
  • Измените входные значения при необходимости
  • Имейте чистый URL-адрес или дружественный URL-адрес, например "/quizzes/english/level-1/"

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