The other high-level control that WML provides is one allowing selection from a list of items. This replaces many different types of control, such as scrolling selectable lists, pulldown menus, and lists of checkboxes.
In its simplest form, the <select>
element provides an iname
attribute giving a WML
variable name. Inside the <select>
is a list
of <option>
elements. Selecting an option
sets the iname
variable to the index of that item
within the <select>
, starting from
1
. For example:
<select iname="animal"> <option>Lizard</option> <option>Spider</option> <option>Squid</option> </select>
Selecting Lizard
sets animal
to
1
, selecting Spider
sets it to
2
, and selecting Squid
sets it
to 3
.
In a slightly more complex form, the
<select>
element has a
name
attribute rather than
iname
, and a list of
<option>
elements, each of which has a
value
attribute. Selecting one of these options
sets the name
variable to the contents of the
option’s value
attribute. For example, a
list allowing the user to select a London airport can be written as:
<select name="airport"> <option value="LHR">London Heathrow</option> <option value="LGW">London Gatwick</option> <option value="STN">London Stansted</option> <option value="LCY">London City</option> <option value="LTN">London Luton</option> </select>
Selecting an option sets airport
to the
corresponding three-letter airport code.
-
title
(optional variable string) Provides an optional title for the
<select>
element, which some browsers may use in its presentation. Others may ignore it.-
iname
(optional name) Specifies a WML variable to be set to the index of the selected item. If this is specified and the variable is already set to an index value, it selects the default value. This takes precedence over
ivalue
,name
, andvalue
for determining the default value.-
ivalue
(optional variable number) Specifies the index of the value that should be the default if the
iname
attribute isn’t present or its variable isn’t set. This takes precedence overname
andvalue
for setting the default.-
name
(optional name) Specifies a WML variable to be set to the contents of the
value
attribute from the selected option. This may also be used to determine the default value. (The first<option>
whosevalue
matches the contents of this variable is selected but only ifiname
andivalue
have failed to select an item.) This takes precedence over onlyvalue
.-
value
(optional variable string) Specifies the default value of the
<select>
. The first item with avalue
attribute matching this is selected. This attribute is used only wheniname
,ivalue
, orname
haven’t managed to select a default value.-
multiple
(optional boolean; defaultfalse
) If set to
true
, indicates that this<select>
should allow more than one<option>
to be active at a time. In this case, the behavior of thename
,value
,iname
, andivalue
attributes changes slightly. (More on this in Section 4.4.2 later in this chapter).-
tabindex
(optional number) As with
<input>
, this provides a hint to the browser as to how it should cycle through all the controls in the card. See Section 4.10 later in the chapter for more ontabindex
.
When a
<select>
item has a
multiple="true"
attribute, it allows more than one
item to be selected from the list simultaneously. Such a
<select>
treats the values of the
name
, value
,
iname
, and ivalue
attributes
differently than normal. Instead of each representing a single item
(either an index or something matching an option’s
value
), each is treated as a list of values
separated by semicolons. (This has the minor side-effect that
semicolons are not
valid in the value
attributes on any
<option>
in a multiple-selection
<select>
.) The actual order of the values
between the semicolons isn’t defined by WML.
For example, a WAP pizza delivery service could use something similar to Example 4.2 to let people choose the toppings for their pizza. Note that this doesn’t allow people to select the same topping more than once. If they want that, they can phone in the order!
Example 4-2. Multiple Selection
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http"> <wml> <card title="Pizza Toppings"> <p>Choose your toppings: <select name="toppings" multiple="true"> <option value="p">Pepperoni</option> <option value="h">Ham</option> <option value="b">Spicy Beef</option> <option value="a">Anchovies</option> <option value="c">Chillies</option> <option value="o">Olives</option> <option value="m">Mushrooms</option> <!-- ...lots more toppings here... --> </select></p> <do type="accept" label="Order"> <go href="order?toppings=$(toppings:e)"/> </do> </card> </wml>
If I then decide that I want a pizza with all these toppings except
anchovies, the variable toppings
is set to
p;h;b;c;o;m
, or m;o;c;b;h;p
, or
b;c;h;m;o;p
, or any of the 717 other combinations
of those six items. (No, I’m not going to list them all.)
If there had been an iname
as well as (or perhaps
instead of) the name
, the variable it referenced
is set to 1;2;3;5;6;7
or a permutation of those
values.
In single-selection lists, however, the character
;
is valid in option values. Example 4.3 shows Example 4.2 extended
with an earlier card offering set pizzas and the chance to customize
them by adding and removing toppings. Note that the option of going
back from the second card to the first isn’t provided here.
This is because the values in the toppings
variable may not be in the same order as they were when the first
<select>
initialized them, because their
order is not fixed after a multiple selection
.
Example 4-3. Mixed Selections
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Set Pizzas" id="pizzas"> <p>Choose a Pizza:<select name="toppings"> <option value=""> <!-- no toppings --> Plain </option> <option value="p;m;o"> <!-- pepperoni, mushrooms, olives --> Pepperoni Supreme </option> <option value="p;b;h;a;m;o;c"> <!-- everything! --> Full House </option> <option value="c;o;m"> <!-- chillies, olives, mushrooms --> Vegetarian </option> </select></p> <do type="accept" label="Order"> <go href="order?toppings=$(toppings:e)"/> </do> <do type="accept" label="Customize"> <go href="#toppings"/> </do> </card> <card title="Pizza Toppings" id="toppings"> <p>Customize your Toppings <select name="toppings" multiple="true"> <option value="p">Pepperoni</option> <option value="h">Ham</option> <option value="b">Spicy Beef</option> <option value="a">Anchovies</option> <option value="o">Olives</option> <option value="m">Mushrooms</option> <option value="c">Chillies</option> </select></p> <do type="accept" label="Order"> <go href="order.cgi?toppings=$(toppings:e)"/> </do> </card> </wml>
Get Learning WML, and WMLScript now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.