Element.getAttributeNames()

getAttributeNames()Element インターフェースのメソッドで、この要素の属性名を文字列の Array で返します。要素に属性がない場合は、空の配列を返します。

getAttributeNames()getAttribute() と共に使用すると、 Element.attributes にアクセスするよりメモリ効率やパフォーマンスが良くなります。

getAttributeNames() から返される名前は修飾属性名です。すなわち、名前空間接頭辞がついた属性であり、名前空間接頭辞(実際の名前空間ではない)にコロンが続き、属性名が続きます(例えば xlink:href)。名前空間接頭辞のない属性は、そのままの名前になります(例えば href)。

構文

let attributeNames = element.getAttributeNames();

以下の例は、次の方法を示しています。

  • 名前空間接頭辞のある属性については、 getAttributeNames() は属性名と一緒に名前空間接頭辞を返します。
  • 名前空間接頭辞のない属性については、 getAttributeNames() は属性名のみをそのまま返します。

以下のことを理解することが重要です。

  1. DOM には名前空間に所属していても、名前空間接頭辞がない場合があります。
  2. 名前空間に所属しているが、名前空間接頭辞のない DOM 内の属性については、 getAttributeNames() は属性名だけを返し、その属性が名前空間に所属していることを示しません。

以下の例では、このような「名前空間に所属しているが、名前空間接頭辞がない」場合を示しています。

const element = document.createElement('a')

// "href" 属性を名前空間なし、名前空間接頭辞なしで設定
element.setAttribute('href', 'https://example.com')
// "href" 属性を名前空間あり、 "xlink" 名前空間接頭辞で設定
element.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', 'https://example.com')
// "show" 属性を名前空間あり、名前空間接頭辞なしで設定
element.setAttributeNS('http://www.w3.org/1999/xlink', 'show', 'new')

// 要素の属性を反復処理する
for (let name of element.getAttributeNames()) {
  let value = element.getAttribute(name);
  console.log(name, value);
}

// 出力結果:
// href https://example.com
// xlink:href https://example.com
// show new

ポリフィル

if (Element.prototype.getAttributeNames == undefined) {
  Element.prototype.getAttributeNames = function () {
    var attributes = this.attributes;
    var length = attributes.length;
    var result = new Array(length);
    for (var i = 0; i < length; i++) {
      result[i] = attributes[i].name;
    }
    return result;
  };
}

仕様書

Specification
DOM Standard
# ref-for-dom-element-getattributenames①

ブラウザーの互換性

BCD tables only load in the browser