2017-04-04 7 views
4

Gibt es eine Möglichkeit zu überprüfen, ob ein Dom Element ein Natives Element oder ein (nicht aufgelöstes) benutzerdefiniertes Element ist, ohne alle Native TagNames in Javascript zu überprüfen?Überprüfen, ob Dom Element nativ ist/kein benutzerdefiniertes Element

Ich dachte schon an element.constructor === HTMLElement zu überprüfen, aber das <main> (documentation) Tag hat das, da es Spitzenklasse ist.

Grundsätzlich brauche ich eine schnellere und weniger wartungsintensive Art der Überprüfung für ein natives Element.

+1

Sie sollten diese Frage überprüfen http://stackoverflow.com/q/43055481/4600982 – Supersharp

+0

Danke, wegen dieser Post fand ich die Lösung! Sie müssen nur nach einem Bindestrich im tagName suchen, das ist es! –

Antwort

1

So nach den comment of Supersharp Ich fand heraus, dass alle benutzerdefinierten Elemente tagName oder das ist Attribut muss einen Bindestrich enthalten und native Elemente tun dies nie, deshalb ist es am besten, diese Funktion zu verwenden:

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

Einfach so.

The W3C Standard documentation:

Sie enthalten einen Bindestrich, für Namespacing verwendet und Vorwärtskompatibilität zu gewährleisten (da werden keine Elemente in HTML, SVG oder MathML mit Bindestrich enthaltenden lokalen Namen in der Zukunft hinzugefügt werden).

+0

Beachten Sie, dass Sie 'customElements.get()' auch verwenden sollten, um zu überprüfen, ob das Element ein * real *, ein definiertes benutzerdefiniertes Element oder nur ein nicht-systemeigenes Element ist. – Supersharp

+0

@Supersharp Aber ich schrieb in meinem Post, dass ich auch nicht aufgelöste benutzerdefinierte Elemente erkennen möchte, da ich nach geschachtelten benutzerdefinierten Elementen im Konstruktor eines anderen benutzerdefinierten Elements suchen muss, wo die verschachtelten benutzerdefinierten Elemente zu diesem Zeitpunkt möglicherweise nicht initialisiert werden. –

+1

also sollten Sie prüfen, ob das Element Teil der nativen Elemente mit Bindestrich ist: https://www.w3.org/TR/custom-elements/#custom-elements-core-concepts – Supersharp

0

Verwenden Sie den :unresolved pseudo-Selektor zusammen mit der .constructor Eigenschaft:

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

Nun, das würde funktionieren, aber das Problem hier ist, dass ich bereits das Element habe, ich kann nicht einfach einen QuerySelector darauf tun. Und selbst dann wäre das langsamer als nur jeden nativen tagName zu überprüfen. Auch die Überprüfung für HTMLElement mit einer Regex ist viel langsamer als meine vorgeschlagene element.constructor === HTMLElement, die im Grunde gleich ist. Aufgrund von Supersharps Kommentar habe ich herausgefunden, dass alle CustomElemente einen Bindestrich enthalten, während native Elemente dies nie tun. –

Verwandte Themen