I believe this is the problem:
input[type="radio"][checked=true]
The correct value for the "checked" attribute is "checked", not "true"
(don't ask me why; I think it's a stinker), so jQuery comes up
empty-handed.
Whereas the other way you're approaching this:
if (this.checked)
... works because you're testing for a (boolean) property that is
assigned by jQuery *after* it has used your more general selector to
create a list of objects.
A simpler way to approach this would be to use some of jQuery's
built-in selector goodness:
$('#selected_courses .course input:radio:checked')
However, note that you drop '.course' from this if there are never any
other radio buttons within #selected_courses but outside of a .course
div.
On Mon, Dec 7, 2009 at 4:40 PM, Beardsley Ruml <[email protected]> wrote:
> Sorry that this take a while to demonstrate but it's a complete puzzle (to
> me)!
>
> I would like to determine whether there are any checked radio buttons within
> the
> <div> "selected_courses" in the following HTML:
>
> <div id="selected_courses>
> <div class="course">
> <input type="radio" name="1st" .. />
> [ 5 more radio buttons]
> </div>
> [ 2 more courses ]
> </div>
>
> When the code below is executed, there are 3 selected courses; since
> each course has six radio buttons, there are 18 radio buttons. When I
> add the further qualification to select only the checked radio buttons,
> the reponse is zero buttons (although there are in fact 3 checked buttons).
>
> However, if I approach the search in another more roundabout way -- by
> examining
> each of the radio buttons in turn to determine how many are checked, the
> answer
> is the correct one: 3 (one within each course).
>
> Notice that within the following each loop, I look among the
> selected_courses
> for an input element with a specified name which is checked and *that*
> doubly
> conditioned selector works as expected; that is, the if statement is
> executed.
>
> So why does the double condition on the "input" selector fail the first time
> and succeed the second time????
>
> Perhaps relevant:
> When I replace:
> $('#selected_courses .course input[type="radio"][checked=true]')
> with
> $sel_courses.find('input[type="radio"][checked=true]')
> the selection works. Is there some difference between three levels of
> selection criteria without an initial jQuery object and using find() to
> apply a single criterion to an existing jQuery object?
>
> Code:
> ====
> if (ui.panel.id == "final_ordered_list") {
> console.log("Clicked on Final Ordered List tab:");
> var $sel_courses = $("#selected_courses .course");
> console.log("Have " + $sel_courses.length + " selected courses.");
> var $radio_buttons = $('#selected_courses .course input[type="radio"]');
> console.log("Have " + $radio_buttons.length + " radio buttons.");
> var $chked_radio_buttons = $('#selected_courses .course
> input[type="radio"][checked=true]');
> console.log("Got " + $chked_radio_buttons.length + " straight checked radio
> buttons.");
> var checked_radio_buttons = 0;
> $radio_buttons.each(function() { if (this.checked) checked_radio_buttons +=
> 1; });
> console.log("Got " + checked_radio_buttons + " roundabout checked radio
> buttons.");
> if (checked_radio_buttons > 0) {
> console.log(" " + $sel_courses.length + " selected courses");
> console.log(" " + checked_radio_buttons + " checked radio buttons");
> $.each(["1st","2nd","3rd","4th","5th","6th"], function(index,
> curr_ordinal) {
> // if there is a course with the curr_ordinal radio button checked
> // (can only be one), then copy to Final Ordered List;
> var $checked_radio_button = $sel_courses.find('input[name="' +
> curr_ordinal + '"][checked=true]')
> if ($checked_radio_button.length > 0) {
> // do something;
> }
> });
> });
> });
>
> Console output:
> ==============
> Clicked on Final Ordered List tab:
> Have 3 selected courses.
> Have 18 radio buttons.
> Got 0 straight checked radio buttons.
> Got 3 roundabout checked radio buttons.
> 3 selected courses
> 3 checked radio buttons
>
> Many thanks for any insights into what's happening!
>
> B Ruml
>
>