我如何检查元素是否可以承载 Shadow DOM?

How can i check whether an element can host Shadow DOM?

允许阴影的元素DOM在此处指定: https://docs.w3cub.com/dom/element/attachshadow/

我如何验证元素是否支持 Shadow DOM?

if (myElement.attachShadow) {
    ...
}

好像不行。

你可以尝试这样做:

if (document.myElement.createShadowRoot || document.myElement.attachShadow) {
    // support shadow DOM
} else {
    // not support
}

如果不支持,您可以尝试捕获。

try {
   let shadowRoot = elem.attachShadow( { mode: "open" } );
   shadowRoot.innerHTML = ...;
   return true;
} catch( err ) {
   return false;
}

你也可以把它变成一个助手,但如果你需要多次使用它,那么在检查每个元素之后存储结果可能是个好主意。

function canAttachShadow( elem ) {
  try {
    elem.cloneNode().attachShadow( { mode: "open" } );
    return true;
  }
  catch( err ) {
    return false;
  }
}
  
console.log( "a", canAttachShadow( document.createElement( "a" ) ) );
console.log( "article", canAttachShadow( document.createElement( "article" ) ) );

如果你真的愿意,你也可以使用 specs 算法,它结合了 valid-custom-element-name 和 您文章中的 white list(即今天,“文章”、“旁白”、 "blockquote", "body", "div", "footer", "h1", "h2", "h3", "h4", "h5", "h6", "header", "main ”、“导航”、“p”、“部分”或 "span"),但是这个白名单将来可能会改变,所以任何使用它的代码都需要随着 规格。