jq noob wrote:
> Sorry this might be really simple but there is a reason my
> nickname is jq noob! I was wondering how to convert this JS
> function into proper Jquery code.

"Correct" and "proper" are going to be very much influenced by various
people's opinions. You have not explained what - obj - is expected to
be in your function. It looks like it could be an <INPUT type="radio">
element, but it could also be any JS object that happens to have a -
name - property that corresponds with the name of a set of <INPUT
type="radio"> elements in a form with the name (or possibly ID)
"editResource". This leads to some guessing, but my guess is that the
question you want the answer to is; given a reference to an <INPUT
type="radio"> element, how to use JQuery to assign a - false - value
to the - checked - property of all of the like-named "radio" elements
in a form named "editResource" (though if you started with an <INPUT
type="radio"> element from inside the form then you can get a
reference to the containing form from the element's - form - property
and so could use that as a context and so not need to know the name of
the form).

Disregarding the JQuery aspect of this, there are two important
javascript issues that you would benefit form learning about.

> function uncheckRadio(obj) {
>       var choice = eval("document.editResource." + obj.name);

Historically the - eval - function has been misused, and here you seem
to have an example of its most common (and unnecessary) abuse; the
runtime construction of string representations of dot notation
property accessors and then - eval -ing them in order to resolving the
property accessor. In addition to "dot notation" property accessors,
javascript has "bracket notation" property accessors, and bracket
notation property accessors do a runtime evaluation of an expression
and a type-conversation to a string, and then use that string as the
name of the property to be looked up.  See:-

<URL: http://www.jibbering.com/faq/faq_notes/square_brackets.html >

Thus:-

var choice = eval("document.editResource." + obj.name);

- can be replaced with:-

var choice = document.editResource[ obj.name ];

- and achieve the same outcome, but faster (about 7 to 80 times
faster, depending on the browser/js-engine).

(If - obj - does happen to be a reference to an <INPUT type="radio">
element in the ' editResource' form then the above property accessor
could also be re-written as:-

var choice = obj.form[ obj.name ];

- allowing the FORM to be handled anonymously.)

>       for (i = 0; i < choice.length; i++)

There is a general programming axiom that no variable should ever be
given more scope than it absolutely needs. Above you have - i = 0 -,
and that is an assignment to a property of the global object with the
name "i", which to all practical purposes is an assignment to a global
variable. But the - i - variable is a loop counter and loop counters
generally don't need to be in scope outside of the loop that uses
them. However, javascript's smallest scoping unit is the function. It
is never possible for a variable to be less visible than being visible
to the entire body of a function, but that still means that a loop
counter variable that does not need to be visible outside of its loop
should not have a scope that extends beyond the body of the function
in which the loop appears (it should not have more scope, but cannot
have less).

Thus - i - should be declared with the - var - keyword inside the
function. Making it a local variable (local to the function) rather
than its ending up as what is effectively a global variable.

In the function above that change would have no impact on how anything
worked (except the resolution of a local variable should be, very
fractionally, faster than the resolution of a global variable), but
the consequences of allowing variables more scope than they need might
be illustrated by considering what happens if, in the body of the loop
above, another function was called and that function also contained a
loop using an undeclared (so also global) - i - variable as its
counter (and habitually using the same identifiers for loop counters
is completely normal and common).  When the contained function is
called its loop updates the global - i - variable, and when the
function returns and the fist loop iterates it looks at the, now
modified, global - i - and probably does the wrong thing (prematurely
terminates, or loops for eve, or some such).

>       {
>               choice[i].checked = false;
>       }
> }

Reply via email to