2017-04-04 115 views
4

有沒有方法檢查Dom元素是否是本地元素或未檢測到的自定義元素(未解析)而未檢查Javascript中的所有Native tagNames?檢查Dom元素是否爲Native/no自定義元素

我已經想到檢查element.constructor === HTMLElement,但<main>documentation)標記具有該標記,因爲它是頂級類。

基本上我需要一個更快,維護更少的檢查本地元素的方法。

+1

你應該檢查這個問題http://stackoverflow.com/q/43055481/4600982 – Supersharp

+0

謝謝,因爲那篇文章,我找到了解決方案!你只需要檢查tagName中的連字符即可! –

回答

1

所以comment of Supersharp後,我發現所有的自定義元素標籤名或爲屬性必須包含一個連字符和本地元素永遠不會做,所以最好的方法是使用這個函數:

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含連字符本地名稱)。

+0

請注意,您也應該使用'customElements.get()'來檢查元素是否是* real *,定義的自定義元素或者只是非本地元素。 – Supersharp

+0

@Supersharp但我在我的文章中寫道,我還想檢測未解析的自定義元素,因爲我需要檢查另一個自定義元素的構造函數內嵌套的自定義元素,其中嵌套的自定義元素當時可能未初始化。 –

+1

所以你應該檢查元素是否是帶連字符的本地元素的一部分:https://www.w3.org/TR/custom-elements/#custom-elements-core-concepts – Supersharp

0

.constructor財產一起使用:unresolved僞選擇:

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>

+0

那麼這將工作,但這裏的問題是,我已經有了元素,我不能只對它做一個querySelector。即使如此,這將比僅檢查每個本地tagName更慢。用正則表達式檢查HTMLElement比我提出的element.constructor === HTMLElement慢得多,它基本上是一樣的。由於Supersharp的評論,我發現所有的CustomElement都包含一個連字符,而native元素從來沒有。 –