ラボ > Javascript関連:DOM関連

javascript svgタグをappendChild()しても表示されない(createElementNS())

innerHTMLでsvgを追加したら表示されるけどappendChild()すると表示されない…という問題

作成日:2024-03-14, 更新日:2024-03-14

状況

useタグで設定した画像が表示されない

useが表示されるソース

let child = document.createElement('div');
child.innerHTML = '<svg><use xlink:href="xxxx"></use></svg>';

useが表示されないソース

let child_svg = document.createElement('svg');
child_svg.innerHTML = '<use xlink:href="xxxx"></use>';

let child = document.createElement('div');
child.appendChild(child_svg);

原因、対応

useタグが原因じゃなくsvgタグが原因らしい

createElementNS()を使う

let svgNS = "http://www.w3.org/2000/svg";
let xlinkNS = "http://www.w3.org/1999/xlink";
let child_svg = document.createElementNS(svgNS, 'svg');
child_svg.innerHTML = '<use xlink:href="xxxx">';

let child = document.createElement('div');
child.appendChild(child_svg);

createElementNS()を使う必要のあるタグの例

  • <svg>
  • <circle>
  • <rect>
  • <path>
  • <polygon>
  • <text>
  • <g>
  • <defs>
  • <linearGradient>
  • <radialGradient>

他にもuseタグの「xlink:href」に値をセットしたいないら「setAttribute()」じゃなく「setAttributeNS()」を使う必要がある…など色々としっておく必要があるっぽい
…少し調べたら…理解してまとめるのが面倒そう…ってコトで結論。頻繁にこんなコトしないだろうから、都度調べる…って感じでいく