JavaScriptで保守性の高いコードを書く方法

このQ&Aのポイント
  • JavaScriptで保守性の高いコードを書くためには、document.writeやgetElementByIdを使わずに、関数やクラスを活用することが重要です。また、id名を変更する必要がある場合は、変更箇所を一箇所にまとめるなど、変更が容易になるような設計を意識しましょう。
  • 上記のようなHTMLを生成する際に、コードの可読性を向上させるためには、テンプレートエンジンを利用する方法もあります。テンプレートエンジンを使うことで、HTMLの部分とJavaScriptの処理を分離することができ、メンテナンス性も向上します。
  • JavaScriptの開発環境やライブラリには、コード品質を向上させるためのツールも多く存在します。例えば、ESLintやPrettierなどの静的コード解析ツールを導入することで、一貫したコーディング規約に沿ってコードを書くことができます。さらに、フレームワークやライブラリのドキュメントを参考にすることも、保守性の高いコードを書くために役立ちます。
回答を見る
  • ベストアンサー

JavaScript 保守性の高いコードの書き方

保守性の高いコードを書きたいです。JavaScriptでdocument.write("<div id='main'></div>")みたいに書いて、後でこの要素にいろいろなコードでdocument.getElementById('main').innerHTMLします。しかし、その後id名mainを他の名前に変えると、多くのソースコードを手作業で変更しなくてはなりません。この手間を削減するJavaScriptの書き方はありますか? 例えば、 <table id="board">   <tr>    <td id="b0_0">A</td>    <td id="b0_1">A</td>    <td id="b0_2">A</td>    <td id="b0_3">A</td>  ・  ・  ・ 上記のようなHTMLを作成する、以下のようなコードがあります。 <table id='board'></table> <script>  var content = "";  for(i = 0; i < 5; i++){   content += "<tr>"   for(j = 0; j < 4; j++){    content += "<td id='b"+ i + "_" + j +"'>A</td>"   }   content += "</tr>"  }  $('table#board').html(content) // JQueryを使っているつもりです   </script> このコードの問題点は少なくとも2つあって、 1つは、2重ループ内の「content += "<td id='b"+ i + "_" + j +"'>A</td>"」が読みづらいことです。 2つ目は、今は td id='b0_1'のような形式ですが、このid名を変更しようと思ったときに、変更が容易ではないことです。 特に2つ目は、いろいろな場所にあるコードから$('table#board td#b1_1').html('B')のような操作をしていると、かなり変更が大変です。 こういったことを乗り越えるためのJavaScriptのコード設計法(?)やIDEやライブラリなどがありましたら教えて下さい。よろしくお願いします

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

  • ベストアンサー
noname#247307
noname#247307
回答No.3

保守性を高めたい、ということですよね。であるならば、オブジェクト化を進めることだと思います。 ・マジックナンバー、マジックストリングを排除する コード内に直接書かれている意味がわからないリテラルのことです。idのmainなどもそうですね。こうしたものはすべてオブジェクト内に定数プロパティとしてまとめておき、それを参照する形で記述します。例えば、こんなオブジェクトを定義しておき、 function Literal() { var main = "main"; this.main = function(){ return main; } } var literal = new Literal(); innerHTMLではこのようにします。 document.getElementById(literal.main()).innerHTML = …… コード内で"main"を参照する部分はすべてliteral.main()を使います。こうすれば、後で名前を変更したいときは、Literalのvar mainの値を書き換えるだけです。 ・処理のメソッド化 処理専用のオブジェクトを用意し、そこに具体的な処理をすべてメソッドとしてまとめます。例えばテーブルを変数contentにまとめている処理なども、こんな感じにします。 function ContentBuilder() { this.getTable = function(prefix, arraydata){ var content = ""; for(i = 0; i < arraydata.length; i++){ var row_array = arraydata[i]; content += "<tr>"; for(j = 0; j < row_array.length; j++){ content += "<td id='" + prefix + i + "_" + j +"'>" + row_array[j] + "</td>"; } content += "</tr>"; } return content; } } var builder = new ContentBuilder(); これで、builderのgetTableを呼び出すことでテーブルのコードが得られるようになります。こんな感じですね。 var data = [ ['a','b','c'], ['あ','い','う'], [1, 2, 3] ]; document.write(builder.getTable("xxx",data)); 生成されるタグのidがどのように設定されているか確認してみてください。引数のプレフィクスを変えればIDもすべて変わります。 このように、「変数・定数をすべて1つのオブジェクトにまとめる」「処理はオブジェクトのメソッドにまとめる」というようにしていき、全ての値や処理は必ずこれらのオブジェクトのメソッドを呼び出すようにします。 こうすれば、後で修正する場合も、オブジェクトのプロパティなどを変更すれば、すべてのところで反映されます。更に、定義したオブジェクト類は別ファイルに切り離し、そのスクリプトファイルをロードするようにすれば、ページデザインと処理(ビジネスロジック)も切り離し別々に管理できます。 JavaScriptはオブジェクト指向言語ですから、それを活用しない手はありません。オブジェクト指向についていろいろ調べてみるとよいでしょう。

newtgecko
質問者

お礼

ご回答ありがとうございます! JavaScriptでのオブジェクト指向の活用法がわかった気がします!私はJavaをやっていて、より洗練されたオブジェクト指向をもつScalaにも魅力を感じてるので、オブジェクト指向の発想は分かります。JavaScriptは、はっきりとしたクラスはないし(と思っていて)、オブジェクト指向で組もうとすることはありませんでした。 Javaで磨いたオブジェクト指向をこれからはJavaScriptでも発揮したいと思います。ありがとうございました。

その他の回答 (3)

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.4

そういったケースでは、IDを1つ1つ付けるべきではありません。 行数、列数が分かっていれば('#board td')で一連のリストとして取得するか、 どうしても二次元リストが良ければ('#board tr')で取得してその後('td')で取得すればできます。

newtgecko
質問者

お礼

ご回答ありがとうございます 私の例が悪すぎました。別に例はtableでなくても良かったです。単に幾つか入れ子になる自然なHTMLを書こうとしただけなんです。

  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.2

こんな感じでどうでしょう。2つ目の「変更が容易ではない」の意味がイマイチよく分かりませんが、1つ目の「読みづらいこと」は改善しているし、もしかしたらこれで2つ目も解決したことになるのではと思います。 // コードの先頭辺りに定数として書く。「var content = "";」の前かな var TD_BASE = "<td id='【ID】'>A</td>"; … for (var j = 0; j < 4; j++) {   var id = "b" + i + "_" + j;   content += TD_BASE.replace("【ID】", id); } また、「var TD_BASE = "<td id='【ID】'>A</td>";」ではなく 「var TD_BASE = "<td id='b【row】_【col】'>A</td>";」などとし、replaceを2つ続けるようにしてもいいと思います。 それからfor文内のインデックス変数の部分ですが、「var j = 0」と明示的に書いた方がいいですよ。そうでないとグローバル変数を使うことになります。このケースでは問題は起きませんが、例えばループ内で関数を呼んでいて、その関数の中でもfor文を使っている場合には、同一の変数を使うことになってしまい正しく動かなくなりますので。

newtgecko
質問者

お礼

ご回答有難うございます。 私の言葉が足りなかったです。 結局やりたいことは、Javaの開発環境Eclipseにある変数名変更する機能がある開発環境とかがあるといいんですけどね。Eclipseだと変数にカーソルを当てて特定のショートカットキーを押すとその変数を使用しているすべての箇所の変数名が編集できるんです。そういった感じ、簡易にid名を変更できたらいいなと思っていました。 しかし、JavaScriptは文字列のなかにコードがあるので、Javaのようにある識別子がどこで使われているか解析するのは困難そうなので、無理なのは覚悟しているのですが。 Webサービスを大規模開発している人たちはどのようにid名などをを管理しているのか気になります。

newtgecko
質問者

補足

お礼に書き忘れました。 for文の件ありがとうございます。varつけていいことを知りませんでした。for(i=...だと for(window.i= ...になっちゃうんですかね?

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.1

少々面倒ですが、JavaScript に備わっている DOM を利用するのがもっとも素直でしょう // 行を作る var row = document.createElement('tr'); document.getElementById('board').appendChild(row); // 欄を作る var cel = document.createElement('td'); cel.id = 'b' + i + '_' + j; cel.textContent = 'A'; row.appendChild(cel); jQuery を使っているならば、DOM の記述を多少は簡略化できます // 行を作る var row = $('<tr/>').appendTo('table#board'); // 欄を作る $("<td/>").attr('id', 'b' + i + "_" + j).text('A').appendTo(row);

newtgecko
質問者

お礼

ご回答ありがとうございます。 DOMを使うのもひとつの手ですね。ただ、結局innerHTMLを使う時と変わらないですね。'b' + i + '_' + jは結局ありますし、 "b{i}_{j}"みたいな記法出来なんですかね? もしくは、Cのフォーマット指定のようにformat("b%v_%v", i, j)のような関数が文字列を返すとか?ないですかね?

関連するQ&A

  • JavaScriptでアコーディオンメニューを作る

    こちらでよくお世話になっています。 JavaScriptに詳しい方、どうか教えてください。 当方、まだまだJavaScriptは初心者です。 以下のようなHTMLがあって、 コンテンツ部分を普段は非表示で タイトル部分をクリックしたら、 その下の表示・非表示が切り替わるようにしたいと考えています。 (アコーディオンの感じです。) ------------------------- <div id="title1">タイトル1</div> <table id="contents1">  <tr><td>コンテンツ1</td></tr> </table> <div id="title2">タイトル2</div> <table id="contents2">  <tr><td>コンテンツ2</td></tr> </table> <div id="title3">タイトル3</div> <table id="contents3">  <tr><td>コンテンツ3</td></tr> </table> ちなみに、それぞれタイトルとコンテンツがセットになっていて、 titleのid名の末尾の番号と そこをクリックしたら、開閉するtableのid名の末尾の番号を一致させています。 ※このタイトルとコンテンツは動的に増えたり減ったりします。 プラグインを入れないで 自分でjavascriptを組みたいと考えているのですが どのようにすればよいのか、分からず こちらで質問をさせていただきました。 var divList = document.getElementsByTagName('div'); for(i=0; i<divList.length; i++){ } のようにやっていくのだろうとは思うのですが for文の中をどのように書いたらよいかを ご教授いただけたら助かります。 どうぞ宜しくお願いいたします。

  • JavaScript 保守性の高めたい 2

    マジックナンバーを排除して、保守性の高いコードを書きたいです。前回も保守性を高めたいと質問させていただきお世話になりました。 例えば、 <table border="1">  <tr>   <td onclick="users['NkxyZ'].show();">User</td>  </tr>  <tr>   <td onclick="users['BkcSk'].show();">User</td>  </tr>  <tr>   <td onclick="users['HnViOj'].show();">User</td>  </tr> </table> 上記のHTMLを生成する、以下のコードがあります <script> // メイン  var users = {'NkxyZ': new User("Taro", 41),          'BkcSk': new User("Hanako", 17),          'HnViOj': new User("Harushige", 8)};  var usersTable = new UsersTableBuilder();  document.write(usersTable.getTable(users)); </script> <script> // 以下のコードは外部ファイルで、読み込み済みです  // ユーザを管理するクラス  var User = function(name, age){   this.name = name;   this.age = age;  }  User.prototype.show = function(){   alert(this.name +" ("+ this.age+")");  }    // ユーザテーブルを返すクラス  var UsersTableBuilder = function(){   this.tagId = 'users_table';  }  UsersTableBuilder.prototype.getTable = function(users){   var out = "<table border='1'>";   for(var id in users){    out += "<tr><td onclick=\"users['"+ id +"'].show();\">User</td></tr>"   }   out += "</table>";   return out;  } </script> このコードで私が一番気に入らないのは、UsersTableBuilderのgetTable()メソッドです。このメソッドのfor文内の  "<tr><td onclick=\"users['"+ id +"'].show();\">User</td></tr>" では User#show()メソッドが文字列で表現されてしまっています。show()がマジックナンバーぽくなってしまっています。このままでは、Userクラスでshow()メソッドの名前を変えた時などに、変更し忘れになるかもしれません。 JavaのEclipseには変数名を変更できるリファクタリング機能がありますが、そのような機能が使えるJavaScriptの開発環境の時、文字列の状態のコードだと検出できなさそうなので、どうにかして、プログラムの文字列表現から抜け出したいです。 よろしくお願いします。

  • JavaScriptで特定のtdタグにclass名をつけたい

    指定のdiv内にある一行目(もしくは、最初の3つ)のtdタグに対して JavaScriptでClass名を付けたいのですが、どのようにすればよいでしょうか? 【HTML参考】 <div id="box"> <table> <tr> <td>セル1</td> <td>セル2</td> <td>セル3</td> </tr> <tr> <td>セル4</td> <td>セル5</td> <td>セル6</td> </tr> </table> </div> 上記のような時、div#box内の「セル1~3」に対してclass名を付けたいと言った場合です。 よろしくお願いいたします。

  • javascriptによる計算

    テキストボックス「a1~6」の値とテキストボックス「b1~6」に入力された値を足し算してテキストボックス「c1~6」(例…c[i] = a[i] + b[i])を計算するJavaScriptを作成しているのですが、結果がundefinedになってしまい上手くいきません。どうやったら動くのかどうかご教授ください。 以下ソース↓ <script language ="JavaScript"> function plus() { var intResult = 0; for (i=1; i<=6; i++){ intResult[i] = 0; if (!isNaN(document.forms["A"].all["a"+i].value) && !isNaN(document.forms["B"].all["b"+i].value)){ intResult[i] += parseInt(document.forms["A"].all["a"+i].value); intResult[i] += parseInt(document.forms["B"].all["b"+i].value); } <table border = 1> <tr> <td> <table border = 1> <tr> <td> <form name="A"> <input type = "text" size = 5 name = "a1"></input> </td> <td> <input type = "text" size = 5 name = "a2"></input> </td> <td> <input type = "text" size = 5 name = "a3"></input> </td> </tr> <tr> <td> <input type = "text" size = 5 name = "a4"></input> </td> <td> <input type = "text" size = 5 name = "a5"></input> </td> <td> <input type = "text" size = 5 name = "a6"></input> </form> </td> </tr> </table> </td> <td> <table boeder = 1> <tr> <input type = "button" onClick="plus()" value = "+"></input> </tr> </table> </td> <td> <table border = 1> <tr> <td> <form name = "B"> <input type = "text" size = 5 name = "b1"></input> </td> <td> <input type = "text" size = 5 name = "b2"></input> </td> <td> <input type = "text" size = 5 name = "b3"></input> </td> </tr> <tr> <td> <input type = "text" size = 5 name = "b4"></input> </td> <td> <input type = "text" size = 5 name = "b5"></input> </td> <td> <input type = "text" size = 5 name = "b6"></input> </form> </td> </tr> </table> </td> </tr> </table> 答え <form name = "C"> <table border = 1> <tr> <td> <input type = "text" size = 5 name = "c1"></input> </td> <td> <input type = "text" size = 5 name = "c2"></input> </td> <td> <input type = "text" size = 5 name = "c3"></input> </td> </tr> <tr> <td> <input type = "text" size = 5 name = "c4"></input> </td> <td> <input type = "text" size = 5 name = "c5"></input> </td> <td> <input type = "text" size = 5 name = "c6"></input> </td> </tr> </table> </form> </body> document.C.all["c"+i].value = intResult[i]; } } </script>

  • JavaScriptのソースコード教えてください。

    JavaScriptで下記はボタンではなく画像でリンク先が出現するソースを実現したいです。 <script type="text/javascript"などでjsファイルを読み込むような感じでもいいです。 ここまでがjsファイルでここまでがhtmlと言うように分けて記述してもらえると助かります。 <html> <head> <title>oooのページ</title> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <script language="javascript"> <!-- function next(){ location.href="ttp://www.ooo.jp/ooo/123456"; } function Check() { var obj = document.getElementById("agreement"); if(obj.scrollTop + obj.clientHeight >= obj.scrollHeight - 1) { document.form1.submit1.disabled = false; document.form1.submit1.focus(); } } //--> </script> </head> <body bgcolor="#FFFFFF" text="#000000"> <table width="500" border="0" cellspacing="0" cellpadding="5"> <tr> <td align="center" bgcolor="#999999"><font color="#000000"><b>ご利用規約</b></font></td> </tr> <form name="form1" action="" method="post"> <tr> <td align="center"> <div id=agreement style="width:400px; height:100px; overflow: scroll; border:1px solid gray;" onScroll="Check()"> テキスト<br> テキスト<br> テキスト<br> テキスト<br> テキスト<br> テキスト<br> </div> <input type="button" value="依頼する" name="submit" id="submit1" disabled onClick="next()"> <input type="submit" value="キャンセル" name="submit2" id="submit2" onclick="history.back()"> </td> </tr> </form> </table> </body> </html>

  • JS 簡単なコードで表を転置できますか?

    JavaScript 簡単なコードで表を転置できますか? ここに1つのテーブルがあります。 これを簡単なコードで 転置できますか? ここにいう転置とは、 表のセルについて、(m×n行列) => (n×m行列) に変換することです。 <仕様> ・テーブルの列と行を入れ替える ・文字は横書きのままで変更なし ・Vanilla JS で ( jQuery 無用 ) ・チェックボックスでトグル <div><input type="checkbox" id="menu">転置</div> <div class="container"> <table id="table2" border="1"> <caption>世界の高い山 トップ10</caption> <thead> <tr><th>順位</th><th>山の名称</th><th>標高 (m)</th></tr> </thead> <tbody> <tr><td> 1位</td><td>エベレスト</td><td>8,848</td></tr> <tr><td> 2位</td><td>K2</td><td>8,611</td></tr> <tr><td> 3位</td><td>カンチェンジュンガ</td><td>8,586</td></tr> <tr><td> 4位</td><td>ローツェ</td><td>8,516</td></tr> <tr><td> 5位</td><td>マカルー</td><td>8,485</td></tr> <tr><td> 6位</td><td>チョ・オユー</td><td>8,201</td></tr> <tr><td> 7位</td><td>ダウラギリ</td><td>8,167</td></tr> <tr><td> 8位</td><td>マナスル</td><td>8,163</td></tr> <tr><td> 9位</td><td>ナンガ・パルバット</td><td>8,126</td></tr> <tr><td>10位</td><td>アンナプルナ</td><td>8,091</td></tr> </tbody> </table> </div>

  • javascriptのフラグの使われ方 コード有

    javascriptの初心者です。 サンプルコードを使って勉強しているので、 フラグの使われ方について質問があります。 下にあるコードは、 4枚縦並びになった写真を、ボタンで1枚ずつスライドするスクリプトです。 その中にあるflag変数は、おそらくボタンを2度押しした時に、 一気に2枚スライドをするのを防ぐための、関数使用中を示す変数と思います。 ここで2つ質問です。 ●flag変数はここでは、何を表してますか? ●initable関数を抜ける前、後、どちらでスライド動作をしていますか? ----私の考え方(思い込み?)------------ このコードでちゃんと画像がスライドするのですが、 flag = ture とする場所が遅すぎる感じがします。 というのも、 slidetable関数の中に、ifがあるので その条件がクリアするまで、関数から抜けだせません。 やっと抜けだしてはじめて、flag = trueと設定する。 flag変数が、使用中を表すものだとしたら、 スライド関数に行く前に、flag = tureとして、 「関数は使用中なので、今クリックしてもreturnしますよ」とさせるのでないか? 実際は、どのタイミングで動き出すものかよくわかりません。 chromeでブレークポイントを作って、 1つずつ動かすと、initableを抜けだした後に、 HTMLコードの所に移動したぞ。 この流れだったら、納得するけど。。。 --------------------------- スライド関数の処理は とりあえずどんな処理をするか受け付ける。(まだ動き出さない) ↓ flag =tureとして、inittable関数を抜けだして ↓ 動かす場所に、処理を一気に適用。 ---------私の考え方(思い込み?)以上------------ -------------------------------------------- <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>東京の風景</title> <script type="text/javascript"> <!-- var tablemax = 4; var tablewidth = 260; var step = 14; var num = 0; var offset = 0; var flag = false; function inittable(n){ if (flag) return; num += n; if (num < 0) { num = 0; return; } if (num >=tablemax) { num = tablemax-1; return; } offset = n * step; count = tablewidth / step; slidetable(); flag = true; } function slidetable(){ imgtables.style.pixelLeft -= offset; count--; if (count > 0) setTimeout("slidetable()",10); else flag = false; } --> </script> </head> <body> <img src="left.gif" onMousedown="inittable(-1)" style="position:absolute;top:220px;left:20px;"> <img src="right.gif" onMousedown="inittable(1)" style="position:absolute;top:220px;left:60px;"> <div style="position:absolute;top:10px;left:10px;clip:rect(0px 260px 200px 0px)"> <table id="imgtables" border="0" cellspacing="0" cellpadding="0" style="position:absolute;top:0px;left:0px;"> <tr> <td> <table bgColor="#ccccff" width="260"> <tr><td >東京フォト(1)</td></tr> <tr><td><img src="pic1.jpg" width="260" height="200"></td></tr> </table> </td> <td> <table bgColor="#ccccff" width="260"> <tr><td>東京フォト(2)</td></tr> <tr><td><img src="pic2.jpg" width="260" height="200"></td></tr> </table> </td> <td> <table bgColor="#ccccff" width="260"> <tr><td>東京フォト(3)</td></tr> <tr><td><img src="pic3.jpg" width="260" height="200"></td></tr> </table> </td> <td> <table bgColor="#ccccff" width="260"> <tr><td>東京フォト(4)</td></tr> <tr><td><img src="pic4.jpg" width="260" height="200"></td></tr> </table> </td> </tr> </table> </div> </body> </html>

  • PHPコード表示について

    PHPコードが下記になっています。 文字バケを正常に表示させる方法を教えてください。 <!-- login-box[start] --> <div id="login"> <?php if (isset($_SESSION['sLoginID'])) { ?> <form action="mem_logout.php" method="post"> <table> <tr> <td>。。<font color="#6699ff" size="3">「」 <b>イ餔ホノー</b></font></td> </tr> <tr> <td>。。<?php echo htmlspecialchars($_SESSION['sNickname']); ?>、オ、・/td> </tr> <tr> <td class="sp02"><div id="login_right">・愠ー・、・鹵讀ヌ、ケ。」</div></td> </tr> <tr> <td class="sp02"><div id="login_right"><input type="submit" value="・愠ー・「・ヲ・ネ" /></div></td> </tr> </table> <input type="hidden" name="fLoginID" value="dummy" /> <input type="hidden" name="fPassword" value="dummy" /> </form> <?php } else { ?> <form name="login" action="http://www.haradagr-dp.co.jp/test/mem_check.php" method="post" onsubmit="return loginCheck()"> <input type="hidden" name="fTarget" value="<?php echo $ftarget; ?>"> <table> <tr> <td colspan="2">。。<font color="#6699ff" size="3">「」 <b>イ餔ホノー</b></font></td> </tr> <tr> <td colspan="2" align="center">、ェサ釥キエ・ヨテ讀ヌ、ケ。」<br> ID。ァtestid<br> ・ム・ケ・・シ・ノ。ァtest1234</td> </tr> <tr> <td width="80" valign="bottom" class="login_bold"> ID </td> <td valign="bottom" class="sp02"><div id="login_input"><input type="text" name="fLoginID" size="16" maxlength="16"></div></td> </tr> <tr> <td width="80" valign="bottom" class="login_bold">・ム・ケ・・シ・ノ </td> <td valign="bottom" class="sp02"><div id="login_input"><input type="password" name="fPassword" size="16" maxlength="16"></div></td> </tr> <tr> <td colspan="2" class="sp02"><div id="login_right"><input type="image" src="image/log_in.gif" alt="・愠ー・、・・ width="100" height="20" border="0"></div></td> </tr> <tr> <td colspan="2"><div id="login_right"><font size="1" color="#ea5550">「ィ・ッ・テ・ュ。シ、鰺ュク妤ヒ、キ、ニ、ッ、タ、オ、、。」</font></div></td> </tr> </table> </form> <?php } ?> </div> <!-- login-box[end] --> <br> <div class="links" align="center"> <a href="http://www.haradagr-dp.co.jp/okusuri-navi/sodan.html" target="_blank"><img src="image/bullet250.gif" width="133" height="46" border="0"></a><br> 「ャ「ャ「ャ<br> 、ェフ・フ、マ、ウ、チ、鬢ォ、・/div> <br>

    • ベストアンサー
    • PHP
  • HTMLで文とテーブルの間が空く。

    現在HTMLとCSSでホームページを作成しています。 それで文とテーブルの間に意図しない空欄ができてしまいます。 この理由と対策を教えてください。 HTMLは↓ <div id="contents"> <div id="main"> <h2>会社概要</h2>       <table class="table">       <tr>       <th>社名</th>       <td></td>       </tr>       <tr>       <th>所在地</th>       <td></td>       </tr>       <tr>       <th>代表者</th>       <td></td>       </tr>       <tr>       <th>設立</th>       <td></td>       </tr>       <tr>       <th>資本金</th>       <td></td>       </tr>       <tr>       <th>従業員数</th>       <td></td>       </tr>       <tr>       <th>関連会社</th>       <td></td>       </tr>       </table> </div><!-- main end --> <div id="totop"> <p><a href="#top">ページのトップへ戻る</a></p> </div><!-- totop end --> </div><!-- contents end --> です。 この会社概要<h2>と<table>の間に十数行の空欄ができます。 CSSを取り除いてHTMLだけにしても、こう表示されます。 ご回答お願いします。

    • ベストアンサー
    • HTML
  • クリックするとテーブルの列の背景色が変わる/元に戻る

    このサイトを参考に以下のサンプルを作りました。 「あるセルをクリックすると、そのセルと依存関係のあるセルすべての背景色を変更する。」 この例でいくと、 1.セルA1,A2のどれをクリックしても、列Aすべての色が変わる。 2.セルB1,B2のいずれかをクリックすると、列Aは元の色に戻り、列Bすべての色が変わる という動きを実現したいです。 2.機能を実現するにはどのようにすればよいのか、どなたかご存知の方ご教授のほどよろしくお願いいたします。 現時点のサンプル <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>テーブルの列の背景色を変える</title> <SCRIPT language="JavaScript"> <!-- function bgcolor(idName){ for ( i=0 ; i < document.all.item(idName).length ; i++ ) { document.all.item(idName, i).style.backgroundColor = "#EE3300"; } } //--> </SCRIPT> </head> <body> <TABLE border="1"> <TR> <TD width="30">&nbsp;</TD> <TD width="30">列A</TD> <TD width="30">列B</TD> <TD width="30">列C</TD> </TR> </TABLE> <TABLE border="1"> <TR> <TD width="30">行1</TD> <TD width="30" id="td1" onclick="bgcolor('td1')">A1</TD> <TD width="30" id="td2" onclick="bgcolor('td2')">B1</TD> <TD width="30" id="td3" onclick="bgcolor('td3')">C1</TD> </TR> </TABLE> <TABLE border="1"> <TR> <TD width="30">行2</TD> <TD width="30" id="td1" onclick="bgcolor('td1')">A2</TD> <TD width="30" id="td2" onclick="bgcolor('td2')">B2</TD> <TD width="30" id="td3" onclick="bgcolor('td3')">C2</TD> </TR> </TABLE> </body> </html>

専門家に質問してみよう