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

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

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

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

Q&A

0回答

1360閲覧

JavaScriptでカレンダーの日付をクリックしたらiFrameの中身を変更させたい

fjid

総合スコア1

JavaScript

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

0グッド

0クリップ

投稿2021/08/18 04:50

前提・実現したいこと

JavaScriptで作成したカレンダーの日付にリンクを設定できるようにする
こちらの記事を参考にJSでカレンダーを作成しています。

そこで、

・カレンダーの日付リンクをクリックした際に、カレンダーのある同ページ内に設置したiFrameにリンク先を表示したい
・aタグやボタンは使わず、var = data内に情報を格納させているリンクを表示させたい

外部サイトを表示する予定は今のところなく、あくまでもローカルのhtmlを表示するだけです。
こんな風にしたいです

該当のソースコード

JavaScript

1window.onload = function() { 2 // 現在の年月の取得 3 var current = new Date(); 4 var year = 2040; 5 var month = 2; 6 7 // カレンダーの表示 8 var wrapper = document.getElementById('calendar'); 9 add_calendar(wrapper, year, month); 10} 11 12/** 13* 指定した年月のカレンダーを表示する 14* @param {object} wrapper - カレンダーを追加する親要素 15* @param {number} year - 年の指定 16* @param {number} month - 月の指定 17*/ 18function add_calendar(wrapper, year, month) { 19 // 現在カレンダーが追加されている場合は一旦削除する 20 wrapper.textContent = null; 21 22 // カレンダーに表示する内容を取得 23 var headData = generate_calendar_header(wrapper, year, month); 24 var bodyData = generate_month_calendar(year, month, data); 25 26 // カレンダーの要素を追加 27 wrapper.appendChild(headData); 28 wrapper.appendChild(bodyData); 29} 30 31/** 32* 指定した年月のカレンダーのヘッダー要素を生成して返す 33* @param {object} wrapper - カレンダーを追加する親要素 34* @param {number} year - 年の指定 35* @param {number} month - 月の指定 36*/ 37function generate_calendar_header(wrapper, year, month) { 38 // 前月と翌月を取得 39 var nextMonth = new Date(year, (month - 1)); 40 nextMonth.setMonth(nextMonth.getMonth() + 1); 41 var prevMonth = new Date(year, (month - 1)); 42 prevMonth.setMonth(prevMonth.getMonth() - 1); 43 44 // ヘッダー要素 45 var cHeader = document.createElement('div'); 46 cHeader.className = 'calendar-header'; 47 48 // 見出しの追加 49 var cTitle = document.createElement('div'); 50 cTitle.className = 'calendar-header__title'; 51 var cTitleText = document.createTextNode(year + '年' + month + '月'); 52 cTitle.appendChild(cTitleText); 53 cHeader.appendChild(cTitle); 54 55 // 前月ボタンの追加 56 var cPrev = document.createElement('button'); 57 cPrev.className = 'calendar-header__prev'; 58 var cPrevText = document.createTextNode('prev'); 59 cPrev.appendChild(cPrevText); 60 // 前月ボタンをクリックした時のイベント設定 61 cPrev.addEventListener('click', function() { 62 add_calendar(wrapper, prevMonth.getFullYear(), (prevMonth.getMonth() + 1)); 63 }, false); 64 cHeader.appendChild(cPrev); 65 66 // 翌月ボタンの追加 67 var cNext = document.createElement('button'); 68 cNext.className = 'calendar-header__next'; 69 var cNextText = document.createTextNode('next'); 70 cNext.appendChild(cNextText); 71 // 翌月ボタンをクリックした時のイベント設定 72 cNext.addEventListener('click', function() { 73 add_calendar(wrapper, nextMonth.getFullYear(), (nextMonth.getMonth() + 1)); 74 }, false); 75 cHeader.appendChild(cNext); 76 77 return cHeader; 78} 79 80/** 81* 指定した年月のカレンダー要素を生成して返す 82* @param {number} year - 年の指定 83* @param {number} month - 月の指定 84* @param {object} linkData - リンクを設定する日付の情報 85*/ 86function generate_month_calendar(year, month, linkData) { 87 var weekdayData = ['日', '月', '火', '水', '木', '金', '土']; 88 // カレンダーの情報を取得 89 var calendarData = get_month_calendar(year, month); 90 91 var i = calendarData[0]['weekday']; // 初日の曜日を取得 92 // カレンダー上の初日より前を埋める 93 while(i > 0) { 94 i--; 95 calendarData.unshift({ 96 day: '', 97 weekday: i 98 }); 99 } 100 var i = calendarData[calendarData.length - 1]['weekday']; // 末日の曜日を取得 101 // カレンダー上の末日より後を埋める 102 while(i < 6) { 103 i++; 104 calendarData.push({ 105 day: '', 106 weekday: i 107 }); 108 } 109 110 // カレンダーの要素を生成 111 var cTable = document.createElement('table'); 112 cTable.className = 'calendar-table'; 113 114 var insertData = ''; 115 // 曜日部分の生成 116 insertData += '<thead>'; 117 insertData += '<tr>'; 118 for (var i = 0; i < weekdayData.length; i++) { 119 insertData += '<th>'; 120 insertData += weekdayData[i]; 121 insertData += '</th>'; 122 } 123 insertData += '</tr>'; 124 insertData += '</thead>'; 125 126 // 日付部分の生成 127 insertData += '<tbody>'; 128 for (var i = 0; i < calendarData.length; i++) { 129 if(calendarData[i]['weekday'] <= 0) { 130 insertData += '<tr>'; 131 } 132 insertData += '<td>'; 133 var ymd = year + '-' + month + '-' + calendarData[i]['day']; 134 for (var j = 0; j < linkData.length; j++) { 135 if(linkData[j]['date'] === ymd) { 136 insertData += '<a href="' + linkData[j]['link'] + '">' + calendarData[i]['day'] + '</a>'; 137 break; 138 } 139 if(j >= linkData.length - 1) { 140 insertData += calendarData[i]['day']; 141 } 142 } 143 insertData += '</td>'; 144 if(calendarData[i]['weekday'] >= 6) { 145 insertData += '</tr>'; 146 } 147 } 148 insertData += '</tbody>'; 149 150 cTable.innerHTML = insertData; 151 return cTable; 152} 153 154/** 155* 指定した年月のカレンダー情報を返す 156* @param {number} year - 年の指定 157* @param {number} month - 月の指定 158*/ 159function get_month_calendar(year, month) { 160 var firstDate = new Date(year, (month - 1), 1); // 指定した年月の初日の情報 161 var lastDay = new Date(year, (firstDate.getMonth() + 1), 0).getDate(); // 指定した年月の末日 162 var weekday = firstDate.getDay(); // 指定した年月の初日の曜日 163 164 var calendarData = []; // カレンダーの情報を格納 165 var weekdayCount = weekday; // 曜日のカウント用 166 for (var i = 0; i < lastDay; i++) { 167 calendarData[i] = { 168 day: i + 1, 169 weekday: weekdayCount 170 } 171 // 曜日のカウントが6(土曜日)まできたら0(日曜日)に戻す 172 if(weekdayCount >= 6) { 173 weekdayCount = 0; 174 } else { 175 weekdayCount++; 176 } 177 } 178 return calendarData; 179} 180

html

1<body> 2 3 <div id="calendar"></div> 4 <script src="js/calendar.js"></script> 5 6<iframe id="cFrame" src="index.html"></iframe> 7 8 9 <script> 10 var data = [ 11 { 12 date: "2040-2-15", 13 link: "index.html" 14 }, 15 16 { 17 date: "2040-2-29", 18 link: "https://www.hololive.tv/portfolio/items/omaru-polka" 19 } 20 ]; 21 22 function test(data){ 23 target = document.getElementById("cFrame"); 24 onClick = "newURL()"; 25 document.getElementById('cFrame')[0].contentDocument.location.reload(true); 26 document.getElementById('cFrame').contentWindow.location.replace('index.html'); 27 var dataAttrs = element.dataset; 28 29 }; 30 31 32 33 </script> 34 </body> 35 36 37 38

わからないこと

Javascriptでのiframe操作tips(iframeの中身を差し替える)
こちらの記事を参考に、functionの中にいれてみたのですが、動かず詰まってしまいました。
おそらくこの方の記述で動くと思ったのですが、記述の方法がわかりません。

初心者であるため、記述方法などを調べてみたのですが、引数や関数の使い方、
そもそも記述の仕方に理解が及んでいないところがあります。

JavaScriptを実際にサンプルなどを触りながら覚えようと思って始めたため、
コードの書き方も見よう見まねで書いているのでよくわかっていないところが多々あります。

試したこと

iframeに表示させるだけならtargetを指定すればいいのではないかと思ったのですが、
jsにはiframeのtargetを指定する方法がないようだったので
Javascriptでのiframe操作tips(iframeの中身を差し替える)
こちらを参考に上記html内のfunctionを作成したのですが動きませんでした。
"data"をfunctionに引数として渡せば、function内の関数でiframe内に表示させることができるのではないかと思ったのですが…。

おそらく記述方法が間違っているんだろうと思うのですが、どう記述すればいいかわかりません…。

第83回 「インラインフレームのURLを変更する」
インラインフレームのリンク設定(JavaScript入門)
他にもjavascriptとiframe,srcなどで一通り検索をかけましたが、
ボタンやaタグで表示する方法はあったのですが、求めている方法ではありませんでした。

非常にお手数をおかけいたしますが、どなたかご教授いただければ幸いです。
何卒よろしくお願いいたします

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

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

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

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

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

int32_t

2021/08/18 05:02

> aタグやボタンは使わず、 すでにカレンダー内でaタグでリンクを生成しているように見えるのですが、それはやめるということですか?
fjid

2021/08/18 05:50

ありがとうございます。 aタグを使わず、というのはこのサイト(https://www.pazru.net/js/location/5.html)の <a href="JavaScript:ifr('https://pazru.net/puzzle/')">パズルの部屋へ</a> <br> <iframe src="https://pazru.net/" name="waku"></iframe> <script> function ifr(jpURL){ waku.location = jpURL; } </script> > <a href="JavaScript:ifr('https://pazru.net/puzzle/')">パズルの部屋へ</a> のような表記をhtml内で使いたくない…ということです。 すみません、<a href=""></a>以外の形は初めてなのでコードを見てもaタグでリンクが生成されているとわからず…。 ■html内script var data = [ { date: "2040-2-15", link: "index.html" }, { date: "2040-2-29", link: "https://www.hololive.tv/portfolio/items/omaru-polka" } ]; おそらくここの"link:index.html"でリンクになってると思うのですが、 これもaタグで生成されているということになるんでしょうか? やりたいことは、ここのvar dataの情報リンクをiframeに表示することです。 <div id="calendar"></div> <script src="js/calendar.js"></script> <iframe id="cFrame" src="index.html"></iframe> htmlにはカレンダーとiframeを表示する上記だけの情報(と、scriptのみ)を書きたいのです。 わかりづらかったらすみません
int32_t

2021/08/18 05:59

ああ、質問者さんが書いたコードではなく他の人のコードのコピペなのですね。 現状のコードが何をしているか理解していれば簡単な修正で目的は達成できるはずです(<a>の生成をちょっと変えるだけ)。現状の質問者さんの状態で前に進んでもコピペプログラマが増えるだけなので、 私は回答を書きません。
fjid

2021/08/18 06:08

すみません。 私はプログラマーではなく、個人的なことですぐに使用したい目的(公開するものではなく)があり、触れたばかりで仕組みがわからなかったので質問させていただきました。 ご助言を元にもう少し自力で考えてみようと思います、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問