Проблема с jQuery 1.6.4 и RadioButtonList

#javascript #jquery #radio-button

#javascript #jquery #переключатель

Вопрос:

Переход с jQuery 1.4.4 на jquery 1.6.4 привел к нарушению моего кода, связанного с radiobuttonlist.

Вот пример кода и шаги для воспроизведения странного поведения:

Шаги для воспроизведения:

1: Радио A уже выбрано.

2. Выберите радио B

3. Введите что-нибудь в текстовое поле и выделите вкладку.

Вы увидите: A проверяется, а B проверяется.

Итак, что именно изменилось с 1.6.4 на 1.4.4, что вызывает его сбой?

 <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
        <script src="http://ajax.microsoft.com/ajax/jquery/jquery-1.6.4.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        function txtchanged(tb) {
            $(".rbl").find("input[type='radio']").each(function () {
                alert($(this).val()   " "   $(this).attr("checked"));
            });
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:RadioButtonList ID="RadioButtonList1" runat="server" CssClass="rbl">
        <asp:ListItem Text="A" Value="A" Selected="True" />
         <asp:ListItem Text="B" Value="B" />
    </asp:RadioButtonList>
    <asp:TextBox ID="tb" runat="server" CssClass="tb" onblur="txtchanged(this)"></asp:TextBox>
    </form>
</body>
</html>
  

Ответ №1:

Цитата OP:

Итак, что именно изменилось с 1.6.4 на 1.4.4, что вызывает его сбой?

Переключатель checked — это не атрибут, это свойство. jQuery был обновлен в версии 1.6, чтобы исправить эту семантическую ошибку.

Измените это…

 .attr("checked")
  

к этому…

 .prop("checked")
  

ПРАВКИ:

Что касается комментария OP о том, почему jQuery не является обратно совместимым:

1) Это добавило бы к коду накопление наворотов.

2) Быть «обратно совместимым» было бы практически то же самое, что вообще не устранять эту проблему.

Смотрите эту страницу, чтобы прочитать примечания к выпуску для каждой версии jQuery.

Также измените это…

 .removeAttr('checked')
  

к этому…

 .removeProp('checked')
  

Комментарии:

1. да, я понял это, но тогда вопрос в том, что мне нужно будет найти и изменить все такие экземпляры и убедиться, что больше ничего не сломается. Почему это не совместимо с обратной связью. Я даже заметил, что removeAttr(‘checked’) в моем коде также облажался при использовании 1.6.4.

2. @gbs, смотрите мой обновленный ответ. Вы задаете только один очень конкретный вопрос, и я ответил на него правильно. Ваш последующий вопрос заключается в том, почему многие люди придерживаются своей текущей версии jQuery. Я не могу знать, какие другие экземпляры или ситуации могут сломаться на вашем конкретном сайте, но перейдите по ссылке , которую я разместил, чтобы прочитать о том, что еще изменилось с версии 1.4.4.