2011-12-16 2 views
11

Info: JQuery 1.6.0 HTML флажок:JQuery флажок всегда возвращает 'неопределенный'

Сначала я удостоверился JQuery загружено:

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

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

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

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

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

Но это даже не вызывает всплеск.

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

Edit: Я пробовал:

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

Предупреждение (идентификатор) дает мне правильный ID, но тревога (ReturnValue) возвращает неопределенное значение.

Я также попытался:

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

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

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

+1

'jQuery (" # ". Id)' просто неправильно. Вы запрашиваете свойство 'id' строки' '#" '. – RightSaidFred

+0

Черт, ты прав! Это мой первый опыт работы с javascript, я всегда работал с PHP, поэтому я привык к «.». Вы совершенно правы, это даже исправило мою проблему, огромное вам спасибо! – pbond

ответ

13
  • Если вы используете 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 в этом вопросе было бы полезно.

4

Попробуйте это:

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

Update

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

Обертывание кода в самопроизвольной анонимной функции $ (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»?

+0

У меня теперь есть следующий код: 'function isChecked (id) { if (jQuery) { alert (" загружен "); } $ (функция() { оповещения (идентификатор); вар ReturnValue = $ ("#" идентификатор) .attr ("проверено");. оповещения (ReturnValue); }); ' , которые до сих пор возвращает undefined. Предупреждение (id) оповещает правильный идентификатор. Кроме того, когда я нажимаю submit (страница загружается уже тогда, конечно), она все равно возвращает undefined. – pbond

+0

, пожалуйста, публикуйте обновления кода в исходном вопросе, их трудно прочитать в комментариях. – danludwig

+0

Привет, он предупреждает: «Есть много элементов с совпадением id: 0». – pbond

2

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

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

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 формы, проверяемый атрибут логический атрибут, что означает, что соответствующее свойство является истинным, если атрибут присутствует вообще, даже если, например, атрибут не имеет значения или пустого значения строки. Предпочтительный кросс-браузер, совместимый способ определить, если установлен флажок, чтобы проверить на «truthy» значение на имущество элемента с помощью одного из следующих действий:

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, установите/снимите флажок в приведенном ниже примере.

Смежные вопросы