line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
##---------------------------------------------------------------------------- |
2
|
|
|
|
|
|
|
## HTML Object - ~/lib/HTML/Object/DOM/Element/Select.pm |
3
|
|
|
|
|
|
|
## Version v0.2.0 |
4
|
|
|
|
|
|
|
## Copyright(c) 2021 DEGUEST Pte. Ltd. |
5
|
|
|
|
|
|
|
## Author: Jacques Deguest <jack@deguest.jp> |
6
|
|
|
|
|
|
|
## Created 2021/12/23 |
7
|
|
|
|
|
|
|
## Modified 2022/09/18 |
8
|
|
|
|
|
|
|
## All rights reserved |
9
|
|
|
|
|
|
|
## |
10
|
|
|
|
|
|
|
## |
11
|
|
|
|
|
|
|
## This program is free software; you can redistribute it and/or modify it |
12
|
|
|
|
|
|
|
## under the same terms as Perl itself. |
13
|
|
|
|
|
|
|
##---------------------------------------------------------------------------- |
14
|
|
|
|
|
|
|
package HTML::Object::DOM::Element::Select; |
15
|
|
|
|
|
|
|
BEGIN |
16
|
|
|
|
|
|
|
{ |
17
|
2
|
|
|
2
|
|
2951
|
use strict; |
|
2
|
|
|
|
|
7
|
|
|
2
|
|
|
|
|
62
|
|
18
|
2
|
|
|
2
|
|
9
|
use warnings; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
55
|
|
19
|
2
|
|
|
2
|
|
20
|
use parent qw( HTML::Object::DOM::Element ); |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
10
|
|
20
|
2
|
|
|
2
|
|
165
|
use vars qw( $VERSION ); |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
87
|
|
21
|
2
|
|
|
2
|
|
532
|
use HTML::Object::DOM::Element::Shared qw( :select ); |
|
2
|
|
|
|
|
4
|
|
|
2
|
|
|
|
|
602
|
|
22
|
2
|
|
|
2
|
|
67
|
our $VERSION = 'v0.2.0'; |
23
|
|
|
|
|
|
|
}; |
24
|
|
|
|
|
|
|
|
25
|
2
|
|
|
2
|
|
13
|
use strict; |
|
2
|
|
|
|
|
5
|
|
|
2
|
|
|
|
|
41
|
|
26
|
2
|
|
|
2
|
|
9
|
use warnings; |
|
2
|
|
|
|
|
6
|
|
|
2
|
|
|
|
|
3602
|
|
27
|
|
|
|
|
|
|
|
28
|
|
|
|
|
|
|
sub init |
29
|
|
|
|
|
|
|
{ |
30
|
1
|
|
|
1
|
1
|
154
|
my $self = shift( @_ ); |
31
|
1
|
|
|
|
|
131
|
$self->{_init_strict_use_sub} = 1; |
32
|
1
|
50
|
|
|
|
9
|
$self->SUPER::init( @_ ) || return( $self->pass_error ); |
33
|
1
|
50
|
|
|
|
4
|
$self->{tag} = 'select' if( !CORE::length( "$self->{tag}" ) ); |
34
|
1
|
|
|
|
|
10
|
$self->{options} = []; |
35
|
1
|
|
|
|
|
2
|
$self->{_select_reset} = 1; |
36
|
|
|
|
|
|
|
my $callback = sub |
37
|
|
|
|
|
|
|
{ |
38
|
9
|
|
|
9
|
|
1376
|
my $def = shift( @_ ); |
39
|
|
|
|
|
|
|
# Our children were modified from outside our package. |
40
|
|
|
|
|
|
|
# We need to check if it affects our rows and reset the cache accordingly |
41
|
9
|
100
|
66
|
|
|
82
|
unless( $def->{caller}->[0] eq ref( $self ) || |
42
|
|
|
|
|
|
|
$def->{caller}->[0] eq 'HTML::Object::DOM::Element::Select' ) |
43
|
|
|
|
|
|
|
{ |
44
|
7
|
|
|
|
|
32
|
$self->reset(1); |
45
|
|
|
|
|
|
|
} |
46
|
9
|
|
|
|
|
62
|
return(1); |
47
|
1
|
|
|
|
|
7
|
}; |
48
|
1
|
|
|
|
|
4
|
$self->children->callback( add => $callback ); |
49
|
1
|
|
|
|
|
172
|
$self->children->callback( remove => $callback ); |
50
|
1
|
|
|
|
|
108
|
return( $self ); |
51
|
|
|
|
|
|
|
} |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
sub add |
54
|
|
|
|
|
|
|
{ |
55
|
1
|
|
|
1
|
1
|
115
|
my $self = shift( @_ ); |
56
|
1
|
50
|
|
|
|
6
|
return( $self->error({ |
57
|
|
|
|
|
|
|
message => sprintf( "At least 1 argument is required, but only %d was provided.", scalar( @_ ) ), |
58
|
|
|
|
|
|
|
class => 'HTML::Object::SyntaxError', |
59
|
|
|
|
|
|
|
}) ) if( scalar( @_ ) < 1 ); |
60
|
1
|
|
|
|
|
5
|
my( $elem, $pos ) = @_; |
61
|
1
|
0
|
33
|
|
|
6
|
return( $self->error({ |
62
|
|
|
|
|
|
|
message => "Element provided is neither a HTML::Object::DOM::Element::Option object nor a HTML::Object::DOM::Element::OptGroup object.", |
63
|
|
|
|
|
|
|
class => 'HTML::Object::TypeError', |
64
|
|
|
|
|
|
|
}) ) if( !$self->_is_a( $elem => 'HTML::Object::DOM::Element::Option' ) && !$self->_is_a( $elem => 'HTML::Object::DOM::Element::OptGroup' ) ); |
65
|
1
|
|
|
|
|
46
|
my $options = $self->options; |
66
|
1
|
|
|
|
|
13
|
my $size = $options->size; |
67
|
1
|
50
|
33
|
|
|
41024
|
if( defined( $pos ) && CORE::length( $pos ) ) |
68
|
|
|
|
|
|
|
{ |
69
|
0
|
0
|
0
|
|
|
0
|
if( !$self->_is_a( $elem => 'HTML::Object::DOM::Element::Option' ) && |
|
|
0
|
0
|
|
|
|
|
70
|
|
|
|
|
|
|
!$self->_is_a( $elem => 'HTML::Object::DOM::Element::OptGroup' ) && |
71
|
|
|
|
|
|
|
!$self->_is_integer( $pos ) ) |
72
|
|
|
|
|
|
|
{ |
73
|
0
|
|
|
|
|
0
|
return( $self->error({ |
74
|
|
|
|
|
|
|
message => "The offset position before which to insert the element, if provided, must be an object or an integer, but I got '" . overload::StrVal( $pos ) . "'.", |
75
|
|
|
|
|
|
|
class => 'HTML::Object::TypeError', |
76
|
|
|
|
|
|
|
}) ); |
77
|
|
|
|
|
|
|
} |
78
|
|
|
|
|
|
|
elsif( $self->_is_a( $elem => 'HTML::Object::DOM::Element::Option' ) || |
79
|
|
|
|
|
|
|
$self->_is_a( $elem => 'HTML::Object::DOM::Element::OptGroup' ) ) |
80
|
|
|
|
|
|
|
{ |
81
|
|
|
|
|
|
|
# Check if it is an ancestor, as per the specifications |
82
|
0
|
|
|
|
|
0
|
my $lineage = $self->lineage; |
83
|
0
|
|
|
|
|
0
|
my $lineagePos = $lineage->pos( $elem ); |
84
|
0
|
0
|
|
|
|
0
|
if( defined( $lineagePos ) ) |
85
|
|
|
|
|
|
|
{ |
86
|
0
|
|
|
|
|
0
|
return( $self->error({ |
87
|
|
|
|
|
|
|
message => "Element to be added to this select element is an ancestor.", |
88
|
|
|
|
|
|
|
class => 'HTML::Object::HierarchyRequestError', |
89
|
|
|
|
|
|
|
}) ); |
90
|
|
|
|
|
|
|
} |
91
|
|
|
|
|
|
|
|
92
|
0
|
|
|
|
|
0
|
my $tmpPos = $options->pos( $elem ); |
93
|
0
|
0
|
|
|
|
0
|
if( defined( $tmpPos ) ) |
94
|
|
|
|
|
|
|
{ |
95
|
0
|
|
|
|
|
0
|
$pos = $tmpPos; |
96
|
|
|
|
|
|
|
} |
97
|
|
|
|
|
|
|
else |
98
|
|
|
|
|
|
|
{ |
99
|
0
|
|
|
|
|
0
|
undef( $pos ); |
100
|
|
|
|
|
|
|
} |
101
|
|
|
|
|
|
|
} |
102
|
|
|
|
|
|
|
else |
103
|
|
|
|
|
|
|
{ |
104
|
0
|
0
|
|
|
|
0
|
if( $pos < 0 ) |
|
|
0
|
|
|
|
|
|
105
|
|
|
|
|
|
|
{ |
106
|
0
|
|
|
|
|
0
|
$pos = $pos + $size; |
107
|
|
|
|
|
|
|
} |
108
|
|
|
|
|
|
|
elsif( $pos > $size ) |
109
|
|
|
|
|
|
|
{ |
110
|
0
|
|
|
|
|
0
|
undef( $pos ); |
111
|
|
|
|
|
|
|
} |
112
|
|
|
|
|
|
|
} |
113
|
|
|
|
|
|
|
} |
114
|
1
|
|
|
|
|
21
|
$elem->detach; |
115
|
1
|
|
|
|
|
7
|
$elem->parent( $self ); |
116
|
1
|
|
|
|
|
51
|
my $children = $self->children; |
117
|
1
|
50
|
33
|
|
|
136
|
if( defined( $pos ) && CORE::length( $pos ) ) |
118
|
|
|
|
|
|
|
{ |
119
|
0
|
|
|
|
|
0
|
my $kid = $options->index( $pos ); |
120
|
0
|
|
|
|
|
0
|
my $real_pos = $children->pos( $kid ); |
121
|
0
|
|
|
|
|
0
|
$children->splice( $real_pos, 0, $elem ); |
122
|
|
|
|
|
|
|
} |
123
|
|
|
|
|
|
|
else |
124
|
|
|
|
|
|
|
{ |
125
|
1
|
|
|
|
|
9
|
$children->push( $elem ); |
126
|
|
|
|
|
|
|
} |
127
|
1
|
|
|
|
|
19
|
$self->reset(1); |
128
|
1
|
|
|
|
|
5
|
return( $self ); |
129
|
|
|
|
|
|
|
} |
130
|
|
|
|
|
|
|
|
131
|
|
|
|
|
|
|
# Note: property autofocus |
132
|
0
|
|
|
0
|
1
|
0
|
sub autofocus : lvalue { return( shift->_set_get_property( 'autofocus', @_ ) ); } |
133
|
|
|
|
|
|
|
|
134
|
0
|
|
|
0
|
1
|
0
|
sub blur { return; } |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
# Note: method checkValidity is inherited |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
# Note: property disabled is inherited |
139
|
|
|
|
|
|
|
|
140
|
0
|
|
|
0
|
1
|
0
|
sub focus { return; } |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
# Note: property form read-only is inherited |
143
|
|
|
|
|
|
|
|
144
|
1
|
|
|
1
|
1
|
1128
|
sub item { return( shift->options->index( @_ ) ); } |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
# Note: property labels read-only is inherited |
147
|
|
|
|
|
|
|
|
148
|
|
|
|
|
|
|
# Note: property length |
149
|
0
|
|
|
0
|
1
|
0
|
sub length : lvalue { return( shift->_set_get_property( 'length', @_ ) ); } |
150
|
|
|
|
|
|
|
|
151
|
|
|
|
|
|
|
# Note: property multiple |
152
|
0
|
|
|
0
|
1
|
0
|
sub multiple : lvalue { return( shift->_set_get_property( 'multiple', @_ ) ); } |
153
|
|
|
|
|
|
|
|
154
|
|
|
|
|
|
|
# Note: property name is inherited |
155
|
|
|
|
|
|
|
|
156
|
|
|
|
|
|
|
# Note: method namedItem is inherited from HTML::Object::DOM::Collection |
157
|
1
|
|
|
1
|
1
|
1184
|
sub namedItem { return( shift->options->namedItem( @_ ) ); } |
158
|
|
|
|
|
|
|
|
159
|
0
|
|
|
0
|
0
|
0
|
sub onchange : lvalue { return( shift->on( 'change', @_ ) ); } |
160
|
|
|
|
|
|
|
|
161
|
0
|
|
|
0
|
0
|
0
|
sub oninput : lvalue { return( shift->on( 'input', @_ ) ); } |
162
|
|
|
|
|
|
|
|
163
|
|
|
|
|
|
|
# Note: property options read-only |
164
|
|
|
|
|
|
|
# sub options { return( shift->_set_get_object( 'options', 'HTML::Object::DOM::Element::OptionsCollection', @_ ) ); } |
165
|
|
|
|
|
|
|
sub options |
166
|
|
|
|
|
|
|
{ |
167
|
39
|
|
|
39
|
1
|
4769
|
my $self = shift( @_ ); |
168
|
39
|
100
|
100
|
|
|
172
|
return( $self->{_select_options} ) if( $self->{_select_options} && !$self->_is_select_reset ); |
169
|
24
|
|
|
79
|
|
90
|
my $list = $self->children->grep(sub{ $self->_is_a( $_ => 'HTML::Object::DOM::Element::Option' ) }); |
|
79
|
|
|
|
|
3751
|
|
170
|
|
|
|
|
|
|
# The content of the collection is refreshed, but the collection object itself does not change, so the user can poll it |
171
|
24
|
100
|
|
|
|
3411
|
unless( $self->{_select_options} ) |
172
|
|
|
|
|
|
|
{ |
173
|
1
|
50
|
|
|
|
9
|
$self->_load_class( 'HTML::Object::DOM::Element::OptionsCollection' ) || return( $self->pass_error ); |
174
|
1
|
|
50
|
|
|
69
|
$self->{_select_options} = HTML::Object::DOM::Element::OptionsCollection->new || |
175
|
|
|
|
|
|
|
return( $self->pass_error( HTML::Object::DOM::Element::OptionsCollection->error ) ); |
176
|
|
|
|
|
|
|
} |
177
|
24
|
|
|
|
|
117
|
$self->{_select_options}->set( $list ); |
178
|
24
|
|
|
|
|
428
|
$self->_remove_select_reset; |
179
|
24
|
|
|
|
|
94
|
return( $self->{_select_options} ); |
180
|
|
|
|
|
|
|
} |
181
|
|
|
|
|
|
|
|
182
|
|
|
|
|
|
|
sub remove |
183
|
|
|
|
|
|
|
{ |
184
|
1
|
|
|
1
|
1
|
41945
|
my $self = shift( @_ ); |
185
|
1
|
|
|
|
|
4
|
my $pos = shift( @_ ); |
186
|
1
|
50
|
33
|
|
|
29
|
return( $self->error({ |
|
|
|
33
|
|
|
|
|
187
|
|
|
|
|
|
|
message => "Index value provided ($pos) is not an integer", |
188
|
|
|
|
|
|
|
class => 'HTML::Object::IndexSizeError', |
189
|
|
|
|
|
|
|
}) ) if( !defined( $pos ) || !CORE::length( "$pos" ) || !$self->_is_integer( $pos ) ); |
190
|
1
|
|
|
|
|
25
|
my $options = $self->options; |
191
|
1
|
50
|
|
|
|
14
|
return( $self->error({ |
192
|
|
|
|
|
|
|
message => "Index value provided ($pos) is greater than the zero-based total number of options.", |
193
|
|
|
|
|
|
|
class => 'HTML::Object::IndexSizeError', |
194
|
|
|
|
|
|
|
}) ) if( $pos > $options->size ); |
195
|
1
|
|
|
|
|
40577
|
my $elem = $options->index( $pos ); |
196
|
1
|
|
|
|
|
256
|
my $real_pos = $self->children->pos( $elem ); |
197
|
1
|
50
|
|
|
|
227
|
return( $self->error({ |
198
|
|
|
|
|
|
|
message => "Could not find the real index position of element found at offset '$pos'.", |
199
|
|
|
|
|
|
|
class => 'HTML::Object::HierarchyRequestError', |
200
|
|
|
|
|
|
|
}) ) if( !defined( $real_pos ) ); |
201
|
1
|
|
|
|
|
7
|
$self->children->splice( $real_pos, 1 ); |
202
|
1
|
|
|
|
|
19
|
$elem->parent( undef ); |
203
|
1
|
|
|
|
|
32
|
$self->reset(1); |
204
|
1
|
|
|
|
|
5
|
return( $elem ); |
205
|
|
|
|
|
|
|
} |
206
|
|
|
|
|
|
|
|
207
|
|
|
|
|
|
|
# Note: method reportValidity is inherited |
208
|
|
|
|
|
|
|
|
209
|
|
|
|
|
|
|
# Note: property required is inherited |
210
|
|
|
|
|
|
|
|
211
|
|
|
|
|
|
|
sub reset |
212
|
|
|
|
|
|
|
{ |
213
|
76
|
|
|
76
|
1
|
172
|
my $self = shift( @_ ); |
214
|
76
|
100
|
|
|
|
194
|
if( scalar( @_ ) ) |
215
|
|
|
|
|
|
|
{ |
216
|
24
|
|
|
|
|
87
|
$self->_reset_select; |
217
|
|
|
|
|
|
|
# Force the rebuilding of the collection of selected options |
218
|
24
|
|
|
|
|
66
|
CORE::delete( $self->{_selected_options} ); |
219
|
24
|
|
|
|
|
44
|
CORE::delete( $self->{selectedindex} ); |
220
|
24
|
|
|
|
|
104
|
return( $self->SUPER::reset( @_ ) ); |
221
|
|
|
|
|
|
|
} |
222
|
52
|
|
|
|
|
212
|
return( $self ); |
223
|
|
|
|
|
|
|
} |
224
|
|
|
|
|
|
|
|
225
|
|
|
|
|
|
|
# Note: property selectedIndex |
226
|
|
|
|
|
|
|
# This is called by the HTML::Object::DOM::Element::Option when selected |
227
|
|
|
|
|
|
|
# sub selectedIndex : lvalue { return( shift->_set_get_number( 'selectedindex', @_ ) ); } |
228
|
|
|
|
|
|
|
sub selectedIndex : lvalue { return( shift->_lvalue({ |
229
|
|
|
|
|
|
|
set => sub |
230
|
|
|
|
|
|
|
{ |
231
|
0
|
|
|
0
|
|
0
|
my( $self, $val ) = @_; |
232
|
0
|
0
|
|
|
|
0
|
return( $self->error({ |
233
|
|
|
|
|
|
|
message => "Index value provided is not an integer.", |
234
|
|
|
|
|
|
|
class => 'HTML::Object::TypeError', |
235
|
|
|
|
|
|
|
}) ) if( !$self->_is_integer( $val ) ); |
236
|
0
|
|
|
|
|
0
|
my $options = $self->options; |
237
|
0
|
0
|
|
|
|
0
|
return( $self->error({ |
238
|
|
|
|
|
|
|
message => "Index value provided is greater than the zero-based total number (" . $options->size . ") of options available.", |
239
|
|
|
|
|
|
|
class => 'HTML::Object::IndexSizeError', |
240
|
|
|
|
|
|
|
}) ) if( $val > $options->size ); |
241
|
0
|
|
|
|
|
0
|
$self->{selectedindex} = $val; |
242
|
0
|
|
|
|
|
0
|
my $elem = $options->index( $val ); |
243
|
0
|
0
|
|
|
|
0
|
return( $self->error({ |
244
|
|
|
|
|
|
|
message => "Somehow, the element found at position $val is not an HTML::Object::DOM::Element::Option object.", |
245
|
|
|
|
|
|
|
class => 'HTML::Object::HierarchyRequestError', |
246
|
|
|
|
|
|
|
}) ) if( !$self->_is_a( $elem => 'HTML::Object::DOM::Element::Option' ) ); |
247
|
0
|
|
|
|
|
0
|
$elem->defaultSelected = 1; |
248
|
0
|
|
|
|
|
0
|
return( $elem ); |
249
|
|
|
|
|
|
|
}, |
250
|
|
|
|
|
|
|
get => sub |
251
|
|
|
|
|
|
|
{ |
252
|
2
|
|
|
2
|
|
1261
|
my $self = shift( @_ ); |
253
|
2
|
50
|
33
|
|
|
22
|
return( $self->{selectedindex} ) if( $self->{selectedindex} && !$self->_is_select_reset ); |
254
|
|
|
|
|
|
|
# Get all options |
255
|
2
|
|
|
|
|
9
|
my $options = $self->options; |
256
|
|
|
|
|
|
|
# Get all selected ones; could be empty |
257
|
2
|
|
|
|
|
13
|
my $selected = $self->selectedOptions; |
258
|
2
|
100
|
|
|
|
19
|
return if( $selected->is_empty ); |
259
|
|
|
|
|
|
|
# Get the first selected one |
260
|
1
|
|
|
|
|
29
|
my $elem = $selected->index(0); |
261
|
|
|
|
|
|
|
# Find its index position among all options |
262
|
1
|
|
|
|
|
70
|
my $pos = $options->pos( $elem ); |
263
|
|
|
|
|
|
|
# and return it. |
264
|
1
|
|
|
|
|
34
|
return( $self->{selectedindex} = $pos ); |
265
|
|
|
|
|
|
|
}, |
266
|
2
|
|
|
2
|
1
|
83026
|
}, @_ ) ); } |
267
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
# Note: property selectedOptions read-only |
269
|
|
|
|
|
|
|
sub selectedOptions |
270
|
|
|
|
|
|
|
{ |
271
|
4
|
|
|
4
|
1
|
41694
|
my $self = shift( @_ ); |
272
|
4
|
100
|
66
|
|
|
20
|
return( $self->{_selected_options} ) if( $self->{_selected_options} && !$self->_is_select_reset ); |
273
|
2
|
|
|
6
|
|
10
|
my $list = $self->options->filter(sub{ $_->defaultSelected }); |
|
6
|
|
|
|
|
3614
|
|
274
|
|
|
|
|
|
|
$self->children->for(sub |
275
|
|
|
|
|
|
|
{ |
276
|
14
|
|
|
14
|
|
610
|
my( $i, $elem ) = @_; |
277
|
|
|
|
|
|
|
|
278
|
2
|
|
|
|
|
1897
|
}); |
279
|
|
|
|
|
|
|
# The content of the collection is refreshed, but the collection object itself does not change, so the user can poll it |
280
|
2
|
50
|
|
|
|
56
|
unless( $self->{_selected_options} ) |
281
|
|
|
|
|
|
|
{ |
282
|
2
|
50
|
|
|
|
14
|
$self->_load_class( 'HTML::Object::DOM::Collection' ) || return( $self->pass_error ); |
283
|
2
|
|
50
|
|
|
113
|
$self->{_selected_options} = HTML::Object::DOM::Collection->new || |
284
|
|
|
|
|
|
|
return( $self->pass_error( HTML::Object::DOM::Collection->error ) ); |
285
|
|
|
|
|
|
|
} |
286
|
2
|
|
|
|
|
22
|
$self->{_selected_options}->set( $list ); |
287
|
2
|
|
|
|
|
39
|
$self->_remove_select_reset; |
288
|
2
|
|
|
|
|
16
|
return( $self->{_selected_options} ); |
289
|
|
|
|
|
|
|
} |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
# Note: method setCustomValidity is inherited |
292
|
|
|
|
|
|
|
|
293
|
|
|
|
|
|
|
# Note: property size |
294
|
0
|
|
|
0
|
1
|
0
|
sub size : lvalue { return( shift->_set_get_property( 'size', @_ ) ); } |
295
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
# Note: property type read-only is inherited |
297
|
|
|
|
|
|
|
|
298
|
|
|
|
|
|
|
# Note: property validationMessage read-only is inherited |
299
|
|
|
|
|
|
|
|
300
|
|
|
|
|
|
|
# Note: property validity read-only is inherited |
301
|
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
# Note: property value is inherited |
303
|
|
|
|
|
|
|
|
304
|
|
|
|
|
|
|
# Note: property willValidate read-only is inherited |
305
|
|
|
|
|
|
|
|
306
|
40
|
|
|
40
|
|
380
|
sub _is_select_reset { return( CORE::length( shift->{_select_reset} ) ); } |
307
|
|
|
|
|
|
|
|
308
|
26
|
|
|
26
|
|
70
|
sub _remove_select_reset { return( CORE::delete( shift->{_select_reset} ) ); } |
309
|
|
|
|
|
|
|
|
310
|
|
|
|
|
|
|
sub _reset_select |
311
|
|
|
|
|
|
|
{ |
312
|
24
|
|
|
24
|
|
41
|
my $self = shift( @_ ); |
313
|
24
|
|
|
|
|
63
|
$self->{_select_reset}++; |
314
|
|
|
|
|
|
|
# Force it to recompute |
315
|
24
|
|
|
|
|
105
|
$self->options; |
316
|
24
|
|
|
|
|
216
|
return( $self ); |
317
|
|
|
|
|
|
|
} |
318
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
1; |
320
|
|
|
|
|
|
|
# NOTE: POD |
321
|
|
|
|
|
|
|
__END__ |
322
|
|
|
|
|
|
|
|
323
|
|
|
|
|
|
|
=encoding utf-8 |
324
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
=head1 NAME |
326
|
|
|
|
|
|
|
|
327
|
|
|
|
|
|
|
HTML::Object::DOM::Element::Select - HTML Object DOM Select Class |
328
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
=head1 SYNOPSIS |
330
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
use HTML::Object::DOM::Element::Select; |
332
|
|
|
|
|
|
|
my $select = HTML::Object::DOM::Element::Select->new || |
333
|
|
|
|
|
|
|
die( HTML::Object::DOM::Element::Select->error, "\n" ); |
334
|
|
|
|
|
|
|
|
335
|
|
|
|
|
|
|
=head1 VERSION |
336
|
|
|
|
|
|
|
|
337
|
|
|
|
|
|
|
v0.2.0 |
338
|
|
|
|
|
|
|
|
339
|
|
|
|
|
|
|
=head1 DESCRIPTION |
340
|
|
|
|
|
|
|
|
341
|
|
|
|
|
|
|
This interface represents a C<<select>> HTML Element. These elements also share all of the properties and methods of other HTML elements via the L<HTML::Object::DOM::Element> interface. |
342
|
|
|
|
|
|
|
|
343
|
|
|
|
|
|
|
=head1 INHERITANCE |
344
|
|
|
|
|
|
|
|
345
|
|
|
|
|
|
|
+-----------------------+ +---------------------------+ +-------------------------+ +----------------------------+ +------------------------------------+ |
346
|
|
|
|
|
|
|
| HTML::Object::Element | --> | HTML::Object::EventTarget | --> | HTML::Object::DOM::Node | --> | HTML::Object::DOM::Element | --> | HTML::Object::DOM::Element::Select | |
347
|
|
|
|
|
|
|
+-----------------------+ +---------------------------+ +-------------------------+ +----------------------------+ +------------------------------------+ |
348
|
|
|
|
|
|
|
|
349
|
|
|
|
|
|
|
=head1 PROPERTIES |
350
|
|
|
|
|
|
|
|
351
|
|
|
|
|
|
|
Inherits properties from its parent L<HTML::Object::DOM::Element> |
352
|
|
|
|
|
|
|
|
353
|
|
|
|
|
|
|
=head2 autofocus |
354
|
|
|
|
|
|
|
|
355
|
|
|
|
|
|
|
A boolean value reflecting the autofocus L<HTML attribute|HTML::Object::DOM::Attribute>, which indicates whether the control should have input focus when the page loads, unless the user overrides it, for example by typing in a different control. Only one form-associated element in a document can have this attribute specified. |
356
|
|
|
|
|
|
|
|
357
|
|
|
|
|
|
|
Example: |
358
|
|
|
|
|
|
|
|
359
|
|
|
|
|
|
|
<select id="mySelect" autofocus> |
360
|
|
|
|
|
|
|
<option>Option 1</option> |
361
|
|
|
|
|
|
|
<option>Option 2</option> |
362
|
|
|
|
|
|
|
</select> |
363
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
# Check if the autofocus attribute on the <select> |
365
|
|
|
|
|
|
|
my $hasAutofocus = $doc->getElementById('mySelect')->autofocus; |
366
|
|
|
|
|
|
|
|
367
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/autofocus> |
368
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
=head2 disabled |
370
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
A boolean value reflecting the disabled L<HTML attribute|HTML::Object::DOM::Attribute>, which indicates whether the control is disabled. If it is disabled, it does not accept clicks. |
372
|
|
|
|
|
|
|
|
373
|
|
|
|
|
|
|
Example: |
374
|
|
|
|
|
|
|
|
375
|
|
|
|
|
|
|
<label> |
376
|
|
|
|
|
|
|
Allow drinks? |
377
|
|
|
|
|
|
|
<input id="allow-drinks" type="checkbox" /> |
378
|
|
|
|
|
|
|
</label> |
379
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
<label for="drink-select">Drink selection:</label> |
381
|
|
|
|
|
|
|
<select id="drink-select" disabled> |
382
|
|
|
|
|
|
|
<option value="1">Water</option> |
383
|
|
|
|
|
|
|
<option value="2">Beer</option> |
384
|
|
|
|
|
|
|
<option value="3">Pepsi</option> |
385
|
|
|
|
|
|
|
<option value="4">Whisky</option> |
386
|
|
|
|
|
|
|
</select> |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
my $allowDrinksCheckbox = $doc->getElementById( 'allow-drinks' ); |
389
|
|
|
|
|
|
|
my $drinkSelect = $doc->getElementById( 'drink-select' ); |
390
|
|
|
|
|
|
|
|
391
|
|
|
|
|
|
|
$allowDrinksCheckbox->addEventListener( change => sub |
392
|
|
|
|
|
|
|
{ |
393
|
|
|
|
|
|
|
if( $event->target->checked ) |
394
|
|
|
|
|
|
|
{ |
395
|
|
|
|
|
|
|
$drinkSelect->disabled = 0; # false |
396
|
|
|
|
|
|
|
} |
397
|
|
|
|
|
|
|
else |
398
|
|
|
|
|
|
|
{ |
399
|
|
|
|
|
|
|
$drinkSelect->disabled = 1; # true |
400
|
|
|
|
|
|
|
} |
401
|
|
|
|
|
|
|
}, { capture => 0}); |
402
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/disabled> |
404
|
|
|
|
|
|
|
|
405
|
|
|
|
|
|
|
=head2 form |
406
|
|
|
|
|
|
|
|
407
|
|
|
|
|
|
|
Read-only. |
408
|
|
|
|
|
|
|
|
409
|
|
|
|
|
|
|
An L<HTML::Object::DOM::Element::Form> referencing the form that this element is associated with. If the element is not associated with of a <form> element, then it returns C<undef>. |
410
|
|
|
|
|
|
|
|
411
|
|
|
|
|
|
|
Example: |
412
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
<form id="pet-form"> |
414
|
|
|
|
|
|
|
<label for="pet-select">Choose a pet</label> |
415
|
|
|
|
|
|
|
<select name="pets" id="pet-select"> |
416
|
|
|
|
|
|
|
<option value="dog">Dog</option> |
417
|
|
|
|
|
|
|
<option value="cat">Cat</option> |
418
|
|
|
|
|
|
|
<option value="parrot">Parrot</option> |
419
|
|
|
|
|
|
|
</select> |
420
|
|
|
|
|
|
|
|
421
|
|
|
|
|
|
|
<button type="submit">Submit</button> |
422
|
|
|
|
|
|
|
</form> |
423
|
|
|
|
|
|
|
|
424
|
|
|
|
|
|
|
<label for="lunch-select">Choose your lunch</label> |
425
|
|
|
|
|
|
|
<select name="lunch" id="lunch-select"> |
426
|
|
|
|
|
|
|
<option value="salad">Salad</option> |
427
|
|
|
|
|
|
|
<option value="sandwich">Sandwich</option> |
428
|
|
|
|
|
|
|
</select> |
429
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
my $petSelect = $doc->getElementById( 'pet-select' ); |
431
|
|
|
|
|
|
|
my $petForm = $petSelect->form; # <form id="pet-form"> |
432
|
|
|
|
|
|
|
|
433
|
|
|
|
|
|
|
my $lunchSelect = $doc->getElementById( 'lunch-select' ); |
434
|
|
|
|
|
|
|
my $lunchForm = $lunchSelect->form; # undef |
435
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/form> |
437
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
=head2 labels |
439
|
|
|
|
|
|
|
|
440
|
|
|
|
|
|
|
Read-only. |
441
|
|
|
|
|
|
|
|
442
|
|
|
|
|
|
|
A L<HTML::Object::DOM::NodeList> of L<label elements|HTML::Object::DOM::Element::Label> associated with the element. |
443
|
|
|
|
|
|
|
|
444
|
|
|
|
|
|
|
Example: |
445
|
|
|
|
|
|
|
|
446
|
|
|
|
|
|
|
<label id="label1" for="test">Label 1</label> |
447
|
|
|
|
|
|
|
<select id="test"> |
448
|
|
|
|
|
|
|
<option value="1">Option 1</option> |
449
|
|
|
|
|
|
|
<option value="2">Option 2</option> |
450
|
|
|
|
|
|
|
</select> |
451
|
|
|
|
|
|
|
<label id="label2" for="test">Label 2</label> |
452
|
|
|
|
|
|
|
|
453
|
|
|
|
|
|
|
window->addEventListener( DOMContentLoaded => sub |
454
|
|
|
|
|
|
|
{ |
455
|
|
|
|
|
|
|
my $select = $doc->getElementById( 'test' ); |
456
|
|
|
|
|
|
|
for( my $i = 0; $i < $select->labels->length; $i++ ) |
457
|
|
|
|
|
|
|
{ |
458
|
|
|
|
|
|
|
say( $select->labels->[$i]->textContent ); # "Label 1" and "Label 2" |
459
|
|
|
|
|
|
|
} |
460
|
|
|
|
|
|
|
}); |
461
|
|
|
|
|
|
|
|
462
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/labels> |
463
|
|
|
|
|
|
|
|
464
|
|
|
|
|
|
|
=head2 length |
465
|
|
|
|
|
|
|
|
466
|
|
|
|
|
|
|
An unsigned long that reflects the number of L<option elements|HTML::Object::DOM::Element::Option> in this select element. |
467
|
|
|
|
|
|
|
|
468
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/length> |
469
|
|
|
|
|
|
|
|
470
|
|
|
|
|
|
|
=head2 multiple |
471
|
|
|
|
|
|
|
|
472
|
|
|
|
|
|
|
A boolean value reflecting the multiple L<HTML attribute|HTML::Object::DOM::Attribute>, which indicates whether multiple items can be selected. |
473
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/multiple> |
475
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
=head2 name |
477
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
A string reflecting the name L<HTML attribute|HTML::Object::DOM::Attribute>, containing the name of this control used by servers and DOM search functions. |
479
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/name> |
481
|
|
|
|
|
|
|
|
482
|
|
|
|
|
|
|
=head2 options |
483
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
Read-only. |
485
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
An L<OptionsCollection|HTML::Object::DOM::Element::OptionsCollection> representing the set of L<option elements|HTML::Object::DOM::Element::Option> contained by this element. |
487
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
Example: |
489
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
<label for="test">Label</label> |
491
|
|
|
|
|
|
|
<select id="test"> |
492
|
|
|
|
|
|
|
<option value="1">Option 1</option> |
493
|
|
|
|
|
|
|
<option value="2">Option 2</option> |
494
|
|
|
|
|
|
|
</select> |
495
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
window->addEventListener( DOMContentLoaded => sub |
497
|
|
|
|
|
|
|
{ |
498
|
|
|
|
|
|
|
my $select = $doc->getElementById( 'test' ); |
499
|
|
|
|
|
|
|
for( my $i = 0; $i < $select->options->length; $i++ ) |
500
|
|
|
|
|
|
|
{ |
501
|
|
|
|
|
|
|
say( $select->options->[$i]->label ); # "Option 1" and "Option 2" |
502
|
|
|
|
|
|
|
} |
503
|
|
|
|
|
|
|
}); |
504
|
|
|
|
|
|
|
|
505
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/options> |
506
|
|
|
|
|
|
|
|
507
|
|
|
|
|
|
|
=head2 required |
508
|
|
|
|
|
|
|
|
509
|
|
|
|
|
|
|
A boolean value reflecting the required L<HTML attribute|HTML::Object::DOM::Attribute>, which indicates whether the user is required to select a value before submitting the form. |
510
|
|
|
|
|
|
|
|
511
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/required> |
512
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
=head2 selectedIndex |
514
|
|
|
|
|
|
|
|
515
|
|
|
|
|
|
|
A long reflecting the index of the first selected L<option element|HTML::Object::DOM::Element::Option>. The value C<undef> indicates no element is selected. |
516
|
|
|
|
|
|
|
|
517
|
|
|
|
|
|
|
Example: |
518
|
|
|
|
|
|
|
|
519
|
|
|
|
|
|
|
<p id="p">selectedIndex: 0</p> |
520
|
|
|
|
|
|
|
<select id="select"> |
521
|
|
|
|
|
|
|
<option selected>Option A</option> |
522
|
|
|
|
|
|
|
<option>Option B</option> |
523
|
|
|
|
|
|
|
<option>Option C</option> |
524
|
|
|
|
|
|
|
<option>Option D</option> |
525
|
|
|
|
|
|
|
<option>Option E</option> |
526
|
|
|
|
|
|
|
</select> |
527
|
|
|
|
|
|
|
|
528
|
|
|
|
|
|
|
my $selectElem = $doc->getElementById('select'); |
529
|
|
|
|
|
|
|
my $pElem = $doc->getElementById('p'); |
530
|
|
|
|
|
|
|
|
531
|
|
|
|
|
|
|
# When a new <option> is selected |
532
|
|
|
|
|
|
|
$selectElem->addEventListener( change => sub |
533
|
|
|
|
|
|
|
{ |
534
|
|
|
|
|
|
|
my $index = $selectElem->selectedIndex; |
535
|
|
|
|
|
|
|
# Add that data to the <p> |
536
|
|
|
|
|
|
|
$pElem->innerHTML = 'selectedIndex: ' . $index; |
537
|
|
|
|
|
|
|
}) |
538
|
|
|
|
|
|
|
|
539
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/selectedIndex> |
540
|
|
|
|
|
|
|
|
541
|
|
|
|
|
|
|
=head2 selectedOptions |
542
|
|
|
|
|
|
|
|
543
|
|
|
|
|
|
|
Read-only. |
544
|
|
|
|
|
|
|
|
545
|
|
|
|
|
|
|
An L<Collection|HTML::Object::DOM::Collection> representing the set of L<option elements|HTML::Object::DOM::Element::Option> that are selected. |
546
|
|
|
|
|
|
|
|
547
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/selectedOptions> |
548
|
|
|
|
|
|
|
|
549
|
|
|
|
|
|
|
=head2 size |
550
|
|
|
|
|
|
|
|
551
|
|
|
|
|
|
|
A long reflecting the size L<HTML attribute|HTML::Object::DOM::Attribute>, which contains the number of visible items in the control. The default is 1, unless multiple is true, in which case it is 4. |
552
|
|
|
|
|
|
|
|
553
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/size> |
554
|
|
|
|
|
|
|
|
555
|
|
|
|
|
|
|
=head2 type |
556
|
|
|
|
|
|
|
|
557
|
|
|
|
|
|
|
Read-only. |
558
|
|
|
|
|
|
|
|
559
|
|
|
|
|
|
|
A string represeting the form control's type. When multiple is true, it returns C<select-multiple>; otherwise, it returns C<select-one>. |
560
|
|
|
|
|
|
|
|
561
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/type> |
562
|
|
|
|
|
|
|
|
563
|
|
|
|
|
|
|
=head2 validationMessage |
564
|
|
|
|
|
|
|
|
565
|
|
|
|
|
|
|
Read-only. |
566
|
|
|
|
|
|
|
|
567
|
|
|
|
|
|
|
A string representing a localized message that describes the validation constraints that the control does not satisfy (if any). This attribute is the empty string if the control is not a candidate for constraint validation (willValidate is false), or it satisfies its constraints. |
568
|
|
|
|
|
|
|
|
569
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/validationMessage> |
570
|
|
|
|
|
|
|
|
571
|
|
|
|
|
|
|
=head2 validity |
572
|
|
|
|
|
|
|
|
573
|
|
|
|
|
|
|
Read-only. |
574
|
|
|
|
|
|
|
|
575
|
|
|
|
|
|
|
A L<ValidityState|HTML::Object::DOM::ValidityState> object reflecting the validity state that this control is in. |
576
|
|
|
|
|
|
|
|
577
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/validity> |
578
|
|
|
|
|
|
|
|
579
|
|
|
|
|
|
|
=head2 value |
580
|
|
|
|
|
|
|
|
581
|
|
|
|
|
|
|
A string reflecting the value of the form control. Returns the value property of the first selected option element if there is one, otherwise the empty string. |
582
|
|
|
|
|
|
|
|
583
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/value> |
584
|
|
|
|
|
|
|
|
585
|
|
|
|
|
|
|
=head2 willValidate |
586
|
|
|
|
|
|
|
|
587
|
|
|
|
|
|
|
Read-only. |
588
|
|
|
|
|
|
|
|
589
|
|
|
|
|
|
|
A boolean value that indicates whether the button is a candidate for constraint validation. It is false if any conditions bar it from constraint validation. |
590
|
|
|
|
|
|
|
|
591
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/willValidate> |
592
|
|
|
|
|
|
|
|
593
|
|
|
|
|
|
|
=head1 METHODS |
594
|
|
|
|
|
|
|
|
595
|
|
|
|
|
|
|
Inherits methods from its parent L<HTML::Object::DOM::Element> |
596
|
|
|
|
|
|
|
|
597
|
|
|
|
|
|
|
=head2 add |
598
|
|
|
|
|
|
|
|
599
|
|
|
|
|
|
|
Provided with an C<item> and optionally an position offset C<before> which to insert the item and this adds an element to the collection of option elements for this select element. |
600
|
|
|
|
|
|
|
|
601
|
|
|
|
|
|
|
=over 4 |
602
|
|
|
|
|
|
|
|
603
|
|
|
|
|
|
|
=item C<item> is an L<Option element|HTML::Object::DOM::Element::Option> or L<OptGroup element|HTML::Object::DOM::Element::OptGroup> |
604
|
|
|
|
|
|
|
|
605
|
|
|
|
|
|
|
=item C<before> is optional and an element of the collection, or an index of type long, representing the item should be inserted before. If this parameter is C<undef> (or the index does not exist), the new element is appended to the end of the collection. |
606
|
|
|
|
|
|
|
|
607
|
|
|
|
|
|
|
=back |
608
|
|
|
|
|
|
|
|
609
|
|
|
|
|
|
|
Example: |
610
|
|
|
|
|
|
|
|
611
|
|
|
|
|
|
|
my $sel = $doc->createElement( 'select' ); |
612
|
|
|
|
|
|
|
my $opt1 = $doc->createElement( 'option' ); |
613
|
|
|
|
|
|
|
my $opt2 = $doc->createElement( 'option' ); |
614
|
|
|
|
|
|
|
|
615
|
|
|
|
|
|
|
$opt1->value = 1; |
616
|
|
|
|
|
|
|
$opt1->text = "Option: Value 1"; |
617
|
|
|
|
|
|
|
|
618
|
|
|
|
|
|
|
$opt2->value = 2; |
619
|
|
|
|
|
|
|
$opt2->text = "Option: Value 2"; |
620
|
|
|
|
|
|
|
|
621
|
|
|
|
|
|
|
# No second argument; no 'before' argument |
622
|
|
|
|
|
|
|
$sel->add( $opt1, undef ); |
623
|
|
|
|
|
|
|
# Equivalent to above |
624
|
|
|
|
|
|
|
$sel->add( $opt2 ); |
625
|
|
|
|
|
|
|
|
626
|
|
|
|
|
|
|
Produces the following, conceptually: |
627
|
|
|
|
|
|
|
|
628
|
|
|
|
|
|
|
<select> |
629
|
|
|
|
|
|
|
<option value="1">Option: Value 1</option> |
630
|
|
|
|
|
|
|
<option value="2">Option: Value 2</option> |
631
|
|
|
|
|
|
|
</select> |
632
|
|
|
|
|
|
|
|
633
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/add> |
634
|
|
|
|
|
|
|
|
635
|
|
|
|
|
|
|
=head2 blur |
636
|
|
|
|
|
|
|
|
637
|
|
|
|
|
|
|
Under perl, of course, this does nothing. |
638
|
|
|
|
|
|
|
|
639
|
|
|
|
|
|
|
Under JavaScript, this removes the input focus from this element. This method is now implemented on L<HTML::Object::DOM::Element>. |
640
|
|
|
|
|
|
|
|
641
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/blur> |
642
|
|
|
|
|
|
|
|
643
|
|
|
|
|
|
|
=head2 checkValidity |
644
|
|
|
|
|
|
|
|
645
|
|
|
|
|
|
|
Checks whether the element has any constraints and whether it satisfies them. If the element fails its constraints, the browser fires a cancelable invalid event at the element (and returns false). |
646
|
|
|
|
|
|
|
|
647
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/checkValidity> |
648
|
|
|
|
|
|
|
|
649
|
|
|
|
|
|
|
=head2 focus |
650
|
|
|
|
|
|
|
|
651
|
|
|
|
|
|
|
Under perl, of course, this does nothing. |
652
|
|
|
|
|
|
|
|
653
|
|
|
|
|
|
|
Under JavaScript, this gives input focus to this element. This method is now implemented on L<HTML::Object::DOM::Element>. |
654
|
|
|
|
|
|
|
|
655
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/focus> |
656
|
|
|
|
|
|
|
|
657
|
|
|
|
|
|
|
=head2 item |
658
|
|
|
|
|
|
|
|
659
|
|
|
|
|
|
|
Gets an item from the options collection for this L<select element|HTML::Object::DOM::Select> by providing a zero-based index position. |
660
|
|
|
|
|
|
|
|
661
|
|
|
|
|
|
|
Example: |
662
|
|
|
|
|
|
|
|
663
|
|
|
|
|
|
|
<select id="myFormControl"> |
664
|
|
|
|
|
|
|
<option id="o1">Opt 1</option> |
665
|
|
|
|
|
|
|
<option id="o2">Opt 2</option> |
666
|
|
|
|
|
|
|
</select> |
667
|
|
|
|
|
|
|
|
668
|
|
|
|
|
|
|
# Returns the OptionElement representing #o2 |
669
|
|
|
|
|
|
|
my $sel = $doc->getElementById( 'myFormControl' ); |
670
|
|
|
|
|
|
|
my $elem1 = $sel->item(1); # Opt 2 |
671
|
|
|
|
|
|
|
|
672
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/item> |
673
|
|
|
|
|
|
|
|
674
|
|
|
|
|
|
|
=head2 namedItem |
675
|
|
|
|
|
|
|
|
676
|
|
|
|
|
|
|
Gets the item in the options collection with the specified name. The name string can match either the id or the name attribute of an option node. |
677
|
|
|
|
|
|
|
|
678
|
|
|
|
|
|
|
Example: |
679
|
|
|
|
|
|
|
|
680
|
|
|
|
|
|
|
<select id="myFormControl"> |
681
|
|
|
|
|
|
|
<option id="o1">Opt 1</option> |
682
|
|
|
|
|
|
|
<option id="o2">Opt 2</option> |
683
|
|
|
|
|
|
|
</select> |
684
|
|
|
|
|
|
|
|
685
|
|
|
|
|
|
|
my $elem1 = $doc->getElementById( 'myFormControl' )->namedItem( 'o1' ); # Returns the OptionElement representing #o1 |
686
|
|
|
|
|
|
|
|
687
|
|
|
|
|
|
|
This is, in effect, a shortcut for C<$select->options->namedItem> |
688
|
|
|
|
|
|
|
|
689
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/namedItem> |
690
|
|
|
|
|
|
|
|
691
|
|
|
|
|
|
|
=head2 remove |
692
|
|
|
|
|
|
|
|
693
|
|
|
|
|
|
|
Removes the element at the specified index (zero-based) from the options collection for this select element and return it. |
694
|
|
|
|
|
|
|
|
695
|
|
|
|
|
|
|
Example: |
696
|
|
|
|
|
|
|
|
697
|
|
|
|
|
|
|
<select id="existingList" name="existingList"> |
698
|
|
|
|
|
|
|
<option value="1">Option: Value 1</option> |
699
|
|
|
|
|
|
|
<option value="2">Option: Value 2</option> |
700
|
|
|
|
|
|
|
<option value="3">Option: Value 3</option> |
701
|
|
|
|
|
|
|
</select> |
702
|
|
|
|
|
|
|
|
703
|
|
|
|
|
|
|
my $sel = $doc->getElementById( 'existingList' ); |
704
|
|
|
|
|
|
|
my $removed = $sel->remove(1); |
705
|
|
|
|
|
|
|
|
706
|
|
|
|
|
|
|
HTML is now: |
707
|
|
|
|
|
|
|
|
708
|
|
|
|
|
|
|
<select id="existingList" name="existingList"> |
709
|
|
|
|
|
|
|
<option value="1">Option: Value 1</option> |
710
|
|
|
|
|
|
|
<option value="3">Option: Value 3</option> |
711
|
|
|
|
|
|
|
</select> |
712
|
|
|
|
|
|
|
|
713
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/remove> |
714
|
|
|
|
|
|
|
|
715
|
|
|
|
|
|
|
=head2 reportValidity |
716
|
|
|
|
|
|
|
|
717
|
|
|
|
|
|
|
This method reports the problems with the constraints on the element, if any, to the user. If there are problems, it fires a cancelable invalid event at the element, and returns false; if there are no problems, it returns true. |
718
|
|
|
|
|
|
|
|
719
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/reportValidity> |
720
|
|
|
|
|
|
|
|
721
|
|
|
|
|
|
|
=head2 setCustomValidity |
722
|
|
|
|
|
|
|
|
723
|
|
|
|
|
|
|
Sets the custom validity message for the selection element to the specified message. Use the empty string to indicate that the element does not have a custom validity error. |
724
|
|
|
|
|
|
|
|
725
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement/setCustomValidity> |
726
|
|
|
|
|
|
|
|
727
|
|
|
|
|
|
|
=head1 EVENTS |
728
|
|
|
|
|
|
|
|
729
|
|
|
|
|
|
|
Event listeners for those events can also be found by prepending C<on> before the event type: |
730
|
|
|
|
|
|
|
|
731
|
|
|
|
|
|
|
C<click> event listeners can be set also with C<onclick> method: |
732
|
|
|
|
|
|
|
|
733
|
|
|
|
|
|
|
$e->onclick(sub{ # do something }); |
734
|
|
|
|
|
|
|
# or as an lvalue method |
735
|
|
|
|
|
|
|
$e->onclick = sub{ # do something }; |
736
|
|
|
|
|
|
|
|
737
|
|
|
|
|
|
|
Note that, under perl, almost no event are fired, but you can trigger them yourself. |
738
|
|
|
|
|
|
|
|
739
|
|
|
|
|
|
|
=head2 change |
740
|
|
|
|
|
|
|
|
741
|
|
|
|
|
|
|
Fires when the user selects an option, but since there is no user interaction, this event is fired when the C<selectedIndex> value changes, which you can change yourself. |
742
|
|
|
|
|
|
|
|
743
|
|
|
|
|
|
|
Example: |
744
|
|
|
|
|
|
|
|
745
|
|
|
|
|
|
|
<label>Choose an ice cream flavor: |
746
|
|
|
|
|
|
|
<select class="ice-cream" name="ice-cream"> |
747
|
|
|
|
|
|
|
<option value="">Select One …</option> |
748
|
|
|
|
|
|
|
<option value="chocolate">Chocolate</option> |
749
|
|
|
|
|
|
|
<option value="sardine">Sardine</option> |
750
|
|
|
|
|
|
|
<option value="vanilla">Vanilla</option> |
751
|
|
|
|
|
|
|
</select> |
752
|
|
|
|
|
|
|
</label> |
753
|
|
|
|
|
|
|
|
754
|
|
|
|
|
|
|
<div class="result"></div> |
755
|
|
|
|
|
|
|
|
756
|
|
|
|
|
|
|
my $selectElement = $doc->querySelector('.ice-cream'); |
757
|
|
|
|
|
|
|
|
758
|
|
|
|
|
|
|
$selectElement->addEventListener( change => sub |
759
|
|
|
|
|
|
|
{ |
760
|
|
|
|
|
|
|
my $result = $doc->querySelector( '.$result' ); |
761
|
|
|
|
|
|
|
$result->textContent = "You like " . $event->target->value; |
762
|
|
|
|
|
|
|
}); |
763
|
|
|
|
|
|
|
|
764
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/change_event> |
765
|
|
|
|
|
|
|
|
766
|
|
|
|
|
|
|
=head2 input |
767
|
|
|
|
|
|
|
|
768
|
|
|
|
|
|
|
Fires when the value of an <input>, <select>, or <textarea> element has been changed. |
769
|
|
|
|
|
|
|
|
770
|
|
|
|
|
|
|
See also L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/input_event> |
771
|
|
|
|
|
|
|
|
772
|
|
|
|
|
|
|
=head2 reset |
773
|
|
|
|
|
|
|
|
774
|
|
|
|
|
|
|
Reset the cache flag so that some data will be recomputed. The cache is design to avoid doing useless computing repeatedly when there is no change of data. |
775
|
|
|
|
|
|
|
|
776
|
|
|
|
|
|
|
=head1 AUTHOR |
777
|
|
|
|
|
|
|
|
778
|
|
|
|
|
|
|
Jacques Deguest E<lt>F<jack@deguest.jp>E<gt> |
779
|
|
|
|
|
|
|
|
780
|
|
|
|
|
|
|
=head1 SEE ALSO |
781
|
|
|
|
|
|
|
|
782
|
|
|
|
|
|
|
L<Mozilla documentation|https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement>, L<Mozilla documentation on select element|https://developer.mozilla.org/en-US/docs/Web/HTML/Element/select> |
783
|
|
|
|
|
|
|
|
784
|
|
|
|
|
|
|
=head1 COPYRIGHT & LICENSE |
785
|
|
|
|
|
|
|
|
786
|
|
|
|
|
|
|
Copyright(c) 2021 DEGUEST Pte. Ltd. |
787
|
|
|
|
|
|
|
|
788
|
|
|
|
|
|
|
All rights reserved |
789
|
|
|
|
|
|
|
|
790
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. |
791
|
|
|
|
|
|
|
|
792
|
|
|
|
|
|
|
=cut |