jQuery не возвращает проверенное значение радио

ОБНОВЛЕНИЕ: Проблема более сложная. Похоже, это связано с тем, что заголовок аккордеона неправильно передает события .click и не имеет ничего общего с селектором :checked. Весь этот пример отлично работает в тестовом файле.

См. раздел Радио-вход в заголовке проблемы с аккордеоном ?BUG

У меня есть форма с несколькими радиоэлементами, каждое из которых называется "rx" (где x равно 1..3), применяется .buttonset(). с участием

e.g id=3

alert ($('input:radio[name=r'+id+']').val());
//returns value of the first radio in the set

alert ($('input:radio[name=r'+id+']:checked').val());
//returns 'undefined', even one of the radios is checked.

и я пробовал оба :checked')[0], :checked').get(0), :checked').attr('id')

Интересно, почему первый метод возвращает значение... Это как-то связано с добавлением классов/элементов .buttonset??

Любой совет приветствуется!

PS. $('input:radio[name=r'+id+']').get(0) возвращает [object HTMLInputElement], я думаю, так и должно быть. Но у этого объекта нет методов .html() или .val(). $('input:radio[name=r'+id+']:checked').get(0) все еще 'undefined'.

ППС. принудительная видимость для набора кнопок ui-helper-hidden-accessible не меняется «проверено» для исходных радиоэлементов. Я думаю, что вместо этого я могу использовать .ui-state-active для проверки активного радио ... Есть ли лучший способ?


person selytch    schedule 17.07.2010    source источник
comment
@selytch какой именно o/p тебе нужен?   -  person Shiva Srikanth Thummidi    schedule 17.07.2010
comment
Да, спасибо, что сказали, что у вас есть аккордеон....!   -  person redsquare    schedule 17.07.2010


Ответы (4)


Причина, по которой он не возвращает значение, заключается в том, что когда вы используете селектор :checked, если радио не выбрано, оно не будет частью набора результатов. Пример:

<input type="radio" name="r1" value="1" checked="checked" />
<input type="radio" name="r2" value="2" />

В настоящее время:

alert($('input:radio[name=r1]').val()); // alerts 1
alert($('input:radio[name=r1]:checked').val()); // alerts 1
alert($('input:radio[name=r2]').val()); // alerts 2
alert($('input:radio[name=r2]:checked').val()); // alerts undefined as the button is not selected
person Darin Dimitrov    schedule 17.07.2010
comment
Я понимаю, что это должно работать так, может ли добавление .buttonset испортить ситуацию? - person selytch; 17.07.2010

Попробуй это-

$("input[name='radio_name']:checked").val();
person Sadat    schedule 17.07.2010
comment
@ устарел в jQuery 1.2 и удален в jQuery 1.3 — api.jquery.com/category /селекторы/селекторы атрибутов - person Russ Cam; 17.07.2010

Прочитайте страницу о селекторах, особенно эту http://api.jquery.com/attribute-starts-with-selector/

alert ($(':radio[name^=r]:checked').val());

должен возвращать значение отмеченной кнопки или значение undefined, если ничего не выбрано.

person Yanick Rochon    schedule 17.07.2010
comment
Я знаю, что это кажется простой проблемой, но может ли .buttonset() влиять на вещи или это моя опечатка где-то в коде??? - person selytch; 17.07.2010
comment
хм... прочитайте страницу выбора, которую я вам дал. предлагаемый селектор в этом решении будет соответствовать «r», «r1», «r2», «r3», «rWhatever» и т. д. Просто замените селектор в соответствии с вашими потребностями. Проблема не в JQuery, а в том, как вы его используете. Обычно это называется RTFM. - person Yanick Rochon; 17.07.2010

Я написал плагин jQuery для установки и получения значений переключателей. Он также учитывает событие «change» для них.

(function ($) {

    function changeRadioButton(element, value) {
        var name = $(element).attr("name");
        $("[type=radio][name=" + name + "]:checked").removeAttr("checked");
        $("[type=radio][name=" + name + "][value=" + value + "]").attr("checked", "checked");
        $("[type=radio][name=" + name + "]:checked").change();
    }

    function getRadioButton(element) {
        var name = $(element).attr("name");
        return $("[type=radio][name=" + name + "]:checked").attr("value");
    }

    var originalVal = $.fn.val;
    $.fn.val = function(value) {

        //is it a radio button? treat it differently.
        if($(this).is("[type=radio]")) {

            if (typeof value != 'undefined') {

                //setter
                changeRadioButton(this, value);
                return $(this);

            } else {

                //getter
                return getRadioButton(this);

            }

        } else {

            //it wasn't a radio button - let's call the default val function.
            if (typeof value != 'undefined') {
                return originalVal.call(this, value);
            } else {
                return originalVal.call(this);
            }

        }
    };
})(jQuery);

Поместите код в любом месте, чтобы включить надстройку. Тогда наслаждайтесь! Он просто переопределяет функцию val по умолчанию, ничего не ломая.

Вы можете посетить этот jsFiddle, чтобы попробовать его в действии и посмотреть, как он работает.

http://jsfiddle.net/ffMathy/MN856/

person Mathias Lykkegaard Lorenzen    schedule 17.04.2013