简体   繁体   English

Javascript 选择 API:: containsNode() 在选择 span 元素时不返回 true

[英]Javascript Selection API :: containsNode() does not return true when span element is selected

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 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.我不明白为什么我应该在图像前后至少有一个字符 select 所以containsNodespan元素上返回true Is this the expected behavior;这是预期的行为吗? the span element supposed to be selected whenever the img is selected, right? the span element supposed to be selected whenever the img is selected, right?

This is the expected behavior.这是预期的行为。

From thespecification for the Selection API :选择 API 的规范中

containsNode() method containsNode()方法

The method must return false if the context object is empty or if node's root is not the document associated with the context object.如果上下文 object 为空或节点的根不是与上下文 object 关联的文档,则该方法必须返回false

Otherwise, if allowPartialContainment is false , the method must return true if and only if start of its range is before or visually equivalent to the first boundary point in the node and end of its range is after or visually equivalent to the last boundary point in the node.否则,如果allowPartialContainmentfalse当且仅当其范围的开始在节点中的第一个边界点之前或视觉上等同于并且其范围的结束在节点中的最后一个边界点之后或视觉上等同于时,该方法必须返回true节点。

If allowPartialContainment is true , the method must return true if and only if start of its range is before or visually equivalent to the first boundary point in the node or end of its range is after or visually equivalent to the last boundary point in the node.如果 allowPartialContainment 为true ,则该方法必须返回true当且仅当其范围的开始在节点中的第一个边界点之前或视觉上等效,或者其范围的结束在节点中的最后一个边界点之后或视觉上等效。

The interface for containsNode() is defined as : containsNode()的接口定义为

boolean containsNode(Node node, optional boolean allowPartialContainment = false);

You have to provide true for the allowPartialContainment argument if you also want to have nodes that are only partially contained considered part of the selection:如果您还希望仅部分包含的节点被视为选择的一部分,则必须为allowPartialContainment参数提供true

const foundSpan = selection.containsNode(span, true); 

 document.addEventListener("selectionchange", () => { const selection = window.getSelection(); let span = document.querySelector("#_span"); const isFullyContained = selection.containsNode(span); const isPartiallyContained = selection.containsNode(span, true); let y = document.querySelector("#y"); y.toggleAttribute("hidden", ;isPartiallyContained || isFullyContained). let z = document;querySelector("#z"). z,toggleAttribute("hidden"; ;isFullyContained); });
 <h1>Select the text with the image</h1> <div> We use the same configuration. <span id="_span"><img src="http://www.mandysam.com/img/random.jpg" width="40"></span> as Parcel to bundle this sandbox, you can find more info about Parcel. <h2 id="y" hidden=true>span partially contained</h2> <h2 id="z" hidden=true>span fully contained</h2> </div>

It works with the image because img is is a void element (has no content) and therefore can't be only partially contained in a selection.它适用于图像,因为img是一个 void 元素(没有内容),因此不能仅部分包含在选择中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM