Флажок jQuery всегда возвращает 'undefined'

Информация: jQuery 1.6.0 HTML:

Сначала я убедился, что jQuery загружен:

if(jQuery) {
    alert("loaded");
}

И это так, оно загружено. Затем, по крайней мере, после этой строки я использую:

var returnvalue = jQuery("#mycheckbox").attr("checked");
alert(returnvalue);

Это по какой-то причине всегда предупреждает "undefined". Я на 100% уверен, что ID существует. Я также пробовал следующий метод:

jQuery("#mycheckbox").find('input[type="checkbox"]').each(function(){
    alert("foo");
    if (jQuery(this).is(":checked")) 
        ReturnVal = true;
});

Но это даже не вызывает предупреждения.

Что я делаю неправильно? Я, безусловно, эксперт по jQuery или Javascript, но это должно работать... правильно?

Изменить: Я пробовал:

jQuery(document).ready(function() {
    alert(id);
    var returnvalue = jQuery("#" . id).prop("checked");
    alert(returnvalue);
});

Предупреждение (id) дает мне правильный идентификатор, но alert (returnvalue) возвращает undefined.

Я также пробовал:

if(jQuery) { 
    alert("loaded");
} 
jQuery(function() {
    alert(id);
    var returnvalue = jQuery("#" . id).attr("checked");
    alert(returnvalue);
});

Тот же результат

Edit2: После использования .prop И добавьте id с "+" вместо ".". (Привычка PHP), он работает. Спасибо всем за вашу помощь!

Ответ 1

  • Если вы используете jQuery 1.6 или новее, используйте prop() вместо attr():

var returnvalue = jQuery("#mycheckbox").prop("checked");

Это связано с тем, что если вы не указали явный атрибут checked с этим элементом, то атрибут undefined, хотя свойство будет иметь по умолчанию.


  • Вам нужно удалить .find():
jQuery("#mycheckbox").each(function(){
    alert("foo");
    if (jQuery(this).is(":checked")) 
        ReturnVal = true;
});

Включение HTML-кода в вопрос будет полезным.

Ответ 2

Попробуйте следующее:

if(jQuery) {
    alert("loaded");
}
$(function() {
    var returnvalue = $("#mycheckbox").attr("checked");
    alert(returnvalue);
});

Обновление

Если ваш script находится в верхней части страницы, он выполняется до загрузки HTML. За это время attr ('checked') равен undefined.

Обертывая код в самоисполняющейся анонимной функции $(function() {...}), ваш код выполняется после загрузки HTML.

Ответить на комментарий

Ваш код:

function isChecked(id)
{
    if(jQuery) { alert("loaded"); } 
    $(function() {
        alert(id);
        var returnvalue = $("#" + id).attr("checked"); 
        alert(returnvalue); 
    });
}

Попробуйте это. что он предупреждает?

function isChecked(id)
{
    if(jQuery) { alert("loaded"); } 
    alert(id);
    alert('there are this many elements with matching id: ' + $("#" . id).length);
    var returnvalue = $("#" + id).attr("checked"); 
    alert(returnvalue); 
}

Означает ли 3-го оповещения "есть много элементов с совпадающим идентификатором: 0"?

Ответ 3

Используйте .prop $('#checkbox1').prop('checked'), jQuery 1.6 +

В отношении логических атрибутов рассмотрим элемент DOM, определенный разметкой HTML <input type="checkbox" checked="checked" />, и предположим, что он находится в переменной JavaScript с именем elem:

elem.checked    true (Boolean) Will change with checkbox state
$(elem).prop("checked") true (Boolean) Will change with checkbox state
elem.getAttribute("checked")    "checked" (String) Initial state of the checkbox; does not change
$(elem).attr("checked")(1.6)    "checked" (String) Initial state of the checkbox; does not change
$(elem).attr("checked")(1.6.1+) "checked" (String) Will change with checkbox state
$(elem).attr("checked")(pre-1.6)    true (Boolean) Changed with checkbox state

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

if ( elem.checked )
if ( $(elem).prop("checked") )
if ( $(elem).is(":checked") )

Если вы используете jQuery 1.6, код if ( $(elem).attr("checked") ) будет извлекать фактический атрибут контента, который не изменяется, когда флажок установлен и не установлен. Он предназначен только для хранения значения по умолчанию или начального значения проверяемого свойства. Чтобы поддерживать обратную совместимость, метод .attr() в jQuery 1.6.1+ будет извлекать и обновлять свойство для вас, поэтому код для логических атрибутов не требуется для изменения на .prop(). Тем не менее, предпочтительный способ получить проверенное значение - это один из вариантов, перечисленных выше. Чтобы узнать, как это работает в последнем jQuery, установите/снимите флажок в приведенном ниже примере.