Определение имени тега из конструктора

#javascript #html #dom

#javascript #HTML #dom

Вопрос:

Возможно ли получить имя тега из конструктора, как если бы оно было статическим? Есть ли веская причина, по которой они не могут быть статически доступны?

 HTMLDivElement.tagName; // undefined; expected: DIV
HTMLAnchorElement.tagName; // undefined; expected: A
  

Я сгенерировал карту, но чувствую себя взломанным, и вопрос остается.

 let mapping = {
  HTMLAnchorElement: "A",
  HTMLElement: "ABBR", 
  HTMLElement: "ADDRESS", 
  HTMLAreaElement: "AREA", 
  HTMLElement: "ARTICLE", 
  HTMLElement: "ASIDE", 
  HTMLAudioElement: "AUDIO", 
  HTMLElement: "B", 
  HTMLBaseElement: "BASE", 
  HTMLElement: "BDI", 
  HTMLElement: "BDO", 
  HTMLQuoteElement: "BLOCKQUOTE", 
  HTMLBodyElement: "BODY", 
  HTMLBRElement: "BR", 
  HTMLButtonElement: "BUTTON", 
  HTMLCanvasElement: "CANVAS", 
  HTMLTableCaptionElement: "CAPTION", 
  HTMLElement: "CITE", 
  HTMLElement: "CODE", 
  HTMLTableColElement: "COL", 
  HTMLTableColElement: "COLGROUP", 
  HTMLDataElement: "DATA", 
  HTMLDataListElement: "DATALIST", 
  HTMLElement: "DD", 
  HTMLModElement: "DEL", 
  HTMLDetailsElement: "DETAILS", 
  HTMLElement: "DFN", 
  HTMLUnknownElement: "DIALOG", 
  HTMLDivElement: "DIV", 
  HTMLDListElement: "DL", 
  HTMLElement: "DT", 
  HTMLElement: "EM", 
  HTMLEmbedElement: "EMBED", 
  HTMLFieldSetElement: "FIELDSET", 
  HTMLElement: "FIGCAPTION", 
  HTMLElement: "FIGURE", 
  HTMLElement: "FOOTER", 
  HTMLFormElement: "FORM", 
  HTMLHeadingElement: "H1", 
  HTMLHeadingElement: "H2", 
  HTMLHeadingElement: "H3", 
  HTMLHeadingElement: "H4", 
  HTMLHeadingElement: "H5", 
  HTMLHeadingElement: "H6", 
  HTMLHeadElement: "HEAD", 
  HTMLElement: "HEADER", 
  HTMLElement: "HGROUP", 
  HTMLHRElement: "HR", 
  HTMLHtmlElement: "HTML", 
  HTMLElement: "I", 
  HTMLIFrameElement: "IFRAME", 
  HTMLImageElement: "IMG", 
  HTMLInputElement: "INPUT", 
  HTMLModElement: "INS", 
  HTMLElement: "KBD", 
  HTMLUnknownElement: "KEYGEN", 
  HTMLLabelElement: "LABEL", 
  HTMLLegendElement: "LEGEND", 
  HTMLLIElement: "LI", 
  HTMLLinkElement: "LINK", 
  HTMLElement: "MAIN", 
  HTMLMapElement: "MAP", 
  HTMLElement: "MARK", 
  HTMLUnknownElement: "MATH", 
  HTMLMenuElement: "MENU", 
  HTMLMenuItemElement: "MENUITEM", 
  HTMLMetaElement: "META", 
  HTMLMeterElement: "METER", 
  HTMLElement: "NAV", 
  HTMLElement: "NOSCRIPT", 
  HTMLObjectElement: "OBJECT", 
  HTMLOListElement: "OL", 
  HTMLOptGroupElement: "OPTGROUP", 
  HTMLOptionElement: "OPTION", 
  HTMLOutputElement: "OUTPUT", 
  HTMLParagraphElement: "P", 
  HTMLParamElement: "PARAM", 
  HTMLPictureElement: "PICTURE", 
  HTMLPreElement: "PRE", 
  HTMLProgressElement: "PROGRESS", 
  HTMLQuoteElement: "Q", 
  HTMLElement: "RB", 
  HTMLElement: "RP", 
  HTMLElement: "RT", 
  HTMLElement: "RTC", 
  HTMLElement: "RUBY", 
  HTMLElement: "S", 
  HTMLElement: "SAMP", 
  HTMLScriptElement: "SCRIPT", 
  HTMLElement: "SECTION", 
  HTMLSelectElement: "SELECT", 
  HTMLSlotElement: "SLOT", 
  HTMLElement: "SMALL", 
  HTMLSourceElement: "SOURCE", 
  HTMLSpanElement: "SPAN", 
  HTMLElement: "STRONG", 
  HTMLStyleElement: "STYLE", 
  HTMLElement: "SUB", 
  HTMLElement: "SUMMARY", 
  HTMLElement: "SUP", 
  SVGSVGElement: "svg", 
  HTMLTableElement: "TABLE", 
  HTMLTableSectionElement: "TBODY", 
  HTMLTableCellElement: "TD", 
  HTMLTemplateElement: "TEMPLATE", 
  HTMLTextAreaElement: "TEXTAREA", 
  HTMLTableSectionElement: "TFOOT", 
  HTMLTableCellElement: "TH", 
  HTMLTableSectionElement: "THEAD", 
  HTMLTimeElement: "TIME", 
  HTMLTitleElement: "TITLE", 
  HTMLTableRowElement: "TR", 
  HTMLTrackElement: "TRACK", 
  HTMLElement: "U", 
  HTMLUListElement: "UL", 
  HTMLElement: "VAR", 
  HTMLVideoElement: "VIDEO", 
  HTMLElement: "WBR"
}
  

Комментарии:

1. Я огляделся, но ничего не увидел. Такое сопоставление может не существовать, хотя я бы хотел, чтобы было доказано обратное

2. Вероятно, потому, что они наследуются от HTMLElement и Element и без экземпляра не было бы необходимости явно определять значение

3. @charlietfl ну, по какой-то причине для определения пользовательских элементов требуется конструктор и имя тега, поэтому мне это нужно: D

4. Хорошо … но экземпляры пользовательских элементов также возвращают имя тега jsfiddle.net/wqr0tds2 так что не совсем ясно, какую проблему более высокого уровня вам нужно решить

5. @charlietfl то, что вы показали, называется «автономным» элементом, попробуйте расширить существующий, например HTMLDivElement , и вы поймете, что я имею в виду.

Ответ №1:

Есть ли веская причина, по которой они не могут быть статически доступны?

Да, потому что, как вы можете видеть из вашего сопоставления, многие «конструкторы» фактически используются для нескольких разных тегов. HTMLElement будучи очевидным ярким примером, но также HTMLHeadingElement , HTMLTableSectionElement или HTMLModElement . В общем, я бы даже не ожидал, что это сопоставление будет стабильным, если в предложении вводятся новые методы, специфичные для одного типа элемента, они могут получить новый «класс».