Living
Standard
—
Last
Updated
17
21
March
2023
popover
attribute
All
HTML
elements
may
have
the
popover
content
attribute
set.
When
specified,
the
element
won't
be
rendered
until
it
becomes
shown,
at
which
point
it
will
be
rendered
on
top
of
other
page
content.
The
popover
attribute
is
an
enumerated
attribute
with
the
following
keywords
and
states:
Keyword | State | Brief description |
---|---|---|
auto
| auto | Closes other popovers when opened; has light dismiss . |
The empty string | ||
manual
| manual | Does not close other popovers; does not light dismiss . |
The
popover
attribute's
invalid
value
default
is
the
manual
state
and
its
missing
value
default
is
the
no
popover
state.
The
popover
IDL
attribute
must
reflect
the
popover
attribute,
limited
to
only
known
values
.
Every HTML element has a popover visibility state , initially , with these potential values:
hidden
showing
The
Document
has
an
auto
popover
list
,
which
is
a
list
of
all
the
elements
in
the
Document
's
top
layer
whose
popover
attribute
is
in
the
auto
state,
in
the
same
order.
The
Document
has
a
popover
pointerdown
target
,
which
is
an
HTML
element
or
null,
initially
null.
Every HTML element has a popover invoker , which is an HTML element or null, initially set to null.
Every HTML element has a popover toggle task , initially null, which is either null or a struct which has:
ToggleEvent
.
oldState
attribute.
The following attribute change steps are used for all HTML elements :
If namespace is not null, then return.
If
localName
is
disabled
,
form
,
or
popovertarget
,
then
run
check
and
possibly
close
popover
stack
given
element
's
node
document
.
If
localName
is
not
popover
,
then
return.
If oldValue and value are in different states , then run the hide popover algorithm given element , true, true, and false.
element
.
showPopover
()
popover
attribute
is
in
the
auto
state,
then
this
will
also
close
all
other
auto
popovers
unless
they
are
an
ancestor
of
element
according
to
the
topmost
popover
ancestor
algorithm.
element
.
hidePopover
()
display:
none
to
it.
element
.
togglePopover
()
The
showPopover()
method
steps
are:
Run show popover given this and true.
To show popover , given an HTML element element and a boolean throwExceptions :
If the result of running check popover validity given element , false, and throwExceptions is false, then return.
Assert : element is not in element 's node document 's top layer .
If
the
result
of
firing
an
event
named
beforetoggle
,
using
ToggleEvent
,
with
the
cancelable
attribute
initialized
to
true,
the
oldState
attribute
initialized
to
"
closed
",
and
the
newState
attribute
initialized
to
"
open
"
at
element
is
false,
then
return.
If the result of running check popover validity given element , false, and throwExceptions is false, then return.
Check
popover
validity
is
called
again
because
firing
the
beforetoggle
event
could
have
disconnected
this
element
or
changed
its
popover
attribute.
Let document be element 's node document .
Let shouldRestoreFocus be false.
If
element
's
popover
attribute
is
in
the
auto
state,
then:
Let
originalType
be
the
value
of
element
's
popover
attribute.
Let ancestor be the result of running the topmost popover ancestor algorithm given element .
If ancestor is null, then set ancestor to document .
Run hide all popovers until given ancestor , false, and true.
If
originalType
is
not
equal
to
the
value
of
element
's
popover
attribute,
or
if
the
result
of
running
check
popover
validity
given
element
,
false,
and
throwExceptions
is
false,
then
return.
Check
popover
validity
is
called
again
because
running
hide
all
popovers
until
above
could
have
fired
the
beforetoggle
event,
and
an
event
handler
could
have
disconnected
this
element
or
called
showPopover()
on
this
element.
If the result of running topmost auto popover on document is null, then set shouldRestoreFocus to true.
This ensures that focus is returned to the previously-focused element only for the first popover in a stack.
Set element 's previously focused element to null.
Let originallyFocusedElement be document 's focused area of the document 's DOM anchor .
Add element to document 's top layer .
Set element 's popover visibility state to showing .
Run the popover focusing steps given element .
If
shouldRestoreFocus
is
true
and
element
's
popover
attribute
is
not
in
the
no
popover
state,
then
set
element
's
previously
focused
element
to
originallyFocusedElement
.
Queue
a
popover
toggle
event
task
given
element
,
"
closed
",
and
"
open
".
To queue a popover toggle event task given an element element , a string oldState , and a string newState :
If element 's popover toggle task is not null, then:
Set oldState to element 's popover toggle task 's old state .
Remove element 's popover toggle task 's task from its task queue .
Set element 's popover toggle task to null.
Queue an element task given the user interaction task source and element to run the following steps:
fire
an
event
named
toggle
,
using
ToggleEvent
,
with
the
oldState
attribute
initialized
to
oldState
,
and
the
newState
attribute
initialized
to
newState
at
element
.
Set element 's popover toggle task to null.
Set element 's popover toggle task to a struct with task set to the just-queued task and old state set to oldState .
The
hidePopover()
method
steps
are:
Run the hide popover algorithm given this , true, true, and true.
To hide a popover given an HTML element element , a boolean focusPreviousElement , a boolean fireEvents , and a boolean throwExceptions :
If the result of running check popover validity given element , true, and throwExceptions is false, then return.
Let document be element 's node document .
If
element
's
popover
attribute
is
in
the
auto
state,
then:
Run hide all popovers until given element , focusPreviousElement , and fireEvents .
If the result of running check popover validity given element , true, and throwExceptions is false, then return.
Check
popover
validity
is
called
again
because
running
hide
all
popovers
until
could
have
disconnected
element
or
changed
its
popover
attribute.
Assert : the last item in document 's auto popover list is element .
Set element 's popover invoker to null.
If fireEvents is true:
Fire
an
event
named
beforetoggle
,
using
ToggleEvent
,
with
the
oldState
attribute
initialized
to
"
open
",
and
the
newState
attribute
initialized
to
"
closed
"
at
element
.
If the result of running check popover validity given element , true, and throwExceptions is false, then return.
Check
popover
validity
is
called
again
because
firing
the
beforetoggle
event
could
have
disconnected
element
or
changed
its
popover
attribute.
Set element 's popover visibility state to .
If
fireEvents
is
true,
then
queue
a
popover
toggle
event
task
given
element
,
"
open
",
and
"
closed
".
Let previouslyFocusedElement be element 's previously focused element .
If previouslyFocusedElement is not null, then:
Set element 's previously focused element to null.
If focusPreviousElement is true, then run the focusing steps for previouslyFocusedElement ; the viewport should not be scrolled by doing this step.
The
togglePopover(
force
)
method
steps
are:
If this 's popover visibility state is showing , and force is not present or false, then run the hide popover algorithm given this , true, true, and true.
Otherwise, if force is not present or true, then run show popover given this and true.
To
hide
all
popovers
until
,
given
an
HTML
element
or
Document
endpoint
,
a
boolean
focusPreviousElement
,
and
a
boolean
fireEvents
:
Let document be endpoint 's node document .
Let closeAllOpenPopovers be an algorithm which performs the following steps:
Let popover be document 's topmost auto popover .
While popover is not null:
Run the hide popover algorithm given popover , focusPreviousElement , fireEvents , and false.
Set popover to document 's topmost auto popover .
If
endpoint
is
a
Document
,
then
run
closeAllOpenPopovers
and
return.
Let lastToHide be null.
Let foundEndpoint be false.
For each popover in document 's auto popover list :
If popover is endpoint , then set foundEndpoint to true.
Otherwise, if foundEndpoint is true, then set lastToHide to popover and break .
If foundEndpoint is false, then run closeAllOpenPopovers and return.
While lastToHide is not null and lastToHide 's popover visibility state is showing and document 's auto popover list is not empty:
Run the hide popover algorithm given document 's auto popover list 's last element, focusPreviousElement , fireEvents , and false.
The hide all popovers until algorithm is used in several cases to hide all popovers that don't stay open when something happens. For example, during light-dismiss of a popover, this algorithm ensures that we close only the popovers that aren't related to the node clicked by the user.
To
hide
all
popovers
,
given
a
Document
document
,
run
hide
all
popovers
until
given
document
,
false,
and
false.
To
find
the
topmost
popover
ancestor
,
given
a
Node
newPopover
,
perform
the
following
steps.
They
return
an
HTML
element
or
null.
The topmost popover ancestor algorithm will return the topmost (latest in the auto popover list ) ancestor popover for the provided popover. Popovers can be related to each other in several ways, creating a tree of popovers. There are two paths through which one popover (call it the "child" popover) can have a topmost ancestor popover (call it the "parent" popover):
The popovers are nested within each other in the node tree. In this case, the descendant popover is the "child" and its topmost ancestor popover is the "parent".
An
invoking
element
(e.g.,
a
button
)
has
a
popovertarget
attribute
pointing
to
a
popover.
In
this
case,
the
popover
is
the
"child",
and
the
popover
subtree
the
invoking
element
is
in
is
the
"parent".
The
invoker
has
to
be
in
a
popover
and
reference
an
open
popover.
In each of the relationships formed above, the parent popover has to be strictly earlier in the auto popover list than the child popover, or it does not form a valid ancestral relationship. This eliminates non-showing popovers and self-pointers (e.g., a popover with an anchor attribute that points back to the same popover), and it allows for the construction of a well-formed tree from the (possibly cyclic) graph of connections. For example, if two popovers have anchors pointing to each other, the only valid relationship is that the first one to open is the "parent" and the second is the "child". Only auto popovers are considered.
Let popoverPositions be an empty map .
Let index be 0.
Let document be newPopover 's node document .
For each popover in document 's auto popover list :
Set popoverPositions [ popover ] to index .
Increment index by 1.
Set popoverPositions [ newPopover ] to index .
Increment index by 1.
Let topmostPopoverAncestor be null.
Let checkAncestor be an algorithm which performs the following steps given candidate :
If candidate is null, then return.
Let candidateAncestor be the result of running nearest inclusive open popover given candidate .
If candidateAncestor is null, then return.
Let candidatePosition be popoverPositions [ candidateAncestor ].
If topmostPopoverAncestor is null or popoverPositions [ topmostPopoverAncestor ] is less than candidatePosition , then set topmostPopoverAncestor to candidateAncestor .
Run checkAncestor given the result of running nearest inclusive open popover given newPopover 's parent node within the flat tree .
For each button invoker that is a descendant of newPopover 's root , in tree order :
If invoker 's popover target element is newPopover , then run checkAncestor given invoker .
return topmostPopoverAncestor .
To
find
the
nearest
inclusive
open
popover
given
a
Node
node
,
perform
the
following
steps.
They
return
an
HTML
element
or
null.
Let currentNode be node .
While currentNode is not null:
If
currentNode
's
popover
attribute
is
in
the
auto
state
and
currentNode
's
popover
visibility
state
is
showing
,
then
return
currentNode
.
Set currentNode to currentNode 's parent in the flat tree .
Return null.
To
find
the
topmost
auto
popover
given
a
Document
document
,
perform
the
following
steps.
They
return
an
HTML
element
or
null.
If document 's auto popover list is not empty, then return document 's auto popover list 's last element.
Return null.
To perform the popover focusing steps for an HTML element subject :
Let
control
be
the
focus
delegate
of
subject
given
"
other
"
and
true.
If control is null, then return.
Run the focusing steps given control .
Let topDocument be the active document of control 's node document 's browsing context 's top-level browsing context .
If control 's node document 's origin is not the same as the origin of topDocument , then return.
Empty topDocument 's autofocus candidates .
Set topDocument 's autofocus processed flag to true.
To check popover validity for an HTML element element given a boolean expectedToBeShowing and a boolean throwExceptions , perform the following steps. They throw an exception or return a boolean.
If
element
's
popover
attribute
is
in
the
no
popover
state,
then:
If
throwExceptions
is
true,
then
throw
a
"
NotSupportedError
"
DOMException
.
Return false.
If one of the following conditions is true
element is not connected
expectedToBeShowing is true and element 's popover visibility state is not showing
expectedToBeShowing is false and element 's popover visibility state is not
element 's fullscreen flag is set
then:
If
throwExceptions
is
true,
then
throw
a
"
InvalidStateError
"
DOMException
.
Return false.
Return true.
To
check
and
possibly
close
popover
stack
for
a
Document
document
:
Let stack be document 's auto popover list .
Let index stack 's size - 1.
While index is greater than 0:
If the result of running topmost popover ancestor given stack [ index ] is not stack [ index - 1], then:
Run hide all popovers given document .
Return.
Set index to index - 1.
Check and possibly close popover stack is used to close multiple popovers which are only open due to their ancestral relationship to each other in the case where that ancestral relationship has been broken. Show popover also closes popovers which don't meet this ancestral relationship by calling hide all popovers until .
Buttons may have the following content attributes:
popovertarget
popovertargetaction
If
specified,
the
popovertarget
attribute
value
must
be
the
ID
of
an
element
with
a
popover
attribute
in
the
same
tree
as
the
button
with
the
popovertarget
attribute.
The
popovertargetaction
attribute
is
an
enumerated
attribute
with
the
following
keywords
and
states:
Keyword | State | Brief description |
---|---|---|
toggle
| toggle | Shows or hides the targeted popover element. |
show
| show | Shows the targeted popover element. |
hide
| hide | Hides the targeted popover element. |
The
popovertargetaction
attribute's
invalid
value
default
and
missing
value
default
are
both
the
toggle
state.
The
following
shows
how
the
popovertarget
attribute
in
combination
with
the
popovertargetaction
attribute
can
be
used
to
show
a
popover:
<div popover=auto id="foo">
This is a popover!
</div>
<button popovertarget="foo" popovertargetaction="show">
Show a popover
</button>
The
following
shows
how
the
popovertarget
attribute
can
open
and
close
a
manual
popover,
which
can't
be
closed
with
light
dismiss:
<div popover=manual id="foo">
This is a popover!
</div>
<button popovertarget="foo">
Show or hide a popover
</button>
interface mixin PopoverInvokerElement {
[CEReactions] attribute Element? popoverTargetElement;
[CEReactions] attribute DOMString popoverTargetAction;
};
The
popoverTargetElement
IDL
attribute
must
reflect
the
popovertarget
attribute.
The
popoverTargetAction
IDL
attribute
must
reflect
the
popovertargetaction
attribute,
limited
to
only
known
values
.
To
run
the
popover
target
attribute
activation
behavior
given
a
Node
node
:
Let popover be node 's popover target element .
If popover is null, then return.
If
node
's
popovertargetaction
attribute
is
in
the
show
state
and
popover
's
popover
visibility
state
is
showing
,
then
return.
If
node
's
popovertargetaction
attribute
is
in
the
hide
state
and
popover
's
popover
visibility
state
is
,
then
return.
If popover 's popover visibility state is showing , then run the hide popover algorithm given popover , true, true, and false.
Otherwise, if popover 's popover visibility state is and the result of running check popover validity given popover , false, and false is true:
Set popover 's popover invoker to node .
Run show popover given popover and false.
To
get
the
popover
target
element
given
a
Node
node
,
perform
the
following
steps.
They
return
an
HTML
element
or
null.
If node is not a button , then return null.
If node is disabled , then return null.
If node has a form owner and node is a submit button , then return null.
Let
popoverElement
be
node
's
popovertarget
-associated
element
.
If popoverElement is null, then return null.
If
popoverElement
's
popover
attribute
is
in
the
no
popover
state,
then
return
null.
Return popoverElement .
"Light
dismiss"
means
that
pressing
the
Esc
key
or
clicking
outside
of
a
popover
whose
popover
attribute
is
in
the
auto
state
will
close
the
popover.
Canceling
popovers
:
when
Document
has
a
topmost
auto
popover
showing,
user
agents
may
provide
a
user
interface
that,
upon
activation,
queues
an
element
task
on
the
user
interaction
task
source
given
topmost
auto
popover
to
run
the
hide
popover
algorithm
given
the
topmost
auto
popover
,
true,
true,
and
false.
To
light
dismiss
open
popovers
,
given
an
Event
event
:
Let target be event 's target .
Let topmostPopover be the result of running topmost auto popover given target .
If topmostPopover is null, then return.
Let document be target 's node document .
If
event
is
a
PointerEvent
and
event
's
type
is
pointerdown
,
then:
set
document
's
popover
pointerdown
target
to
the
result
of
running
topmost
clicked
popover
given
target
.
If
event
is
a
PointerEvent
and
event
's
type
is
pointerup
,
then:
Let ancestor be the result of running topmost clicked popover given target .
Let sameTarget be true if ancestor is document 's popover pointerdown target .
Set document 's popover pointerdown target to null.
If ancestor is null, then set ancestor to document .
If sameTarget is true, then run hide all popovers until given ancestor , false, and true.
Light dismiss open popovers will be called by the Pointer Events spec when the user clicks or touches anywhere on the page.
To
find
the
topmost
clicked
popover
,
given
a
Node
node
:
Let clickedPopover be the result of running nearest inclusive open popover given node .
Let invokerPopover be the result of running nearest inclusive target popover for invoker given node .
Let getStackPosition be an algorithm which performs the following steps given an HTML element popover :
Let popoverList be popover 's node document 's auto popover list .
If popover is in popoverList , then return the index of popover in popoverList + 1.
Return 0.
If the result of running getStackPosition given clickedPopover is greater than the result of running getStackPosition given invokerPopover , then return clickedPopover .
Return invokerPopover .
To
find
the
nearest
inclusive
target
popover
for
invoker
given
a
Node
node
:
Let currentNode be node .
While currentNode is not null:
Let targetPopover be currentNode 's popover target element .
If
targetPopover
is
not
null
and
targetPopover
's
popover
attribute
is
in
the
auto
state
and
targetPopover
's
popover
visibility
state
is
showing
,
then
return
targetPopover
.
Set currentNode to currentNode 's ancestor in the flat tree .
ToggleEvent
interface
[Exposed=Window]
interface ToggleEvent : Event {
constructor(DOMString type, optional ToggleEventInit eventInitDict = {});
readonly attribute DOMString oldState;
readonly attribute DOMString newState;
};
dictionary ToggleEventInit : EventInit {
DOMString oldState = "";
DOMString newState = "";
};
event
.
oldState
Set
to
"
closed
"
when
transitioning
from
closed
to
open,
or
set
to
"
open
"
when
transitioning
from
open
to
closed.
event
.
newState
Set
to
"
open
"
when
transitioning
from
closed
to
open,
or
set
to
"
closed
"
when
transitioning
from
open
to
closed.
The
oldState
attribute
must
return
the
value
it
was
initialized
to.
It
is
initialized
to
"
open
"
if
the
element
with
the
popover
attribute's
popover
visibility
state
is
showing
;
otherwise
"
closed
".
The
newState
attribute
must
return
the
value
it
was
initialized
to.
It
is
initialized
to
"
closed
"
if
the
element
with
the
popover
attribute's
popover
visibility
state
is
showing
;
otherwise
"
open
".