My question is about this function: https://developer.mozilla.org/en-US/docs/Web/API/Selection/containsNode and I have created this sandbox: https://codesandbox.io/s/amazing-bartik-smjt2?file=/src/index.js
code:
document.getElementById("app").innerHTML = `
<h1>Hello Vanilla!</h1>
<div>
We use the same configuration.<s> <span id="_span"><img src="http://www.mandysam.com/img/random.jpg" id="_img" alt="" aria-label="" width="40"></span> as Parcel to bundle this </s> sandbox, you can find more
info about Parcel.
<h2 id="y" hidden=true>span selected</h2>
<h2 id="z" hidden=true>img selected</h2>
</div>
`;
document.addEventListener("selectionchange", () => {
const selection = window.getSelection();
let span = document.querySelector("#_span");
const foundSpan = selection.containsNode(span);
let img = document.querySelector("#_img");
const foundImg = selection.containsNode(img);
let y = document.querySelector("#y");
y.toggleAttribute("hidden", !foundSpan);
let z = document.querySelector("#z");
z.toggleAttribute("hidden", !foundImg);
});
I do not understand why I should select at least a character before and after the image so the containsNode returns true on the span element. Is this the expected behavior; the span element supposed to be selected whenever the img is selected, right?
This is the expected behavior.
From the specification for the Selection API:
The interface for
containsNode()is defined as:You have to provide
truefor theallowPartialContainmentargument if you also want to have nodes that are only partially contained considered part of the selection:It works with the image because
imgis is a void element (has no content) and therefore can't be only partially contained in a selection.