- From: John Boyer <boyerj@ca.ibm.com>
- Date: Tue, 26 Aug 2008 16:25:01 -0700
- To: "Mark Birbeck" <mark.birbeck@webbackplane.com>
- Cc: public-forms <public-forms@w3.org>, "Ulrich Nicolas Lissé" <unl@dreamlab.net>
- Message-ID: <OF2EACA1F9.AFAED674-ON882574B1.007E4691-882574B1.0080A734@ca.ibm.com>
Hi Mark,
I'd like to understand whether the example of keeping the focus on a
control if it is filled out incorrectly really works as a technique.
One problem is that filling out one field incorrectly may cause multiple
controls to receive xforms-invalid events, and they will arrive in an
undefined order, so there is no way to guarantee that the focus will stay
in "the" invalid control. Could work for simple forms with few data
dependencies, but is not generally applicable.
A second problem is that the invalidity in one control may be the fault of
a bad data entered elsewhere. The user may want to leave the invalid data
but then go fix the real problem. For example, suppose the user with a
bachelor's degree is asked to enter his age and he types 18 rather than
28. A simple typo. Then, when asked for years of schooling, the user
enters 20. This pops a constraint because he can't have more years of
education than he has years of life. However, the problem is with the age
data, not the education data.
For the above reason, and just generally speaking, it is usually
considered to be poor UX to freeze up the focus in an invalid control. The
better practice is to stop the first focus out, but then let the second
attempt to remove focus succeed if the user has made no changes. Now it
turns out that a quirk of our processing model might actually make an
"event target setfocus" do exactly this behavior because a second tab
would not change the value, so you would not get another invalid event. To
be clear, if you have this
<input ref="age" id="X">
<label>Age</label>
<setfocus ev:event="xforms-invalid" control="X"/>
<alert>Please enter an integer number.</alert>
</input>
then if the user types "abc" and hits tab, then the focus would stay in
the control and the user would see the alert. But if the user hits tab
again, then no data has changed so I don't think another xforms-invalid
event would occur, which means the focus would move on, right?
If so, is this the same as "preventing the user from leaving the control
if its value is not set appropriately"?
And regardless of how this discussion goes, I don't really understand why
using the event function would look weird.
<setfocus ev:event="xforms-invalid">
<control value="event('target')"/>
</setfocus>
It seems to say enough that it is clear what is going on. Put another
way, even if we chose a default of event target, I don't think the method
is declarative until you have a way to explicitly state the default, so it
would still be necessary to have a way of saying that the control to focus
is given by the event target.
Cheers,
John M. Boyer, Ph.D.
Senior Technical Staff Member
Lotus Forms Architect and Researcher
Chair, W3C Forms Working Group
Workplace, Portal and Collaboration Software
IBM Victoria Software Lab
E-Mail: boyerj@ca.ibm.com
Blog: http://www.ibm.com/developerworks/blogs/page/JohnBoyer
Blog RSS feed:
http://www.ibm.com/developerworks/blogs/rss/JohnBoyer?flavor=rssdw
From:
"Mark Birbeck" <mark.birbeck@webbackplane.com>
To:
John Boyer/CanWest/IBM@IBMCA
Cc:
"Ulrich Nicolas Lissé" <unl@dreamlab.net>, public-forms
<public-forms@w3.org>
Date:
08/20/2008 06:56 PM
Subject:
Re: Allow xf:setfocus with no @control to set the focus to the event
target
Hi John,
> [snip]
>
> Does it really make sense to try to focus the event target?
If that's what the author wants...yes. It's not uncommon in HTML forms
to prevent users from leaving a control if its value is not set
appropriately, for example.
> What if a
> sequence of actions is grouped together and invoked from multiple
locations
> using dispatch?
Sure...but if the listener is on the control, then you'll always
ultimately get Event.target set to the control in question, won't you?
> It seems an odd thing to see <setfocus/> without any indication of what
the
> focus is being set to.
No different to any other default values, surely? (xf:rebuild,
xf:refresh, xf:submit, xf:send, etc.) And a lot less weird looking
than using the event() function. :)
Regards,
Mark
--
Mark Birbeck, webBackplane
mark.birbeck@webBackplane.com
http://webBackplane.com/mark-birbeck
webBackplane is a trading name of Backplane Ltd. (company number
05972288, registered office: 2nd Floor, 69/85 Tabernacle Street,
London, EC2A 4RR)
Received on Tuesday, 26 August 2008 23:25:45 UTC