JavaScriptで指定した位置にHTMLを差し込む方法

# はじめに

カート決済システム等に他社のシステムを導入しており
この部分にこの要素を入れたいのに編集対象範囲外で編集できない…！！！
でも編集したい！！！！という時はありませんか？私は結構あります。
そんな時に役立つ、JSでHTMLを差し込むあれこれを備忘録も兼ねて記載します。

:::note warn
既存のシステムに新たな要素を差し込むことは、予期せぬ不具合につながる場合もあります。
編集する際は自己責任となりますので注意して作業に当たってください。
:::

# insertAdjacentHTMLメソッド

Element オブジェクトの insertAdjacentHTMLメソッドは
指定した文字列からノードを作成し追加することができます。使い方は次のとおりです。

```javascript
element.insertAdjacentHTML(position, text);
```

2番目の引数に指定した文字列を HTML文として1番目の引数で指定した位置に追加します。
指定できる値は次の4つです。

| ポジション名 | 追加位置 |
|:-|:-|
| 'beforebegin' | element の前に追加 |
| 'afterbegin' | element の子要素の先頭に追加 |
| 'afterbegin' | element の子要素の最後に追加 |
| 'afterend' | element の後に追加 |

```:挿入位置参考
<!-- beforebegin -->
<p>
<!-- afterbegin -->
sample
<!-- beforeend -->
</p>
<!-- afterend -->
```

### サンプルコード

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="oNaOrxE" data-user="ippaimori" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ippaimori/pen/oNaOrxE">
  Untitled</a> by ippaimori (<a href="https://codepen.io/ippaimori">@ippaimori</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

```html:HTML
<div id="parent-div">
  <p id="child-p1">子要素１</p>
  <p id="child-p3">子要素３</p>
</div>
```

```javascript:JS
const element = document.getElementById('child-p1');
element.insertAdjacentHTML('afterend', '<p id="child-p2">子要素2</p>');
```

![スクリーンショット 2023-05-29 10.25.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917654/ca5cfcb6-da25-b87a-f5e2-02f3925863b9.png)


# outerHTML、innerHTML

ElementオブジェクトのouterHTML、innerHTMLはその要素自身と中身のHTMLを取得、変更するプロパティです。
使い方は次のとおりです。

```javascript:outerHTML
const content = document.getElementById('content');
content.outerHTML = '<p>置き換える内容</p>';

//テンプレートリテラルを使用することで要素の前後にHTMLを追加することも簡単にできます
content.outerHTML = `<div>${content.outerHTML}</div>`;
```
囲みたい要素を取得して content に格納。
次に、content.outerHTML を使うことで、content 自身を別のHTMLで置き換えています。
outerHTMLプロパティは、その要素自身と中身のHTMLを含みます。
要素自身も含んでいるのがinnerHTMLプロパティとの違いです。



<br>
<br>

```javascript:innerHTML
const content = document.getElementById( 'content' ) ;

content.innerHTML = '<p>置き換える内容</p>';
```
中身を置き換えたい要素を取得して content に格納。
次に、content.innerHTML を使うことで、contentの中身を別のHTMLで置き換えています。
innerHTMLプロパティは、その要素の中身がHTMLとして含まれています。
その要素自身は含まれません。

### サンプルコード

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="poxBXON" data-user="ippaimori" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/ippaimori/pen/poxBXON">
  outerHTML</a> by ippaimori (<a href="https://codepen.io/ippaimori">@ippaimori</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

```html:HTML
<div id="content">
  <p>元の文章</p>
</div>
```

```javascript:JS
const content = document.getElementById('content');
content.outerHTML=`
<div>
    <h1>追加したタイトル</h1>
    ${content.outerHTML}
</div>
`;
```
![スクリーンショット 2023-05-29 16.06.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917654/91d8d837-7cda-fb1b-ceb0-35d7a22e5a91.png)

# おわりに
今回は私が使いやすそう〜！と思ったものをピックアップしてご紹介しました！
少しでもお役に立てれば幸いです！

# 参考
[MDN element.insertAdjacentHTML](https://developer.mozilla.org/ja/docs/Web/API/Element/insertAdjacentHTML)
[HTMLを表す文字列からノードを作成し指定の位置に追加(insertAdjacentHTML)](https://www.javadrive.jp/javascript/dom/index24.html#section1)
[Element.innerHTML - 要素のHTMLを取得、変更する](https://syncer.jp/javascript-reference/element/innerhtml)
[Element.outerHTML - 自身と中身のHTMLを取得、変更する](https://syncer.jp/javascript-reference/element/outerhtml)
[jQueryの「$('#id').wrap('< div >')」をピュアJavaScriptで書きたい](https://at.sachi-web.com/purejs_wrap.html)