変数を利用して読込先を動的に変えたい

このQ&Aのポイント
  • 表示しているhtmlファイル名を取得して、動的に参照フォルダを変えるスクリプトを組んでいますが思うように動かず四苦八苦しております。
  • 外部ファイル(album.js)として保存し[例]20140623_2htmlページ内で読み込みデバッグツールで確認するとalbum.jsを読み込んだ後に./topics/20140623_2/data.jsも読み込み、中身も正常に確認できましたが、album.jsの後に読み込まれているためか変数を利用できず?真っ白なページとなりました。
  • 外部ファイルにするか直書きにするかで動作が変わるため何が原因か分からず困っています。
回答を見る
  • ベストアンサー

変数を利用して読込先を動的に変えたい

表示しているhtmlファイル名を取得して、動的に参照フォルダを変えるスクリプトを組んでいますが思うように動かず四苦八苦しております。 -------------------------------- /* --- URLからファイル名を取得しfileNameに格納、           見学報告データフォルダ名指定用として動的に変化させる --- */ var levelUrl = location.href.split("/"); var fileName = levelUrl[levelUrl.length-1].split("."); // 表示用data.js読込 document.open(); document.write ('<script type="text/javascript" src="./topics/'+fileName[0]+'/data.js" charset="UTF-8"></script>'); // ページ生成シーケンス document.write ('<h2>',commentList[0][0],'</h2>');   //アルバムタイトル生成 document.write ('<div>',commentList[0][1],'</div>');   //冒頭コメント生成 for (var i = 1 ; i <= commentList[1][0] ; i++){ document.write ('<p class="album"><img src="./topics/',fileName[0],'/',i,'.png" /></p><p class="comment">',commentList[1][i],'</p>'); } document.write ('<div><p class="thanks">ご来訪のお礼</p>',commentList[0][2],'</div>'); //締めのコメント生成 document.close(); ----------------------- この内容を外部ファイル(album.js)として保存し[例]20140623_2htmlページ内で読み込みデバッグツールで確認するとalbum.jsを読み込んだ後に./topics/2014062_2/data.jsも読み込み、中身も正常に確認できましたが、album.jsの後に読み込まれているためか変数を利用できず?真っ白なページとなりました。 そこで、冒頭からコメントの「ページ生成シーケンス」前までを20140623.htmlのalbum.js読み込み直前に直接記載したところ、何故か document.write ('<script type="text/javascript" src="./topics/'+fileName[0]+'/data.js" charset="UTF-8"></script>'); の行がhtmlタグの書き出しとして機能せず、最後のシングルクォーテーション以降がページ内にテキストとして表示されました。 具体的な表示としてはページ内に '); document.close(); が表示され、一つのwrite文として機能していないためdata.jsファイルの読込も出来ない状態になりました。 外部ファイルにするか直書きにするかで動作が変わるため何が原因か分からず困っています。 なお、当方が目的としているのは見学報告のページに表示するコメントを収めた配列をhtmlファイルのファイル名に応じて動的に変化させたい事ですので、私が書いたフォルダ名を動的に変化させる方法のミス部分の指摘でも、変数名を動的に変化させる方法(元々これを実現しようと思っていましたが能力不足で出来ませんでしたorz)具体的には20140623.htmlのファイル内では配列data20140623の中身を参照するといった方法でも構いません。 よろしくお願い致します。

  • sulay
  • お礼率100% (7/7)

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.3

ANo2です。 >ご指摘通りhtmlファイルが複数出来ますが私のスキルの限界でhtml >のファイル名を決めるだけで中身に手を入れず、ファイル名と同じ >フォルダを用意し中に1~のpngファイルとdata.jsを放り込むだけ >でページ作成が可能になるように考えた結果であります サーバサイドのプログラムは使わないにしても、ANo2でも書きましたように、HTMLファイルを複数作成しなくても良いのではないでしょうか?  hogehoge.html?date=20140623 のようなアクセス方法が可能であれば、HTMLファイルは一つのものですむと思います。 ご質問でご提示の方法で「HTMLファイル名(URL)から参照データを作成する」部分を「URLのクエリ部から参照データを作成する」といったように変えればあとは同じで済むと思います。 後者はlocation.searchから取得することが可能ですし、データファイル名を作成した後はまったく同じ処理で済むと思います。 >理想は、data.jsに該当する物は一つで配列名を可変出来れば・・・ >もっとシンプルになるのですが このイメージがどのようなものなのかよくわかりませんが、dataファイルが一つということは全情報が1ファイルになっているということでしょうか? 無理やりやるなら、  window["fuga"] で、グローバル変数fugaにアクセスができるので、できないことはないと思いますが、document.writeと同様お勧めはできません。(グローバル変数に限っています) 変数名を変えたいような場合の解決法の一つとして、変数を配列にしておいてそのindexを変えることで対応可能かと思います。(変数名は固定、indexが可変) (ご提示の変数がすでに配列ですので、配列を配列化することになります) それによって、indexを渡せばそれに応じたデータを取得することが可能になります。 でも、1ファイルにある全てのデータを一旦読み込んでから、その(ごく)一部のみを利用するのでは、無駄な通信を増やすことになりませんか? その意味からも、データは別ファイルにしてあるほうが宜しそうな気がしますが… >ちなみに、メニューのスクロール機能のためにajax?は利用していますが~~ であれば、その関数を利用することでデータファイルの形式もかなり自由にできますね。 実行順序の制御も、コールバックを利用することで確実になります。 まぁ、このあたりはデータをどのように作成しているかやそのデータを他に利用しているかといったことも関係してきますので、ご質問の文章だけでは判断はできませんが…

sulay
質問者

お礼

再度のご助言ありがとうございます。 URLクエリ・・・恥ずかしながら知りませんでした。もちろん、あちこちのアドレスで見て知ってはいた物のそれが何なのか、CGIとか特殊な処理の物と思っていました。 今更ながら、調べたところfujillinさんの仰るとおりhtmlファイルは一つでURLクエリからデータファイルのアドレス生成が可能なようです。 > でも、1ファイルにある全てのデータを一旦読み込んでから、その(ごく)一部のみを利用するのでは、無駄な通信を増やすことになりませんか? > その意味からも、データは別ファイルにしてあるほうが宜しそうな気がしますが… データファイルの単独化は確かにテキストの文字データとはいえ今後のデータも次々追加されていきますのでデータの利用率は悪化していきますね・・・ 上記のURLクエリを使用して個別化する方向で行きたいと思います。 > >ちなみに、メニューのスクロール機能のためにajax?は利用していますが~~ > であれば、その関数を利用することでデータファイルの形式もかなり自由にできますね。 > 実行順序の制御も、コールバックを利用することで確実になります。 導入してる物を確認したところjqueryのセットでした(^-^; 現在、取りあえずタグを分割することで動作させることに成功しました。 yambejpさんが紹介してくれたタグをクリエイトする関数を試したのですがそのまま貼り付けても動かず・・・ これから調べながら動くようにしていきたいと思います。

その他の回答 (2)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

質問の内容がよくわかってませんが・・・ ご提示の手順で読み込むことは可能ですが、通信環境(あるいはブラウザ)によって実行順が変わるようです。 例えば外部ファイルを <test.js>  alert("a"); として、 <script type="text/javascript"> document.write('<script type="text/javascript" src="test.js"><' + '/script>'); alert("b"); </script> で、読み込むと、  IE8・・・ b → a  FX31・・・a → b となります。 一旦ブラウザに制御を戻して、 <script type="text/javascript"> document.write('<script type="text/javascript" src="test.js"><', '/script>'); </script> <script type="text/javascript"> alert("b"); </script> とすれば、a → bとなるようです。 もっとも、ANo1様もおっしゃているようにdocument.writeを使用するのはあまり…という感じではありますが。 一方で、ご提示のようなことができたとしても、  20140623.html  20140624.html  ・・・・・・ のように、同じようなファイルが沢山できるのではないかと想像しますが、それって、わざわざ一般化して読み込むことにほとんど意味がないように感じます。(個別ファイルなのだから、個別で指定しても同じ) HTMLは一つだけで、データファイルだけ更新(追加)すれば表示できるほうがまだましで、例えば  hogehoge.html に一本化して、ファイル名に当たる部分はクエリ部を利用して渡すようなことにすれば、一般化することの意味があると思いますけど。 データをどのように作成しているのか不明ですが、jsファイルにしなくともデータのみのファイルの方がわかりやすいのではないかと思います。他からも利用しやすいでしょうし。(csvとかjasonなど) (読込がajax利用などになってしまいますが) どうせなら、サーバサイドで処理してしまうのが一番簡単でもっともらしい方法かも。

sulay
質問者

お礼

回答ありがとうございます。 一度、スクリプトを閉じることで実行順を固定できるわけですね! また、ご指摘その通りであります。ただ、サーバサイドはWEBサーバ環境が社内NASを利用した簡易な物 (最もコストが掛からない方法としてこうなりました)のため、プログラムを追加すれば可能ではあったはずですが、メインはNASとしてのファイルサーバなので負荷を上げるわけにもいかず、私のスキルも足りずで現段階では不可能な方法となります。 また、ご指摘通りhtmlファイルが複数出来ますが私のスキルの限界でhtmlのファイル名を決めるだけで中身に手を入れず、ファイル名と同じフォルダを用意し中に1~のpngファイルとdata.jsを放り込むだけでページ作成が可能になるように考えた結果であります(^-^; 理想は、data.jsに該当する物は一つで配列名を可変出来れば・・・もっとシンプルになるのですが(>_<) ちなみに、メニューのスクロール機能のためにajax?は利用していますが活用方法なども分からず、基本的なプログラムが書ける程度のスキルです(^-^;

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちょっと真剣に読んでないけど、ようはスクリプト内でスクリプトタグを書きたいということ? 「</script>」が現れた時点でスクリプトタグが簡潔しちゃうからでしょうね 昔からよくあるのはタグを分割しちゃうパターン >document.write ('<script type="text/javascript" src="./topics/'+fileName[0]+'/data.js" charset="UTF-8"></script>'); なら document.write ('<script type="text/javascript" src="./topics/'+fileName[0]+'/data.js" charset="UTF-8"></'+'script>'); みたいな感じ? ただプログラム的に美しくないので window.onload=function(){ var n=document.createElement("script"); n.setAttribute("type","text/javascript"); n.setAttribute("src","./topics/"+fileName[0]+"/data.js"); n.setAttribute("charset","UTF-8"); document.getElementsByTagName("head")[0].appendChilid(n); } みたいな処理をかくケースもあります

sulay
質問者

お礼

なるほど!document.writeで出力したスクリプトの終了タグで終わっちゃっているわけですね・・・ 確かに、無理矢理タグを分割しても美しくないですので紹介して頂いた方法を試してみたいと思います。 ありがとうございました

関連するQ&A

  • ブログパーツのjquery利用について

    ブログパーツでjqueryを使用してhtmlなどを出力したいのですが、 思い通りの動作ができません。 jsファイルの中身 ------------------------------------------------------------ document.write("<script type='text/javascript' src='http://hoge.com/jquery.js'></script>"); document.write('<link rel="stylesheet" type="text/css" href="http://hoge.com/hoge.css">'); $(function() { $("div").html("<p>aaaaaaaaa</p>"); }); document.write('<div></div>'); ------------------------------------------------------------ これじゃあ、ほかのサイトからjsを読み込んでも 出力されないのでしょうか? (<script src="http://hoge.com/hoge.js"></script>) document.write("<div>aaa</div>");だけであれば、 ちゃんと出力されるのでjqueryの記述がおかしいのだと思います。 ご教授お願いいたします。

    • ベストアンサー
    • AJAX
  • FacebookのCommentsについて

    Facebookのapi(JavaScript)にてFacebookページのウォールを取得し、各投稿ごとに動的にIDを付加したCommentsプラグインを表示したいと思っています。 下記要領で実行すると、htmlは正しく挿入されている(Firebugにて確認)のですが、Commentsが読み込まれません。 同じファイル内でgetWall関数外に静的にHTMLを記述するとCommentsは表示されます。 どうすれば動的に識別子を付加したCommentsを表示させることができますでしょうか? <!-- SDK読み込み --> <div id="fb-root"></div> <script>(function(d, s, id) {  var js, fjs = d.getElementsByTagName(s)[0];  if (d.getElementById(id)) return;  js = d.createElement(s); js.id = id;  js.src = "//connect.facebook.net/ja_JP/all.js#xfbml=1";  fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'facebook-jssdk'));</script> <script>   function getWall() {     FB.api(       '/ -- ID -- /feed',       { access_token: ' -- 取得したアクセストークン -- ' },       function(response) {         // 取得後のコールバック         var contents = '';         for (var i = 0; i < response.data.length; i++) {           if(response.data[i]['message']){             contents += "<div class='topic_block' id='topic_" + response.data[i]['id'] + "'\>";             contents += response.data[i]['message'];             contents += "</div>";             contents += "<div class='fb-comments' data-href=' -- パーマリンク等、投稿毎の識別子 -- ' data-num-posts='10' data-width='470'></div>";             contents += "</div>";           */           }         }                     // ウォールの内容を表示させる         document.getElementById('topics').innerHTML = contents;       });   }      window.fbAsyncInit = function() {     getWall();   }; </script> <div id='topics'></div>

  • 外部ファイルを利用したい

    現在、Webの勉強を始めたのですが、自分でいろいろ作成していてうまくいかないので、教えて下さい。 htmlファイルが幾つかあるのですが、全てのページに同じテーブルタグを使用するので、JavaScriptの外部ファイルで書き出してそれぞれを各htmlファイルで呼び出そうと思っていますが、うまくいきません。 ★jsファイル/xx.js★ <SCRIPT language="JavaScript"><!-- document write("<table border='1'"); document write("<tr><td><img src='xx.gif'></td></tr>"); document write("</table>"); --> ★htmlファイルでの呼び出し★ <html> <head><title>外部ファイル呼び出し</title></head> <body><script language="JavaScript" src="xx.js"></script> </body></html> かなり素人なので変な書き方をしていると思いますが、ご指導お願いします。

  • JavaSciptを外部ファイルとして複数htmlファイルで利用したい

    JavaScriptでos、ブラウザ毎にフォントを一定化するスタイルシートをつくりました。このJavaSciptを外部ファイルにして複数のページから読み込ませるようにしたいのですが、XXX.jsファイルを読み込ませるための方法が分かりません。jsファイルの外部リンクの方法、またそれをhtmlページ内で適応させるためのタグも教えてください。 ちなみに今までは全ページに <script language="JavaScript"> <!-- mac=(navigator.appVersion.indexOf('Mac')!=-1)?true:false; ie=(navigator.appName.charAt(0)=="M")?true:false; document.write("<STYLE TYPE='text/css'><!--") if(mac){ //FOR MACINTOSH IE NS document.write(".e9{font-size:9px}") document.write(".e10{font-size:10px}") document.write(".e12{font-size:12px}") document.write(".j9{font-size:9px}") document.write(".j10{font-size:10px}") document.write(".j12{font-size:12px}") (中略) //--> </script> を記載し、それぞれ<div class="e12">~</div>で挟んでいました。

  • document.writeの書き方

    document.write("<div class='sponsors'><p><a href=\"" + banner[rndindex[i]].url + "\" target='_blank'><span class='guard'><script type='text/javascript' src='http://abc.com/js/abc.js'></script></span><img src=\"" + banner[rndindex[i]].src + "\"></a></p><p> " + banner[rndindex[i]].text + "</p></div>"); この中の <script type='text/javascript' src='http://abc.com/js/abc.js'></script> ですが、記述の仕方は合っていますでしょうか?FLASHを呼び出したいのですが、これを入れるとレイアウトが崩れてしまいます。 どうぞよろしくお願いいたします。

  • javascript 初心者です 変数について

    javascript 初心者です 変数について html内のbodyに次のように記述しています。 <script type="text/javascript"> <!-- var hensu1=7; var hensu2=2; var hensu3=5; var hensu4=4; for(i=1;i<=4;i++){ document.write("<div>"); for(j=1;j<="hensu"+i;j++){ document.write("<img src='sample.png'/>"); } document.write("</div>"); } --> </script> for(i=1;i<=4;i++)でdivを4つ並べ、 その中にそれぞれsample.pngをhensu分だけ並べ対のですが、 for(j=1;j<="hensu"+i;j++)の部分で "hensu"+i の記述の仕方が分からず、 上記の書き方だと表示されません。 正しい書き方を教えていただけないでしょうか?

  • 『外部JSファイル』を呼び出しても思った動作しない

    下記内容の『外部JSファイル』を呼び出しているのですが 広告が表示されません。 下記内容に不備ありましたら、ご指摘お願いいたします。 document.write("<div align='center'>") document.write("<p>") document.write("<script type='text/javascript'><!--") document.write("google_ad_client = 'hogehogeID';") document.write("/* 200*200 */") document.write("google_ad_slot = 'slotnumber';") document.write("google_ad_width = 200;") document.write("google_ad_height = 200;") document.write("//-->") document.write("</script>") document.write("<script type='text/javascript'") document.write("src='http://pagead2.googlesyndication.com/pagead/show …") document.write("</script>") document.write("</p>") document.write("</div>") 広告が出ないというか、google_ad_widthとgoogle_ad_heightの値が渡っていないようです。 よろしくお願いいたします。

  • 外部javascriptファイルの中にさらに外部javascriptファイルを入れたい

    javascript初心者です。 メニューの一部を外部ファイルによるツリーメニューにし、 さらにメニュー部分全体を外部ファイルにしようとしましたが、 メニュー部分全体を外部ファイルに移したら、 中のツリーメニューが機能しなくなってしまいました。 いろいろ試してみましたが、付け焼き刃の知識では皆目見当が付きません。 ご指摘いただけると嬉しいです。内容は下記の通りです。 メニュー全体の外部ファイル「menu.js」 document.write('<div id="menu">'); document.write('<h1>お役立ち情報<\/h1>'); document.write('<ul>'); document.write('<script src="javascript\/tree.js" type="text\/javascript"><\/script>'); document.write('<li><a href="javascript:tree("click1");" title="">HOME<\/a>'); document.write('<\/li>'); document.write('<div id="click1" style="display:none;">'); document.write(' <a href="未設定" title="作成中です" target="未定">第1ページ <\/a>'); document.write('<br>'); document.write(' <a href="未設定" title="教えられません" target="未定">第2ページ <\/a>'); document.write('<br>'); document.write('<\/div>'); document.write('<li><a href="javascript:tree("click2");" title="">お知らせ<\/a>'); document.write('<\/li>'); document.write('<div id="click2" style="display:none;">'); document.write(' <a href="未設定" title="作成中です" target="未定">第3ページ <\/a>'); document.write('<br>'); document.write(' <a href="未設定" title="教えられません" target="未定">第4ページ <\/a>'); document.write('<br>'); document.write('<\/div>'); document.write('<li><a href="#">DOWNLOAD<\/a>'); document.write('<\/li>'); document.write('<\/ul>'); document.write('<\/div>'); 中に入れてあるツリーメニューの外部ファイル「tree.js」 function tree(id) { if (document.getElementById(id).style.display == "block") document.getElementById(id).style.display="none"; else document.getElementById(id).style.display="block"; } .htmlの記述はこうなっています。 <script src="menu.js" type="text/javascript"></script>

  • Javascriptの変数の中に変数を代入するには

    Google chart というAPIがあります。これを利用して株価Chartを作ります。 https://google-developers.appspot.com/chart/interactive/docs/gallery/candlestickchart 末尾にGoogle Chartのソースを記載していますが このvar data内の ['Mon', 20, 28, 38, 45], ['Tue', 31, 38, 55, 66], ['Wed', 50, 55, 77, 80], ['Thu', 77, 77, 66, 50], ['Fri', 68, 66, 22, 15] の部分を変更することによりローソクチャートが引けます。 一方、 <script type="text/javascript"> var chart; chart = "<div id='chart'></div>"; document.write("" + chart + ""); </script> と記載すると ['Mon', 20, 28, 38, 45], ['Tue', 31, 38, 55, 66], ['Wed', 50, 55, 77, 80], ['Thu', 77, 77, 66, 50], ['Fri', 68, 66, 22, 15] のような株価変数が取得できるjavascriptを作成しました。 この2つを組み合わせると、株価チャートが引けることとなります。 ************************ 現在の苦境状況 ************************ Google chart APIに、下記のように「document.write("" + chart + ""); または "" + chart + "";または  + chart + ;」を代入してみたのですが、チャートは表示されません。 変数の中に変数を入れたことが原因と思いますが、どのようにすればいいかアドバイス願います。 <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> var chart; chart = "<div id='chart'></div>"; google.load("visualization", "1", {packages:["corechart"]}); google.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ document.write("" + chart + ""); ], true); var options = { legend:'none' }; var chart = new google.visualization.CandlestickChart(document.getElementById('chart_div')); chart.draw(data, options); } </script> </head> <body> <div id="chart_div" style="width: 900px; height: 500px;"></div> ************************ GoogleChart ************************ <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("visualization", "1", {packages:["corechart"]}); google.setOnLoadCallback(drawChart); function drawChart() { var data = google.visualization.arrayToDataTable([ ['Mon', 20, 28, 38, 45], ['Tue', 31, 38, 55, 66], ['Wed', 50, 55, 77, 80], ['Thu', 77, 77, 66, 50], ['Fri', 68, 66, 22, 15] ], true); var options = { legend:'none' }; var chart = new google.visualization.CandlestickChart(document.getElementById('chart_div')); chart.draw(data, options); } </script> </head> <body> <div id="chart_div" style="width: 900px; height: 500px;"></div>

  • htmlファイルのインクルード

    htmlファイルのインクルード あるページを複数の別のhtmlファイルを読み込んで構成しようと思っています。 以下がソースなのですがFirefoxでは samplesample テストテスト と表示されるのですが、Internet Explorerでは テストテスト のみが表示されsample.htmlが読み込まれません。 何がいけないのでしょうか。 よろしくお願いします。 [index.html] <html> <head> <title>テストページ</title> <script type="text/javascript" src="prototype.js"></script> <script type="text/javascript"> function my_include(id, file) { document.open(); document.write('<div id="' + id + '"></div>'); document.close(); var options = {}; options.method = "get"; options.asynchronous = true; new Ajax.Updater(id, file, options); } </script> </head> <body> <div id="headers"></div> <script type="text/javascript">my_include("headers","sample.html");</script> テストテスト </body> </html> [sample.html] <head> <title>sampleページ</title> </head> <body> samplesample </body> </html> [バージョン情報] Firefox 3.6.3 Internet Explorer 8 prototype.js 1.6.1

    • ベストアンサー
    • HTML

専門家に質問してみよう