条件によってHTMLのところどころの要素を書き換える:パート2
今までのおさらい。
だらだらと書いてみたあとで作ってみたが、条件が増えてエライことになった。
- 教室のタイプ(room:13種類)
- VHSなどのテープ系デッキのタイプ(tape:5種類)
- LDやDVDなどのディスク系デッキのタイプ(disk:6種類)
- OHCのタイプ(ohc:2種類)
場所に応じて4パターン、780通りもある。そんなのは素のHTMLを個別に作成して管理できるはずがない。
一つのHTMLにパラメータを渡して、スクリプトでパラメータに応じて本文を作成する方法をとる。
呼び出し側のHTML
ハイパーリンクにパラメータをくっつけている。
<p><a href="fullset/index.htm?room=media&tape=SR-VS30&disk=DVL-919&ohc=VZ-27-f">ほげ教室</a></p> <p><a href="fullset/index.htm?room=1_normal&tape=HR-DVS2&disk=DVL-919&ohc=HV-700SX-f">ふが教室</a></p>
呼び出される側のHTMLのヘッダ
ヘッダーに仕込む。与えられた文字列を分解して、パラメータに仕込む。
<script type="text/javascript"> <!-- var params = location.href.split("?")[1]; params = params.split("&"); for(var i = 0; i < params.length; i++) { var tmp = params[i].split("="); switch(tmp[0]){ case "room": var room = tmp[1]; break; case "tape": var tape = tmp[1]; break; case "disk": var disk = tmp[1]; break; case "ohc": var ohc = tmp[1]; break; } } --> </script>
呼び出される側のHTMLの本文
idを決めて、書き換えられるって感じ。
<div id="gaiyou"><script type="text/javascript" src="js/gaiyou.js">概要</script></div> <div id="disk_deck"><script type="text/javascript" src="../common_js/disk_deck.js">ディスクデッキ利用時の操作</script></div> <div id="faq_manual"><script type="text/javascript" src="../common_js/faq_manual.js">ohcデッキ利用時の操作</script></div>
だいたい3パターンになった
パターン1:概要
function div_text(p_class, p_text){ return "<div class='" + p_class + "'>" + p_text + "</div>\n"; } function div_img(p_class, p_img, p_text, p_style){ var img_url = "images/gaiyou/"; var rtn = "<div class='" + p_class + "'"; if(p_style){ rtn += " style='" + p_style + "'"; } rtn += "><img src='" + img_url + p_img + "'>"; if(p_text){ rtn += "<br />" + p_text; } rtn += "</div>\n"; return rtn; } var TagName = "gaiyou"; var gaiyou_arr = new Array(); gaiyou_arr["media"] = [ {image: "image01.jpg", text: "教卓全体"}, {image: "image02.jpg", text: "常設パソコン"}, {image: "image03.jpg", text: "語学テレコ"}, {image: "image04.jpg", text: "教材提示装置(OHC)"}, {image: "image05.jpg", text: "VHSデッキ・DVD/CLDプレイヤー"}]; gaiyou_arr["1_b1"] = gaiyou_arr["media"]; //他のデータは省略 /*パラメータが不正な場合*/ if (gaiyou_arr[room] == undefined){ room = "null"; gaiyou_arr["null"] = [ {image: "alternative.jpg", text: "じろう"}, {image: "alternative.jpg", text: "じろう"}, {image: "alternative.jpg", text: "じろう"}, {image: "alternative.jpg", text: "じろう"}, {image: "alternative.jpg", text: "じろう"}]; } var text1 = "卓は教材の映像や音声を出力できます。本体にはパソコン、DVDデッキ、VHSデッキ、OHC(教材提示装置)が収納されています。"; var sub_title = "<h3>卓機器一覧</h3>"; var sub_text = "<p>卓は以下の機器を収納しています。</p>"; var clboth = "<div class='clear_both'></div>\n"; var change_documents = "" + "<div class='img_layout'>" + div_text("text", text1) + div_img("img", gaiyou_arr[room][0]["image"], gaiyou_arr[room][0]["text"]) + clboth + div_text("text_long", sub_title + sub_text ) + clboth + div_img("img" ,gaiyou_arr[room][1]["image"], gaiyou_arr[room][1]["text"]) + div_img("img" ,gaiyou_arr[room][2]["image"], gaiyou_arr[room][2]["text"]) + clboth + div_img("img" ,gaiyou_arr[room][3]["image"], gaiyou_arr[room][3]["text"]) + div_img("img" ,gaiyou_arr[room][4]["image"], gaiyou_arr[room][4]["text"]) + clboth + "</div>"; if(document.all || document.getElementById){ // IE4/5、NN6用の分岐 if(document.all)document.all(TagName).innerHTML = change_documents; else document.getElementById(TagName).innerHTML = change_documents; } else if(document.layers){ // NN4.7用の分岐 with(document.layers[TagName]){ //with構文 document.open(); document.write(change_documents); // レイヤー"naiyou"に変数msgの値を書き出す。 document.close(); } }
差し替えるテキストを作成するところが面倒だったのでdiv_textとdiv_img関数を作る。
パターン2:ディスク
書き換えるところをループにしている。
画像用の関数にはテキストとかスタイルも設定できる。
function div_text(p_class, p_text){ return "<div class='" + p_class + "'>" + p_text + "</div>\n"; } function div_img(p_class, p_img, p_text, p_style){ var img_url = "../common_images/disk_deck/"; var rtn = "<div class='" + p_class + "'"; if(p_style){ rtn += " style='" + p_style + "'"; } rtn += "><img src='" + img_url + disk + "/" + p_img + "'>"; if(p_text){ rtn += "<br />" + p_text; } rtn += "</div>\n"; return rtn; } var TagName = "disk_deck"; var disk_title = "デッキについて"; var disk_arr = [ {title: ""}, {text: "", image: "1_1.jpg", attr: "コンパネのスイッチ"}, {text: " 鍵でフルセットプレゼン卓の扉を開けます。", image: "1_2.jpg", attr: "教卓全面の扉をあける"}, {text: "「開/閉」ボタンを押して、トレイにセットします。"}, {text: "デッキ本体のボタンを使って操作します。", image: "1_4.jpg", attr: "再生ボタン"}, {text: "デッキ本体での操作には制限があり、単純な操作しか行えません。<br />メニュー、チャプター操作や一時停止操作などはリモコンをお使いください。", image: "1_5.jpg", attr: "リモコン"}, {title: ""}, {text: "", image: "2_1.jpg", attr: "メディアを取り出してから電源をオフ"}, {text: "「コントロールパネル」の「終了」ボタンを押してください。", image: "2_2.jpg", attr: "コンパネ「終了」ボタン"}, {text: "「コントロールパネル」の「AV音量」を中間の位置に戻します。", image: "2_3.jpg", attr: "図は「0」ですが、「5」にして下さい"}, {text: "最後に全ての扉を閉じて、「終了時消灯」ランプが消灯していることを確認します。", image: "2_4.jpg", attr: "赤いランプが消えます"} ]; var temp_title_name_s = "デッキ利用時の操作"; var temp_disk_arr_1_a = "鍵で「コントロールパネル」の扉を開け「ビデオプロジェクター電源」の「ON/OFF」ボタンと"; var temp_disk_arr_1_b = "ボタンを押します。<br />プレビューモニターに出力する場合は、「プレビューモニター(PREVIEW MONITOR)」の"; var temp_disk_arr_1_c = "ボタンを押します。"; var temp_title_name_e = "デッキ終了時の操作"; var temp_disk_arr_2_a = "の「開/閉」ボタンを押して、"; var temp_disk_arr_2_b = "を取り出してください。次に「電源」ボタンを押して電源オフします。"; switch(disk){ case "DVL-919": var title_name ="DVD/CLD"; var button_name = "「DVD/CLD」"; var text_name = "DVDまたはCDまたはLD"; break; case "DVD-S50": var title_name = "DVD"; var button_name = "「DVD」"; var text_name = "DVD"; break; case "D-VR7-f": case "D-VR7-w": case "NV-VP41B-S": case "NV-VP70-S": var title_name = "DVD/VHS"; var button_name = "「DVD/VHS」"; var text_name = "DVDまたはVHS"; break; default: title_name=""; break; } disk_arr[0].title = title_name + temp_title_name_s; disk_arr[1].text= temp_disk_arr_1_a + button_name + temp_disk_arr_1_b + button_name + temp_disk_arr_1_c; disk_arr[6].title = title_name + temp_title_name_e; disk_arr[7].text = title_name + temp_disk_arr_2_a + text_name + temp_disk_arr_2_b; var clboth = "<div class='clear_both'></div>\n"; var change_documents = "<div class='img_layout'>"; change_documents += div_text("text_long","<h2>" + title_name + disk_title + "</h2>"); for(i=0; i<disk_arr.length; i++){ if(disk_arr[i]["title"]){ change_documents += div_text("text_long","<h3>" + disk_arr[i]["title"] + "</h3>"); }else if(disk_arr[i]["text"]){ change_documents += div_text("text", disk_arr[i]["text"]); if(disk_arr[i]["image"]){ change_documents += div_img("img", disk_arr[i]["image"], disk_arr[i]["attr"]); } } change_documents += clboth; } change_documents += "</div>"; if(title_name==""){ change_documents=""; } if(document.all || document.getElementById){ // IE4/5、NN6用の分岐 if(document.all)document.all(TagName).innerHTML = change_documents; else document.getElementById(TagName).innerHTML = change_documents; } else if(document.layers){ // NN4.7用の分岐 with(document.layers[TagName]){ //with構文 document.open(); document.write(change_documents); // レイヤー"naiyou"に変数msgの値を書き出す。 document.close(); } }
パターン3:FAQ
「title」だけなら、タイトル
「que」「ans」なら、Q&Aを作る。「img」があったら、画像も挿入する。
var TagName = "faq_manual"; var img_url = "../common_images/faq_manual/"; var title = "「よくある問い合わせ(FAQ)」"; var faq_arr = [ {title: "教室全般"}, {que: "卓の起動はどのように行うのですか?", ans: "卓の扉を鍵で開けてください。自動的に電源が投入され「電源表示」ランプが点灯します。"}, {que: "照明機器は卓で操作できますか?", ans: "「コントロールパネル」の「環境設定」で蛍光灯やダウンライトのオン/オフが操作できます。暗幕は手動で開/閉する教室もあります。", img: "room/1.jpg"} ]; var clboth = "<div class='clear_both'></div>\n"; var change_documents = "<div class='img_layout'><h2>" + title + "</h2>\n<div class='faq'>"; for(i=0; i<faq_arr.length; i++){ if(faq_arr[i]["title"]){ change_documents += "<h3>" + faq_arr[i]["title"] + "</h3>\n"; }else{ change_documents += "<div class='que'>" + faq_arr[i]["que"] + "</div>\n" + "<div class='ans'>" + faq_arr[i]["ans"] + "</div>"; if(faq_arr[i]["img"]){ change_documents += "<div class='img_center'><img src='" + img_url + faq_arr[i]["img"] + "'></div>\n"; } change_documents += clboth; } } change_documents += "</div></div>"; if(document.all || document.getElementById){ // IE4/5、NN6用の分岐 if(document.all)document.all(TagName).innerHTML = change_documents; else document.getElementById(TagName).innerHTML = change_documents; } else if(document.layers){ // NN4.7用の分岐 with(document.layers[TagName]){ //with構文 document.open(); document.write(change_documents); // レイヤー"naiyou"に変数msgの値を書き出す。 document.close(); } }