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

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

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

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

Q&A

解決済

3回答

1616閲覧

javascriptリンクの動的な処理について

sphy

総合スコア21

JavaScript

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

0グッド

1クリップ

投稿2018/09/29 01:04

編集2018/09/29 01:24

liにURLを設定しつつ、
それぞれのアドレスをlocation.href = "index" + count + "html";

変数countに動的にliの番号を代入して
index1.html
index2.html
index3.html
index4.html

というようにliにリンクを設定したいと考えたのですが
うまくいきません。

どのようにしたら、実現できるんでしょうか。

html

1<ul id="list"> 2<li>≫とは?</li> 3<li>≫初期設定</li> 4<li>≫OSの設定</li> 5<li>≫共有</li> 6<li>≫接続</li> 7<li>≫SSH接続</li> 8<li>≫ええええ</li> 9</ul>

javascript

1var ulElement = document.getElementById("list");//ulを取得 2var childElementCount = ulElement.childElementCount;//liの数を調べる 3 4 5for(var $count = 0; $count < childElementCount; $count++) { 6 document.getElementsByTagName("li")[$count].onclick = function(){ 7  location.href = "index" + $count + ".html"; 8  } 9}

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

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

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

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

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

m.ts10806

2018/09/29 01:17

インデントをきちんと調整してください。関数などのネストが深くなっているときなど、揃っていないと開始と終了がわかりづらくなって不具合につながりやすいです。
guest

回答3

0

ベストアンサー

jun68yktさんの指摘する点も問題ですが、実はもう1つ問題があって、varでループ変数を宣言してその内部でイベントを宣言した場合、変数は共通なので、すべて「抜けきったあとの値」になってしまいます。

対策は2つあります。

その1: varではなくletで宣言する(IEはletをループで回した場合の挙動に非対応なので、IEを無視できる状況、あるいはBabelなどでコンパイルする場合に使える)

その2: ループ1回毎に関数を立ててスコープを切る

javascript

1for(var $count = 0; $count < childElementCount; $count++) { 2 // ループ1回毎にcountという別の変数を立てて、$countと分離する 3 (function(count){ 4 document.getElementsByTagName("li")[count].onclick = function(){ 5 6 location.href = "index" + count + ".html"; 7 }; 8 })($count); 9} 10

投稿2018/09/29 01:13

編集2018/09/29 01:17
maisumakun

総合スコア145183

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

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

sphy

2018/09/29 01:36

ありがとうございます。 無事設定することができました。
guest

0

以下のように html の前にドット .  を追加でいかがでしょうか?

修正前:

javascript

1location.href = "index" + $count + "html";

修正後:

javascript

1location.href = "index" + $count + ".html";

追記

上記の回答は、 . の抜けのことしか見ていませんでした。以下で意図通りになるかなと思います。

javascript

1var ulElement = document.getElementById("list");//ulを取得 2var childElementCount = ulElement.childElementCount;//liの数を調べる 3 4 5for(var $count = 0; $count < childElementCount; $count++) { 6 7 document.getElementsByTagName("li")[$count].onclick = (function(n){ 8 return function() { 9 location.href = "index" + n + ".html"; 10 }; 11 })($count); 12 13}

以下、上記のコードを動作確認するためのサンプルです。( location.href を置き換えるのではなく console.log で表示しています)


追記2

質問の主旨からは外れてしまいますが、以下のように getElementsByTagName の結果に対して、Array.prototype.forEach を使うことでも実現できます。

javascript

1const items = document.getElementsByTagName("li"); 2 3Array.prototype.forEach.call(items, function(item, i) { 4 item.onclick = function() { 5 var href = "index" + i + ".html"; 6 console.log(href); 7 }; 8}); 9

動作確認用のサンプル: https://jsfiddle.net/jun68ykt/4amvgz6n/1/

投稿2018/09/29 01:09

編集2018/09/29 01:56
jun68ykt

総合スコア9058

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

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

sphy

2018/09/29 01:13

すみません。.抜けは入力ミスでした。 このjsを出力してみると すべてのliに対してindex6.htmlのリンクがついてしまいます。
jun68ykt

2018/09/29 01:35

初めに回答を書いた時点では、ドットの抜けしか見てませんでした。つきましては、 意図通り動くと思われるコードを追記しました。参考になれば幸いです。
sphy

2018/09/29 01:41

ありがとうございます。 プログラム初心者なのですが、本当に勉強になります。
jun68ykt

2018/09/29 01:58

どういたしまして。解決されたようでよかったです。 回答に追記2として、こういう書き方もできます、というコードを上げておきました。
sphy

2018/09/29 02:02

ご丁寧にありがとうございます。 このような書き方もあるんですね。
guest

0

location.href = "index" + $count + ".html"; // "."が抜けています

投稿2018/09/29 01:12

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問