Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I am a newbie so I'm sorry for the ignorance. I want to add multiple javascript onclicks to a radio_group that I created using cgi oo. I am only able to create one option for the entire group. This is what I have. Thanks for any help
$q->radio_group(-name=>"type", -values=>["old", "new"], -default=> "old", -labels=>{old=>"Current Device Type" +, new=>"Add Device Type"}, -onClick=>'alert("work");)

edited: Tue Jun 24 19:27:04 2003 by jeffa - title change (was: OO CGI)

Replies are listed 'Best First'.
(jeffa) Re: CGI.pm radio box with multiple JavaScript onClick events
by jeffa (Bishop) on Jun 24, 2003 at 19:17 UTC
    You have two problems - the first is a typo or a syntax error:
    -onClick=>'alert("work");)
    surely should be:
    -onClick=>'alert("work")');
    The second problem is one that bites newcomers to Perl often. When you pass arguments to a subroutine, those arguments are part of a list. If you pass another list, then it 'folds' into the whole list. This is what is happening when you give your -labels values - it is a list and the next argument, -onClick, is parsed as belonging to -labels. The quick solution is to specify -labels last. But, since -labels is suppose to be a hash reference (thanks for the heads up cLive ;-)), all you need to do is use curly braces instead of parens:
    print $q->radio_group( -name => 'type', -values => [qw(old new)], -default => 'old', -onClick => 'alert("Work")', -labels => {old=> 'Current Device Type', new=>'Add Device Type'}, );
    A better solution is to use a hash reference instead:
    my %hash = ( old => 'Current Device Type', new => 'Add Device Type', ); print radio_group( -labels => \%hash, -name => 'type', -values => [values %hash], -default => 'old', -onClick => 'alert("Work")', );

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    B--B--B--B--B--B--B--B--
    H---H---H---H---H---H---
    (the triplet paradiddle with high-hat)
    
      Thanks for the replay, but thats not exactly what I was looking for...maybe I didnt explain myself well. I'd like for each option in the radion button to have a different javascript function. In other words I want to send a variable either new or old to a javascript function depending on which button is selected. So I was thinking something like..
      $q->radio_group(-name=>"type", -values=>["old", "new"], -default=> "old", -onClick=>{old=>old_or_new(old), new=>old_or_new(new)} +, -labels=>{old=>"Current Device Type", new=>"Add Device T +ype"})
      but ofcourse my syntax is wrong. thanks again
        My mistake, i now see that you did use a hash reference ... *squints eyes*

        Your syntax is not too off, what you need to do is use the -attributes arg available in CGI.pm 2.93

        6.  The optional sixth parameter (-attributes) is pro-
            vided to assign any of the common HTML attributes
            to an individual menu item. It's a pointer to an
            associative array relating menu values to another
            associative array with the attribute's name as the
            key and the attribute's value as the value.
        
        Now, getting this syntax correct is a bit of a pickle. You have to use single quotes inside the alert - if you use double quotes, they will confict because double quotes are used to surround the onClick code:
        print radio_group( -name => 'type', -values => [qw(old new)], -default => 'old', -labels => {old=>'Current Device Type', new=>'Add Device Type'}, -attributes => { old => {onClick=>"alert('Current');"}, new => {onClick=>"alert('Add');"}, } );

        And my apologies for missing the real question the first time.

        jeffa

        L-LL-L--L-LL-L--L-LL-L--
        -R--R-RR-R--R-RR-R--R-RR
        B--B--B--B--B--B--B--B--
        H---H---H---H---H---H---
        (the triplet paradiddle with high-hat)