2011-12-16 17 views
11

Info: jQuery 1.6.0 HTML wyboru:jQuery wyboru zawsze zwraca 'niezdefiniowane'

Najpierw zrobiłem pewien jQuery jest załadowany:

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

I to jest sprawa, jest załadowana. Następnie immidiately linia potem używać:

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

to, z jakiegoś powodu, zawsze Alerty „niezdefiniowane”. Jestem w 100% pewien, że identyfikator istnieje. Próbowałem również następującej metody:

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

Ale to nawet nie pojawi się alert.

Co robię źle? Jestem zdecydowanie ekspertem jQuery lub JavaScript, ale to powinno działać ... prawda?

Edit: Próbowałem:

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

Alert (id) daje mi prawidłowego identyfikatora, ale alert (returnvalue) zwraca niezdefiniowane.

Próbowałem również:

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

sam wynik

Edit2: Po użyciu .prop I dołączanie identyfikatora ze znakiem '+' zamiast '' (Zwyczaj PHP), działa. Dziękuję wszystkim za pomoc!

+1

'jQuery (" # ". Id)' jest po prostu błędne. Pytasz o właściwość 'id' ciągu' '#" '. – RightSaidFred

+0

Cholera, masz rację! Po raz pierwszy pracuję z javascript, zawsze pracowałem z PHP, więc jestem przyzwyczajony do ".". Masz całkowitą rację, to nawet naprawiło mój problem, dziękuję bardzo niewiarygodnie! – pbond

Odpowiedz

13
  • Jeśli używasz jQuery 1.6 czy później użyć prop() zamiast attr():

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

To dlatego, jeśli nie zawierają wyraźnego checked atrybut z element, wówczas atrybutem jest undefined, chociaż właściwość będzie miała domyślną wartość.


  • Trzeba wyeliminować .find():
jQuery("#mycheckbox").each(function(){ 
    alert("foo"); 
    if (jQuery(this).is(":checked")) 
     ReturnVal = true; 
}); 

Łącznie swój HTML w kwestii byłoby pomocne.

4

Spróbuj tego:

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

Aktualizacja

Jeśli skrypt jest w górnej części strony, wykonuje przed HTML jest załadowany. W tym czasie attr ("sprawdzone") jest niezdefiniowane.

Poprzez zawijanie kodu w wykonywalnej anonimowo funkcji $ (function() {...}), twój kod jest wykonywany po załadowaniu HTML.

Odpowiedź na komentarz

Twój kod:

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

Spróbuj tego. co to alarmuje?

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); 
} 

Czy trzecie ostrzeżenie mówi "istnieje wiele elementów o zgodnym id: 0"?

+0

Mam teraz następujący kod: 'funkcja isChecked (id) { jeśli (jQuery) { alert (" załadowany "); } $ (function() { alert (id); var returnvalue = $ ("#" id) .attr ("sprawdzone");. alert (returnvalue); }); ' który nadal zwraca niezdefiniowane. Alert (id) ostrzega o prawidłowym ID. Co więcej, po naciśnięciu przycisku "prześlij" (strona jest już załadowana, a następnie oczywiście), wciąż zwraca wartość nieokreśloną. – pbond

+0

proszę pisać aktualizacje kodu w oryginalnym pytaniu, są one trudne do odczytania w komentarzach. – danludwig

+0

Witaj, to ostrzega, "jest tyle elementów z pasującym id: 0". – pbond

2

Użyj .prop$('#checkbox1').prop('checked'), jQuery 1.6 +

chodzi logicznych atrybuty, należy rozważyć elementu DOM określony przez znaczników HTML <input type="checkbox" checked="checked" />, i zakładamy, że jest w zmiennej JavaScript o nazwie 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 

Według specyfikacji W3C formy, gdy badana cecha jest atrybut boolowski, co oznacza, że ​​odpowiednia właściwość ma wartość true, jeśli atrybut jest obecny w ogóle - nawet jeśli na przykład atrybut nie ma wartości lub pustą wartość ciągu. Preferowanym sposobem cross-browser-kompatybilne, aby określić, czy jest zaznaczone pole wyboru jest sprawdzenie na „truthy” wartości na własność tego elementu przy użyciu jednej z następujących opcji:

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

Jeśli jQuery 1.6, kod if ($(elem).attr("checked")) będzie pobrać rzeczywisty atrybut zawartości, który nie ulega zmianie, ponieważ pole wyboru jest zaznaczone i odznaczone. Jest przeznaczony tylko do przechowywania domyślnej lub początkowej wartości sprawdzonej właściwości. Aby zachować kompatybilność wsteczną, metoda .attr() w jQuery 1.6.1+ będzie pobierać i aktualizować właściwość dla ciebie, więc żaden kod dla atrybutów boolean nie musi być zmieniony na .prop(). Niemniej jednak preferowanym sposobem pobrania sprawdzonej wartości jest jedna z opcji wymienionych powyżej. Aby zobaczyć, jak to działa w najnowszym jQuery, zaznacz/odznacz pole wyboru w poniższym przykładzie.