【问题标题】:Check if Dom Element is Native / no Custom Element检查 Dom 元素是否为本机/没有自定义元素
【发布时间】:2017-04-04 15:07:21
【问题描述】:

有没有办法在不检查 Javascript 中的所有 Native tagNames 的情况下检查 Dom 元素是原生元素还是(未解析的)自定义元素?

我已经考虑过检查element.constructor === HTMLElement,但<main> (documentation) 标记具有它,因为它是顶级类。

基本上,我需要一种更快、维护更少的方法来检查原生元素。

【问题讨论】:

标签: javascript web-component custom-element


【解决方案1】:

所以在comment of Supersharp 之后,我发现所有自定义元素 tagName 或 is 属性都必须包含连字符,而原生元素永远不会,所以最好的方法是使用这个函数:

function isCustomElement(element){
    if(element.tagName.indexOf("-") !== -1) {
        return true;
    }
    let isAttribute = element.getAttribute("is");
    if(isAttribute === null) {
        return false;
    }
    return isAttribute.indexOf("-") !== -1;
}

就这么简单。

The W3C Standard documentation:

它们包含一个连字符,用于命名空间和确保向前兼容性(因为将来不会将任何元素添加到带有连字符的本地名称的 HTML、SVG 或 MathML)。

【讨论】:

  • 请注意,您也应该使用customElements.get() 来检查元素是真实、已定义的自定义元素还是非原生元素。
  • @Supersharp 但我在帖子中写道,我还想检测未解析的自定义元素,因为我需要检查另一个自定义元素的构造函数中的嵌套自定义元素,其中嵌套的自定义元素可能当时还没有初始化。
  • 所以你应该检查元素是否是带有连字符的本机元素的一部分:w3.org/TR/custom-elements/#custom-elements-core-concepts
  • 你到底是什么意思?
  • 例如annotation-xml 是一个有效的(非自定义)元素
【解决方案2】:

使用:unresolved 伪选择器和.constructor 属性:

var isUnresolved = function(selector) {
  var element = document.querySelector(selector + ':unresolved');
  try {
    return (/HTMLElement/).test(element.constructor);
  } catch (ignore) {
    return false;
  }
};
console.log(
  isUnresolved('foo-bar')
);
console.log(
  isUnresolved('main')
);
<foo-bar></foo-bar>
<main></main>

【讨论】:

  • 好吧,这会起作用,但这里的问题是我已经有了这个元素,我不能只对它做一个 querySelector。即使这样,这也比仅检查每个本机标记名要慢得多。此外,使用正则表达式检查 HTMLElement 比我建议的 element.constructor === HTMLElement 慢得多,这基本上是相同的。由于 Supersharp 的评论,我发现所有 CustomElement 都包含连字符,而原生元素从不包含。
猜你喜欢
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2011-04-08
  • 1970-01-01
  • 2018-07-09
相关资源
最近更新 更多