質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

381閲覧

子要素から一つ上の階層の隣り合った要素のidを取得したい

aaaaMAX

総合スコア16

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

2クリップ

投稿2023/05/04 13:32

編集2023/05/04 13:37

実現したいこと

1ページに複数のdivを作成し、divごとの一番下に上下の隣り合ったdivへのリンクを自動で作成したいです。
そのために上下のdivの、規則性のない任意のidを取得したいのですが、上手くいきません。

前提

ゲームブック風のwebページを作成したいと思っています。
ページ分割などではなく、ページ内リンクで対処したいです。

該当のソースコード

<html> <head> </head> <body> <div id="setumei"> ページの説明 </div> <div class="topic" id="ccc"> 文章1 <span class="updown"></span> </div> <div class="topic" id="aaa"> 文章2 <span class="updown"></span> </div> <div class="topic" id="fff"> 文章3 <span class="updown"></span> </div> <div class="topic" id="ggg"> 文章4 <span class="updown"></span> </div> </body> </html>

該当のソースコード2

<span class="updown"></span>の中に以下のようなコードをjsで作成することを目指しています。
例)id="aaa"に作成したいコード

<ul> <li><a href="#ccc">上</a> <li><a href="#">最初から</a> <li><a href="#fff">下</a> </ul>

例)id="ggg"に作成したいコード

<ul> <li><a href="#fff">上</a> <li><a href="#">最初から</a> <li>下 </ul>

試したこと

ネットで見つけられた目次生成が一番近いと思い、それをいじってみましたが上手くいきませんでした。
自分ではリンク生成先が子要素だからではないかと考えているのですが、つぎはぎで作っているからかもしれず、よく分かっていません。

document.addEventListener('DOMContentLoaded', function () { const updown_class = 'updown'; const updown_contents = document.getElementsByClassName(updown_class); const child = document.querySelector('.topic'); let siblingPrev = child.previousElementSibling; let siblingNext = child.nextElementSibling; let siblingtPrevId = siblingPrev.id; let siblingtNextId = siblingNext.id; const ul = document.createElement('ul'); const li1 = document.createElement('li'); const a1 = document.createElement('a'); a1.innerHTML = '上'; a1.href = '#' + siblingtPrevId; const li2= document.createElement('li'); const a2 = document.createElement('a'); a2.innerHTML = "最初から"; a2.href = '#'; const li3 = document.createElement('li'); const a3 = document.createElement('a'); a3.innerHTML = "下"; a3.href = '#' + siblingtNextId; li1.appendChild(a1); li2.appendChild(a2); li3.appendChild(a3); const li = ['li1', 'li2', 'li3']; ul.appendChild(li); updown_contents.appendChild(ul); })

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ypp

2023/05/05 03:41

<ul> <li><a href="#ccc">上</a> <li><a href="#">最初から</a> <li><a href="#fff">下</a> </ul> </li>が3つ足りません。
int32_t

2023/05/07 23:53

yppさん、この場合 </li> は省略可能です。
guest

回答2

0

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 let topic=document.querySelectorAll('.topic'); 4 topic.forEach((x,y)=>{ 5 let content="<ul>"; 6 if(y>0) content+=`<liv><a href="#${topic[y-1].id}">上へ</a></li>`; 7 content+=`<li><a href="#">最初から</a></li>`; 8 if(y<topic.length-1) content+=`<li><a href="#${topic[y+1].id}">下へ</a></li>`; 9 content+="</ul>"; 10 x.querySelector('.updown').innerHTML=content; 11 }); 12}); 13</script> 14<body> 15<div id="setumei"> 16ページの説明 17</div> 18 19<div class="topic" id="ccc"> 20文章1 21<span class="updown"></span> 22</div> 23 24<div class="topic" id="aaa"> 25文章2 26<span class="updown"></span> 27</div> 28 29<div class="topic" id="fff"> 30文章3 31<span class="updown"></span> 32</div> 33 34<div class="topic" id="ggg"> 35文章4 36<span class="updown"></span> 37</div> 38</body>

投稿2023/05/08 03:03

yambejp

総合スコア114775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実現したいことを考えると、class="topic"class="updown" の要素について繰り返し処理が必要ですよね。そういう繰り返しがコード中にないことから、期待通りには動かないことは明らかです。

以下のような方針で処理するとよいかと思います。

  • class="topic" を持つ要素のリスト(topicsとする)に対して、インデックス i でループを行う
    • topics[i] の中にある class="updown" を持つ要素を探し、その子として <ul> を作る
    • もし i1 以上なら、topics[i - 1].id をもとに「上」リンクを作り、<ul> に追加する
    • 「最初から」リンクを作り、<ul> に追加する
    • もし itopics.length - 1 より小さいなら、topics[i + 1].id をもとに「下」リンクを作り <ul> に追加する

投稿2023/05/07 21:51

編集2023/05/07 23:51
int32_t

総合スコア20841

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問