Hi,

On Oct 8, 6:30 pm, Walter Lee Davis <wa...@wdstudio.com> wrote:
> What's a more idiomatic way to write this:
>
> Element.addMethods({
>         toggleClassName: function(element, className){
>                 var element = $(element);
>                 (element.hasClassName(className)) ? 
> element.removeClassName(className) : element.addClassName(className);
>                 return element;
>         }
>
> });
>
> This works, but it's got that really long line in the middle. How do you do 
> what PHP calls a "variable variable" in JavaScript to execute the correct 
> method (add/remove) based on the input without writing it all out long-hand?
>
> Walter

You are aware that Prototype *has* `toggleClassName` already[1],
right? And in fact, I think the current implementation of it answers
your question about "variable variables":

toggleClassName: function(element, className) {
  if (!(element = $(element))) return;
  return Element[Element.hasClassName(element, className) ?
    'removeClassName' : 'addClassName'](element, className);
},

That works because as you probably know, you can refer to an object
property using a literal with dotted syntax:

    x = obj.foo;

...or with a string using bracketed syntax:

    x = obj['foo'];

The latter opens up the possibility of using an expression for the
string:

    x = obj[flag ? 'foo' : 'bar'];

And of course, what we think of as methods aren't really methods at
all[2], they're just functions assigned to properties, and so:

    obj[flag ? 'foo' : 'bar']();

...will call `obj.foo()` or `obj.bar()` depending on the value of
`flag`. That's what the Prototype version of `toggleClassName` does,
it calls `removeClassName` or `addClassName` based on the result of
calling `hasClassName`.

This form of "variable variables" only works with object properties,
but I find that it applies in 99% of the situations I'd want it.

[1] http://api.prototypejs.org/dom/Element/toggleClassName/
[2] http://blog.niftysnippets.org/2008/03/mythical-methods.html

HTH,
--
T.J. Crowder
Independent Software Engineer
tj / crowder software / com
www / crowder software / com

-- 
You received this message because you are subscribed to the Google Groups 
"Prototype & script.aculo.us" group.
To post to this group, send email to prototype-scriptaculous@googlegroups.com.
To unsubscribe from this group, send email to 
prototype-scriptaculous+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/prototype-scriptaculous?hl=en.

Reply via email to