views:

75

answers:

2

Using this as a simplified example, assume I have a table that has some radio buttons in it followed by a div element with a link in it. This pattern is then repeated some unknown number of times like so:

<table class="rdoBtnList">
    <tbody>
       <tr>
          <td> Person 1 </td>
          <td>
            <label for="rb1">Verified</label>
            <input type="radio" id="rb1" name="rdoBtns" value="Verified" />
            <label for="rb2">Not Verified</label>
            <input type="radio" id="rb2" name="rdoBtns" value="NotVerified" />
          </td>
       </tr>
    </tbody>
 </table>
 <div class="PersonLink"><a href="#">Link to Person 1 page</a></div>
  ..... tables and divs for person 2, 3, ... n, etc

I would like to be able to use jQuery to enable/disable the link in the div following the radio buttons based on the value of the radio button. I can get the value of the radio buttons, but cannot figure out what selector syntax I would use to enable/disable just the div after the radio buttons.

Here is my jQuery so far:

    <script type="text/javascript">
       $(document).ready(function() {
           $(".rdoBtnList > tbody > tr > td > input").change(function() {
           if ($(this).val() == "Verified") {
               // select the link in the div following the table and enable it
           } else {
               // select the link in the div following the table and disable it
           }
        });
       });
    </script>
+3  A: 

Like this:

$(this).closest('.rdoBtnList').nextAll('.PersonLink:first').children('a').whatever

closest('.rdoBtnList') will find the table, and nextAll('.PersonLink:first') will find the first .PersonLink after the table.

By the way, the val function returns a normal boolean. You should write if($(this).val()).

SLaks
This approach looks good, though in my real life code I ended up having to do a little more traversing than I would've in this example. Your code showed me how to do that though! Also the `if($(this).val() == "True")` was a typo on my part and should have been `if($(this).val() == "Verified")`. I edited my post to reflect that. Thanks!
hotbot86
A: 

I would have tried a different approach, giving each link an id, or perhaps even a class for easier selection:

<table>...
    <input type="radio" id="personXrb1" class="personXselector" ...
<div>
<a href="personXlink" id="personXselector">link to person X</a>

This should be relatively easy as I expect the html is generated programatically. Right? It will also be less prone to errors due to code changes, and possibly easier to read.

Selection would then not be done with $(this).closest etc, which is not guaranteed to work after changing the code around, but instead through

$('#' + $(this).attr('class')).doStuff();

I'm also not sure that enable/disable will work with a div or a-tag, you might be better off using fadeOut() and fadeIn() or just show() and hide() to "disable" the links.

SilverSkin
Thanks for the answer. I couldn't change the ID as they are generated via asp.net in legacy code I couldn't change. I ended up just hiding the link with the css() function.
hotbot86