Сериализация jQuery скрытой (display: none) формы elemens не работает.Обходной путь? - PullRequest
3 голосов
/ 06 ноября 2011

У меня следующая проблема:

У меня есть форма, которую мне нужно сериализовать, но я использую javascript, чтобы изменить внешний вид полей выбора.Это означает, что реальные поля выбора скрыты с помощью display: none.Моя проблема в том, что jQuery распознает скрытые выборки, но сериализует только первое значение, а не выбранное.

<select name="publish"><br> <option value="1">yes</option><br> <option value="2" selected="selected">no</option><br> </select>

jQuery.serialzie: publish = 1

, поэтому он дает мне первое и не правильное значение.

Есть идеи для обхода?

Решения
ХорошоКак уже упоминал RobW, лучшее решение, вероятно, состоит в том, чтобы просто позволить JavaScript выбрать желаемую опцию, установив selectElement.selectedIndex = 5

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

(function($) {
$.fn.serializer = function() {
    var toReturn    = [];
    var elements         = $(this).find(':input').get();
    $.each(elements, function() {
        if (this.name && !this.disabled && (this.checked || /select|textarea/i.test(this.nodeName) || /text|hidden|password/i.test(this.type))) 
        {
            var val = $(this).val();
            // if is select, check selected
            if(this.nodeName == "SELECT")
            {
                val = $(this).find('option:selected').val();    
            }
            toReturn.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( val ) );
        }
    });
    return toReturn.join("&").replace(/%20/g, "+");
}
})(jQuery);

1 Ответ

5 голосов
/ 06 ноября 2011

Если проблема вызвана скрытыми элементами, временно покажите их перед сериализацией:

var $form = $('#myForm');
var hidden = $form.find(':hidden'); // Select all hidden elements
hidden.show();                      // Show them
var string = $form.serialize();     // Serialize form
hidden.hide();                      // Hide them again

Редактировать: похоже, вы пытаетесь выбрать опцию, установив атрибут selected=selected. Вы должны использовать selectedIndex, чтобы изменить выбранную опцию:

var select = $("#myselect")[0]; //DOM element
select.selectedIndex = 5;       //Example, select 6th option
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...