I have used css in forms to position the default submit button as the
first button declared in the form html before, even though on-screen
it may appear anywhere in the form. If you need a javscript-free
solution this arrangement works across all the browsers.

The basic premise is:

<form action=...>
  <ul>
    <li class="last">
        <!--default submit button here-->
    </li>
    <li>
        <!--other form field or submit button-->
    </li>
    <li>
        <!--other form field or submit button-->
    </li>
  </ul>
</form>

To push the default submit button in the example html to the bottom of
the form, the css could be:
.last { bottom:0px; position: absolute;}
ul { position: relative;}

A classic example of where this would be required is a registration
form with a 'change captcha' submit button if the user cannot view the
captcha text, but also a submit button for the registration form as a
whole. If users press return in a text input field you always want the
default submit button to fire.

I mention a css-only solution just if you need it - I also agree with
the solutions provided in prior posts, javascript in forms is
perfectly acceptable as well. For most target audiences it is fine I
think to consider the non javascript-accessible part of a website just
for search engine spiders, and as soon as you encounter any forms on
the page - javascript is required. Especially for more complex forms
where choices provided change in realtime based on other form choices,
javascript cannot be avoided. I would happily put multiple submit
buttons in the category of a more complex form.

- Alex

On Feb 28, 7:23 pm, "mr.freeze" <nat...@freezable.com> wrote:
> Here's an even better solution :)
>
> if 'MSIE' in request.env.http_user_agent:
>     redirect('http:/getfirefox.com/')
>
> But seriously, I see your point. It's a bit of a catch 22 as you are
> either coding around browser quirks or relying on javascript.
>
> On Feb 27, 8:42 pm, Jonathan Lundell <jlund...@pobox.com> wrote:
>
>
>
> > On Feb 27, 2010, at 6:25 PM, mr.freeze wrote:
>
> > > I disagree, the behavior seems controllable to me and I use it often.
> > > In IE, a submit done via the enter key on a text input doesn't send
> > > any of the <input type='submit' values back.  On firefox, a submit
> > > done with the enter key will send the first submit value. Just make
> > > your default submit the first one and you can determine what to do
> > > with your form. Here's a revised example:
>
> > >    form = FORM('blah blah',
> > >            INPUT(_type='text', _value='test',_name="test"),
> > >            INPUT(_type='submit', _value='Reset',_name="reset"),
> > >            INPUT(_type='submit', _value='Apply',_name="apply"),
>
> > >            INPUT(_type='submit', _value='Reset
> > > all',_name="resetall"))
> > >    if request.vars.apply:
> > >        pass #clicked or enter was hit on FF
> > >    elif request.vars.reset:
> > >        pass #clicked
> > >    elif request.vars.resetall:
> > >        pass #clicked
> > >    else:
> > >        pass #enter was hit on IE, do apply
>
> > > Maybe I'm missing something?
>
> > The main problem with that approach is that it relies on undocumented 
> > reverse-engineered behavior of IE. Now, that's something we're forced to do 
> > from time to time, but unless you're averse to using JavaScript, there are 
> > solutions (like Iceberg's and mine) that avoid the IE issue altogether.
>
> > Also, in my case, I don't actually need a submit button (vs a button 
> > button) for my cancel function, since I need to catch the cancel before 
> > calling accepts()--I don't want to invoke the validators on a cancel.
>
> > But if you really need multiple submits, and you're willing to use 
> > JavaScript, Iceberg's solution is slick.
>
> > Some interesting research on the IE 
> > problem:http://muffinresearch.co.uk/archives/2005/12/08/fun-with-multiple-sub...
>
> > > On Feb 27, 8:06 pm, Iceberg <iceb...@21cn.com> wrote:
> > >> I think Jonathan have given enough reason of why not.  There is
> > >> another post to discuss the same 
> > >> thing.http://groups.google.com/group/web2py/msg/79c1f847890a6b60
>
> > >> In short, do resist the temptation of using multiple submit buttons,
> > >> pal. :)
>
> > >> On Feb28, 9:36am, "mr.freeze" <nat...@freezable.com> wrote:
>
> > >>> Why not just do this?:
>
> > >>> def index():
> > >>>     form = FORM('blah blah',
> > >>>             INPUT(_type='submit', _value='Apply',_name="apply"),
> > >>>             INPUT(_type='submit', _value='Reset',_name="reset"),
> > >>>             INPUT(_type='submit', _value='Reset
> > >>> all',_name="resetall"))
> > >>>     if request.vars.apply:
> > >>>         pass #apply was clicked
> > >>>     elif request.vars.reset:
> > >>>         pass #reset was clicked
> > >>>     elif request.vars.resetall:
> > >>>         pass #resetall was clicked
>
> > >>> On Feb 27, 6:30 pm, Jonathan Lundell <jlund...@pobox.com> wrote:
>
> > >>>> On Feb 27, 2010, at 4:03 PM, Thadeus Burgess wrote:
>
> > >>>>> If your running the latest version of web2py, look at
> > >>>>> controllers/appadmin.py in ccache function. It defines a form with
> > >>>>> three buttons, (one toc lear ram, one to clear disk, and one to clear
> > >>>>> both). Click the different submit button executes the appropriate
> > >>>>> function.
>
> > >>>> A caveat, though: this approach is problematical if the form has a 
> > >>>> text input field and the user submits the form by typing return in an 
> > >>>> input field, rather than clicking a button.
>
> > >>>> The problem as I understand it is that in that case you're not 
> > >>>> guaranteed which button is returned. The culprit (no surprise) is IE. 
> > >>>> So if Tom's form gets submitted by a return in a text field, and the 
> > >>>> browser is IE, he presumably wants to see the Apply button, but might 
> > >>>> see one of the reset buttons instead--not what the user intended.
>
> > >>>> My approach is to use one submit button, and to make the other buttons 
> > >>>> type=button, with an onclick script to reinvoke the same controller 
> > >>>> with a button ID in vars. You'll typically check for that at the 
> > >>>> beginning of the controller.
>
> > >>>> I've been using it for a cancel button, as well as some 
> > >>>> application-specific functions, and it seems to work well.
>
> > >>>>> -Thadeus
>
> > >>>>> On Sat, Feb 27, 2010 at 5:08 PM, Jonathan Lundell 
> > >>>>> <jlund...@pobox.com> wrote:
> > >>>>>> On Feb 27, 2010, at 3:00 PM, Tiago Almeida wrote:
>
> > >>>>>> Don't know why functions reset, reset_all are not called but they 
> > >>>>>> reference
> > >>>>>> a "form" variable which is not in scope? Do you have any global 
> > >>>>>> "form"?
>
> > >>>>>> The logic below can't work, for lots of reasons.
> > >>>>>> One is the one Tiago mentions. Another is that input elements do not 
> > >>>>>> have
> > >>>>>> action attributes; forms do. There are ways to accomplish this kind 
> > >>>>>> of
> > >>>>>> thing; most of them involve JavaScript.
> > >>>>>> This might be helpful (though it's not the way I'd do
> > >>>>>> it):http://www.javascript-coder.com/html-form/html-form-submit.phtml
>
> > >>>>>> Regards,
> > >>>>>> Tiago
> > >>>>>> --
>
> > >>>>>> On Sat, Feb 27, 2010 at 10:15 PM, Tomas Pelka <tompe...@gmail.com> 
> > >>>>>> wrote:
>
> > >>>>>>> Hi all,
>
> > >>>>>>> have some troubles with web form which have more than one button. 
> > >>>>>>> It is
> > >>>>>>> obvious that one button (action connected with button) correspond 
> > >>>>>>> with
> > >>>>>>> one function.
>
> > >>>>>>> According manual this should work:
> > >>>>>>> controler
> > >>>>>>> ---------
> > >>>>>>> def index():
> > >>>>>>>  form = FORM('blah blah',
> > >>>>>>>        INPUT(_type='submit', _value='Apply'),
> > >>>>>>>        INPUT(_type='submit', _value='Reset', _action=URL(r=request,
> > >>>>>>> f='reset'),
> > >>>>>>>        INPUT(_type='submit', _value='Reset all', 
> > >>>>>>> _action=URL(r=request,
> > >>>>>>> f='reset_all'))
> > >>>>>>>  if form.accepts(request.vars, session):
> > >>>>>>>        pass
> > >>>>>>>  elif form.errors:
> > >>>>>>>        response.flash = 'Error'
> > >>>>>>>  else:
> > >>>>>>>        pass
> > >>>>>>>  return dict(form=form)
>
> > >>>>>>> def reset():
> > >>>>>>>    if form.accepts(request.vars, formname=None):
> > >>>>>>>        response.flash = 'Reset'
> > >>>>>>>    elif form.errors:
> > >>>>>>>        response.flash = 'Error'
> > >>>>>>>    else:
> > >>>>>>>        pass
> > >>>>>>>    return dict()
>
> > >>>>>>> def reset_all():
> > >>>>>>>    if form.accepts(request.vars, formname=None):
> > >>>>>>>        response.flash = 'Resert all'
> > >>>>>>>    elif form.errors:
> > >>>>>>>        response.flash = 'Error'
> > >>>>>>>    else:
> > >>>>>>>        pass
> > >>>>>>>    return dict()
>
> > >>>>>>> But action functions (reset, reset_all) will not call. Am I doing
> > >>>>>>> anything wrong?
>
> > >>>>>>> Thanks for advice,
> > >>>>>>> cheers
>
> > >>>>>>> --
> > >>>>>>> Tom
>
> > >>>>>>> Key fingerprint = 06C0 23C6 9EB7 0761 9807  65F4 7F6F 7EAB 496B 28AA
>
> > > --
> > > You received this message because you are subscribed to the Google Groups 
> > > "web2py-users" group.
> > > To post to this group, send email to web...@googlegroups.com.
> > > To unsubscribe from this group, send email to 
> > > web2py+unsubscr...@googlegroups.com.
> > > For more options, visit this group 
> > > athttp://groups.google.com/group/web2py?hl=en.

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

Reply via email to