Javascript 将getRange与阴影DOM中的两个元素之一一起使用

Javascript 将getRange与阴影DOM中的两个元素之一一起使用,javascript,dom,shadow-dom,Javascript,Dom,Shadow Dom,我试图获得两个给定DOM节点的公共偏移量父节点,当两个节点都在文档中时,它可以完美地工作,但当其中一个节点在阴影DOM中时,它就不能工作 功能IsofSetContainer(元素){ return element.firstElementChild.offsetParent==元素 } 函数findCommonOffsetParent(元素1、元素2){ 常量范围=document.createRange(); if(元素1.比较文档位置(元素2)&节点.文档位置{ 范围设置开始(元素1,0

我试图获得两个给定DOM节点的公共偏移量父节点,当两个节点都在文档中时,它可以完美地工作,但当其中一个节点在阴影DOM中时,它就不能工作

功能IsofSetContainer(元素){
return element.firstElementChild.offsetParent==元素
}
函数findCommonOffsetParent(元素1、元素2){
常量范围=document.createRange();
if(元素1.比较文档位置(元素2)&节点.文档位置{
范围设置开始(元素1,0);
range.setEnd(元素2,0);
}否则{
范围设置开始(元素2,0);
range.setEnd(元素1,0);
}
const{commonAncestorContainer}=范围;
//当两个元素中的一个位于阴影DOM中时,`commonAncestorContainer`
//返回的元素实际上是范围内两个给定元素之一。。。
//出于演示目的,我们检测到这种情况,并将其记录为“console.log”
if([element1,element2]。包括(commonAncestorContainer)){

log('shadowdom您不能定义这样的范围,因为这两个元素位于不同的节点树中

根据:

选择没有定义。实现应该尽最大努力为他们做最好的事情。这里有一种可能的、公认的幼稚方法:

由于不同节点树中的节点从不具有相同的根,因此可能永远不存在跨越多个节点树的有效DOM范围

因此,选择可能只存在于一个节点树中,因为它们是由单个范围定义的。window.getSelection()方法返回的选择永远不会返回阴影树中的选择

阴影根对象的getSelection()方法返回此阴影树中的当前选择

因此,您应该定义两个范围:一个在文档DOM树中,另一个在影子DOM树中

在函数
findCommonOffsetParent()

请注意,根据您的用例,您可以使用嵌套的阴影DOM,因此可能需要递归地搜索阴影根

但在一些简单的情况下(如在您的示例中),处理2个范围应该非常容易

要获得共同祖先,请执行以下操作:

var shadow_host1 = element1.getRootNode().host 
var shadow_host2 = element2.getRootNode().host

if (shadow_host1 ) element1 = shadow_host1
if (shadow_host2 ) element2 = shadow_host2

//create range...

谢谢你,我最终得到了一个类似的解决方案好吧,你比我快!
var shadow_host1 = element1.getRootNode().host 
var shadow_host2 = element2.getRootNode().host

if (shadow_host1 ) element1 = shadow_host1
if (shadow_host2 ) element2 = shadow_host2

//create range...