@0913sigma

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JavaScriptでJSON内の「\n」を改行にし、ウェブページに表示したい

ウェブアプリからJSONデータをfetchし、それを配列に変換した後createElementでhtml要素を作成。
それを「親要素.appendChild」という形で追加するようにしている。
以下がソースコード。(本来はもう少し長く、問題に関係ない処理を省いている。)

fetch.js
const url = "ウェブアプリのURL";
let messages = [];

function load() {

    fetch(url)
        .then(response => response.json())
        .then(data => {
            data.forEach(entry => {
                let x = entry.msg
                messages.push(x); // *ここ
            }

            for (let i = messages.length - 1; i > -1; i--) {
                let newTrElement = document.createElement("tr");
                let newTdElement = document.createElement("td");
                
                newTdElement.appendChild(document.createTextNode(messages[i]));
                newTrElement.appendChild(newTdElement);
                // 本来はほかにもhtmlに追加するtd要素(msg以外の、例えば日付など)があり、
                // 二重ループになっているが、原因はそこではないと思うので、略。

                document.getElementById("親要素tableのid").appendChild(newelement);
            }

}

実現したいこと

改行(\n)を含む文字列をそのまま表示すると、ページ上で改行されず、

あ い う

と表示される。
理想は



と表示されること。

試したこと

11行目の*の場所を
messages.push(x) から messages.push(x.replaceAll("\n","<br>")) に変更。
結果は、ページ上に

あ<br>い<br>う

と表示されるだけ。

</br> や <br /> にしても効果なし。

0 likes

3Answer

対象要素のinnerTextプロパティに書き込めばいい… という話ではないのでしょうか。

document.body.innerText = 'test\ntest\ntest';
2Like
newTdElement.appendChild(document.createTextNode(messages[i]));

ここで document.createTextNode() は文字列をテキストノードに変換します。文字列に <br> などのタグが含まれていても、タグとして解釈されず文字通りに表示されることになります。

<br> タグを挿入するなら以下のようにしてください。

messages[i].split(/\n/).forEach(line => {
  newTdElement.appendChild(document.createTextNode(line))
  newTdElement.appendChild(document.createElement("br"))
})

それ以外では、 pre タグCSS の white-space プロパティを使って文字列内の改行をそのまま表示する方法があります。

1Like

Comments

  1. @0913sigma

    Questioner

    無事brタグを挿入し、改行表示させることができました。
    ありがとうございます。

ソースコード全体を見せてほしいです。
省略している部分に原因があることもあるので。

ん~あえて言うなら、table要素で

before
<table>
    <tr><td>aaa</td></tr>
</table>

というHTMLを書いた場合

after
<table>
    <tbody>
        <tr><td>aaa</td></tr>
    </tbody>
</table>

という風に変わるため、まあまあ注意を払う必要があります。Reactでもエラー?警告?が出ます。
そのため

document.getElementById("親要素tableのid").appendChild(newelement);

document.getElementById("親要素tableの中のtbodyのid").appendChild(newelement);
// or
document.querySelector("#親要素tableの中のid tbody").appendChild(newelement);

とするといいかもしれません。

まあ理由はこれじゃないかもしれませんので、ソースコードの全体を出してほしいです。
HTMLのコードも必要だと思われますので、お願いします。

0Like

Your answer might help someone💌