Suggestion: Add a way to differentiate `click` events dispatched from `<label>`
Usually, when the <label> element is clicked with a pointer device, with accesskey on <label>, or programmatically (label.click()), a second click event is dispatched on the label’s control,
unless:
label.control.contains(clickEvent.target)evaluates totrue,- the user selects text while clicking the label,
preventDefault()is called in the label’sclickevent,- the label’s control is disabled.
What problem are you trying to solve?
Differentiate between a direct click and an indirect click dispatched from a label (similar to how user agents decide whether to open a picker).
What solutions exist today?
- Using
elementFromPoint(e.clientX, e.clientY), orexplicitOriginalTargetin Firefox.
Code
demo: https://codepen.io/sb3nder/pen/ogxJqyd
let relatedTarget = null;
if (e.explicitOriginalTarget) {
// Firefox
relatedTarget = e.explicitOriginalTarget;
} else {
relatedTarget = document.elementFromPoint(e.clientX, e.clientY);
}
if (e.isTrusted && e.pointerId >= 0) {
if (e.target.contains(relatedTarget)) {
relatedTarget = null;
}
} else {
if (e.offsetX === 0 && e.offsetY === 0) {
relatedTarget = null;
} else {
// guessing
relatedTarget = e.target.labels[0];
}
}
- Setting a flag on the label’s
clickevent, checking the flag value on the control’sclickevent, and clearing the flag onpointerdown, etc.
How would you solve it?
- Repurposing the
relatedTargetproperty on theclickevent to reference the label element.
Example usage:
if (clickEvent.relatedTarget !== null)
console.log('click from label');
if (Array.from(control.labels).include(clickEvent.relatedTarget))
console.log('click from label');
if (clickEvent.relatedTarget === label1)
console.log('click from label1');
else if (clickEvent.relatedTarget === label2)
console.log('click from label2');
-
Adding the new
sourceproperty to theclickevent, referencing the label element. (Considering how it’s currently not used for<summary>'stoggleevent, this may make little sense.) -
Adding a new property to the
clickevent. -
Repurposing an existing property of the
clickevent. -
Something else.
UI Events issue: w3c/uievents#402
Seems somewhat risky that we would repurpose some properties on click event. We'd need to at least have some data on how often sites check .relatedTarget on clicks currently. (doesn't matter if it is null, scripts just do weird things)