• ベストアンサー

テーブルをソートするには

テーブルをソートしたいのですが,下のリンクのスクリプトでは,<tr> に指定した onClick などの属性が失われてしまいます。属性を失わずにソートするにはどうすればいいのでしょうか。 http://okwave.jp/kotaeru.php3?qid=1818924 よろしくお願いします

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

  • ベストアンサー
  • NTJ
  • ベストアンサー率44% (46/103)
回答No.4

んっと。仮に <table border=1 id="tb1"> としておきます。 var wk1=document.getElementById('tb1').innerHTML; で、TABLEエレメントの中身が全部取り出せます。 そしたら、 var wk2=w1.split('<TR'); とかで配列に分解して、 var wk3=wk2.slice(2,wk2.length-2); とかで作業用のデータを作成して、 wk3.sort(funcSt); でソートを掛けて var wk4=wk2.slice(0,1).concat(wk3,wk2.slice(length-1); で連結し直して document.getElementById('tb1').innerHTML=wk4.join('<TR'); でソート完了です。 ブラウザ自身の持っているソート機能を使うので、 恐らく「自力でソートを作る」よりはマシではないかと思います。 wk3~wk4のヤヤコシイ部分は、配列の先頭と末尾をソートしない工夫です。 あと、ソートキー関数が必要になります。 function funcSt(a,b){ var wkA=各行内容を分解し、比較目的の位置を取り出す処理(a); var wkB=各行内容を分解し、比較目的の位置を取り出す処理(b); return (wkA > wkB); } 概ねコレで行けるんじゃないかな、と。 (配列の一番最初と一番最後へ入る部分をソートしない工夫が必要かもしれません。 ただ、作る前に以下のような関数を作って内容をチェックしてみてください。 alert(document.getElementById('tb1').innerHTML); JavaScriptで処理する内容は、「作成者が作ったソースの中身」ではなく、 「ソースをブラウザが解釈した結果」になります。 そのため、IEの場合ですとエレメント名は、大文字で書いても小文字で書いても全て大文字になっています。 あとはご都合で色々と処理を変更してください。 あと、innerHTML ではなく、childNodes で的確に取り出す手もあるかもしれません。 このあたり、Document Object Modelを使い込むと、大抵はなんとかなっちゃいます。(^^)

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>onCkick などはその時に JavaScript で属性を追加しています。 だったら、そんなに難しくはないと思いますよ。 例えば、 http://okwave.jp/kotaeru.php3?qid=1189614 でのsteel_gray さんの回答のようにTRにonclick イベントを振り直すとかは、簡単にできると思います。(特殊事情で難しいというのであれば、見当違いなコメントかもしれませんが) あと、元のソートのプログラムでは、列を丸ごと挿入したり削除したりして入れ替えていますけど、セルの中身をそれぞれ交換するようにすれば、エレメントの属性自体はそのままでいけると思います。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>自動生成のテーブル データバインドしているとかそういうことですか? onClick なんかは、どうやって設定しているんですか?

KanjiTalk
質問者

補足

データバインディングではなく,VBScript でディレクトリの内容を取得し,JavaScript に回しています。onCkick などはその時に JavaScript で属性を追加しています。 繰り返し処理が多いので,振り直すというのは難しいです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

ソートが終わった後で、属性を振り直してやればどうでしょう

KanjiTalk
質問者

補足

自動生成のテーブルなので属性はなかなか振り直せないのですが・・・。

関連するQ&A

  • テーブルソート

    お世話になります 今テーブルソートをしているのですがIE,Operaではうまくいったのですがfirefoxでは nodeArray[i].childNodes[k].firstChild has no properties と警告が出てソーティングがうまくできません どのようにすればいいでしょうか? p.s. 下記のテーブルはCGIで動的に書いたソースをコピーして擬似表示したものです 状況:偶数のonclickが作動せず奇数のonclickがずれてテーブルソートしています   onclick(3)でHPのソート、onclick(5)でMPのソートという感じです・・・   参考にしたサイトや静的に表示したテーブルでは正常に機能することもあります <script language="javascript"><!-- var x=new Array(); var nodeArray=new Array(); var n; function sortTable(k) { if(!document.getElementById) return; n = document.getElementById("ranksort").rows.length; for(i=0;i<n;i++){ nodeArray[i]=document.getElementById("t["+i+"]"); } for(i=0;i<n;i++){ xval=nodeArray[i].childNodes[k].firstChild.nodeValue; x[i]=parseFloat(xval); } sort(); show(); } function sort(){ complete=false; while(!complete){ complete=true; for(i=0;i<n-1;i++){ if(x[i]<x[i+1]){ buf=x[i];x[i]=x[i+1];x[i+1]=buf; buf=nodeArray[i];nodeArray[i]=nodeArray[i+1];nodeArray[i+1]=buf; complete=false; } } } } function show(){ tbody=document.getElementById('ranksort') for(i=0;i<n;i++){ tbody.removeChild(nodeArray[i]); } for(i=0;i<n;i++){ tbody.appendChild(nodeArray[i]); } } //--> </script> <div id='ability box'> <small>タイトルをクリックするとランキングソートされます</small> <table lang="ja" border="1" style='font-size:14px;'> <thead> <tr> <th>名前</th> <th onclick='sortTable(1);'>H P</th> <th onclick='sortTable(2);'>M P</th> <th onclick='sortTable(3);'>力</th> <th onclick='sortTable(4);'>知能</th> <th onclick='sortTable(5);'>信仰心</th> <th onclick='sortTable(6);'>生命力</th> <th onclick='sortTable(7);'>素早さ</th> <th onclick='sortTable(8);'>運</th> <th onclick='sortTable(9);'>人気</th> <th onclick='sortTable(10);'>賞金額</th> </tr> </thead> <tbody id="ranksort"> <tr id="t[0]"> <td>452</td> <td>32</td> <td>15</td> <td>13</td> <td>5</td> <td>5</td> <td>6</td> <td>5</td> <td>10</td> <td>0</td> <td>10000000</td> </tr> <tr id="t[1]"> <td>コス</td> <td>26</td> <td>14</td> <td>6</td> <td>6</td> <td>13</td> <td>11</td> <td>10</td> <td>13</td> <td>0</td> <td>0</td> </tr> <tr id="t[2]"> <td>コスモス</td> <td>30</td> <td>11</td> <td>13</td> <td>13</td> <td>12</td> <td>6</td> <td>6</td> <td>5</td> <td>0</td> <td>0</td> </tr> </tbody></table> </div>

  • tableソート

    新着順になっているテーブルをjqueryで名前ごとにまとめることはできますか? スレ   名前   日時 ああ    ここ   2014/1/31 いい    たた   2014/1/20 ああ    ここ   2014/1/10 ああ    ここ   2014/1/01 こんな感じにしたいです ああ    ここ   2014/1/31 └     ここ   2014/1/10 └     ここ   2014/1/01 いい    たた   2014/1/20 html <table width="100%"> <tr> <th>スレ</th> <th>なまえ</th> <th>新着日時</th> </tr> <tbody> <tr><td>ああ</td><td>test1</td><td>2014/01/31</td></tr> <tr><td>いい</td><td>test2</td><td>2014/01/20</td></tr> <tr><td>ああ</td><td>test3</td><td>2014/01/10</td></tr> <tr><td>ああ</td><td>test4</td><td>2014/01/01</td></tr> </tbody> </table> クリックでのソートはいりません。表示したときにソートするのみで結構です よろしくお願いします

  • 「java script」データソートページ送りが可能なテーブル

    「java script」データソートページ送りが可能なテーブル java scriptはまったくの初心者です。 インターネット上にあったソースを使ったのですが、わからないことがあったので質問します。 データを、ソートで見ることができるようにしたいので、下記のコードを使いました。 [問題は] 1つのhtmlに一つの表を使う分にはちゃんと動くのですが、 2つ以上表使おうとすると、一番上の表のソート機能は動くのですが、 2つ目の表からはソート機能が使えなくなってしまいます。 どうしたら2つ目の表もソート機能が使えるようにするのはどうしたらよいですか? [使用ソース]   <table> <tr> <th>・・・</th> <th>・・・</th> </tr> <tr> <td>・・・</td> <td>・・・</td> </tr> <tr> <td>・・・</td> <td>・・・</td> </tr> </table>       <div id="controls"> <div id="perpage"> <select onchange="sorter.size(this.value)"> <option value="5">5</option> <option value="10" selected="selected">10</option> <option value="20">20</option> <option value="50">50</option> <option value="100">100</option> </select> <span>表示ページ数を選択できます。</span> </div> <div id="navigation"> <img src="images/first.gif" width="16" height="16" alt="First Page" onclick="sorter.move(-1,true)" /> <img src="images/previous.gif" width="16" height="16" alt="First Page" onclick="sorter.move(-1)" /> <img src="images/next.gif" width="16" height="16" alt="First Page" onclick="sorter.move(1)" /> <img src="images/last.gif" width="16" height="16" alt="Last Page" onclick="sorter.move(1,true)" /> </div> <div id="text">残りのページ数 <span id="currentpage"></span> of <span id="pagelimit"></span></div> </div> <script type="text/javascript" src="script.js"></script> <script type="text/javascript"> var sorter = new TINY.table.sorter("sorter"); sorter.head = "head"; sorter.asc = "asc"; sorter.desc = "desc"; sorter.even = "evenrow"; sorter.odd = "oddrow"; sorter.evensel = "evenselected"; sorter.oddsel = "oddselected"; sorter.paginate = true; sorter.currentid = "currentpage"; sorter.limitid = "pagelimit"; sorter.init("table",1); </script> 以上よろしくお願いいたします。

  • テーブルについて

    テーブルについて 下のように直接入力した、例えば半角小文字を入力すると、横いっぱいに広がり改行せず、画面よりはみ出してしまいます。 この場合横サイドのwidithの属性もききません。 widithの指定範囲で改行して表示する方法は無いのでしょうか? お教えください。 <table> <tr> <td>33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 </td> </tr> </table>

  • テーブルをクイックソートするには?

    未経験者として、今年入社したばかりの超初心者です。 javascriptを始めて、3ヶ月です。 「テーブルをクイックソートする」課題が出たのですが、アルゴリズムデータ構造が分かっておらずとても困っています。 スクリプトは以下です。 どうか、アドバイスをお願いします!! <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <title>ソート</title> <script language ="JavaScript"> <!-- var x=new Array(); var nodeArray=new Array(); var n; function TableSort() { var tbd1 = document.getElementById("tbd1"); //ドキュメントにある特定のIdを持つオブジェクトを示す //HTMLタグのID属性で指定したもの var tre = tbd1.getElementsByTagName("tr") ; // タグを取得する n = tre.length ; // 行の数 for(i=0;i<n;i++) { if (document.getElementById("tr"+i)) { // alert(document.getElementById("tr"+i)); nodeArray[i]=document.getElementById("tr"+i); } } } function show() { tbody=document.getElementById('tbd1'); for(i=0;i<n;i++) { tbody.removeChild(nodeArray[i]); //子供のノードオブジェクトを削除 } for(i=0;i<n;i++) { tbody.appendChild(nodeArray[i]); //子供のノードオブジェクトを追加 } } function stringSort(0) { start = x[0]; end = x[n-1]; for(i=0;i<n;i++) { xval=nodeArray[i].childNodes[k].firstChild.nodeValue; //ソート対象となるデータをxの配列に設定している x[i]=xval; } quickSort(x,start,end); show(); } function quickSort(x,start,end){ // var data = Math.floor((x[start]+x[end])/2); //基準値(平均を適用)小数点以下切捨て var i = start; var j = end; var e; e = x[start]; while(true){ while(x[i] < e) i++; //基準値より大きい値を先頭から探す while(x[j] > e) j--; //基準値より小さい値を末尾から探す if( i >= j ) break; //両者が交錯していたら抜ける var n =x[i]; //交錯していなければ値を交換 x[i] =x[j]; x[j] =n; i++; // 交換した一つ後に添え字を進める j--; // 交換した一つ前に添え字を進める } if(start < i-1) quickSort(x,start,i-1); // 基準値より小さいグループの再起処理 if(j+1 < end) quickSort(x,j+1 ,end); // 基準値より大きいグループの再起処理 } //--> </script> </head> <body onload="TableSort();stringSort(0)" bgcolor="pink"> <!--<img src="img/59.gif">--> <tr><th><big><strong>数字をソートしよう!!</strong></big></th></tr> <br> <br><p>        ↓click here!!</p> <table border=1 id="tb1" width=200 bgcolor="white"> <thead > <tr> <th><button onclick="stringSort(0)">push!!</button></th> </tr> </thead> <tbody> <tr><td align=center>48</td></tr> <tr><td align=center>24</td></tr> <tr><td align=center>36</td></tr> <tr><td align=center>18</td></tr> <tr><td align=center>52</td></tr> </tbody> </table> </body> </html>

  • 検索のソートについて

    以前phpのカテゴリ内で以下のようなQ&Aをみつけましたが、まったく同じ状況で使用する言語がperlの場合どのようにすればいいのでしょうか?どなたか教えて下さい。 "PHP+MySQLを勉強中です。 例えば、商品テーブルに商品ID、商品名、価格、在庫数の4つのフィールドがあって、その表の各名称をクリックするとソート(例:オークションなどで現在価格をクリックするとソートなど[select * from 商品 order by 価格 asc])できるスクリプトをどのように作成すればよいか教えて下さい。" "shohin.phpで商品一覧を表示するとして、フィールド各名称のリンクを <a href="shohin.php?sort=1">商品ID</a><a href="shohin.php?sort=2">商品名</a>・・・ のようにします。" あとはswitch文を使ってget値(sort=の値)別にクエリーを変えるだけです。

    • ベストアンサー
    • Perl
  • テーブルの存在確認とソート順

    Perl/DBIとSQLiteを勉強しています。 二つお聞きしたい事があります。 一つめ DBに接続してテーブルが既に存在するかどうかを簡単に知る方法はないでしょうか。 DBが初期化されていなければまずテーブルの作成からするようなスクリプトを書こうと思っています。 二つめ プレースホルダを使ってソート順を自由に指定する方法はあるのでしょうか。 ORDER BY ? とやったらエラーが出てしまいました。 御存知の方、宜しくお願いします。

  • テーブルを使用してレイアウトしている場合の表示順序

    テーブルを使用してレイアウトしている場合、例えばテーブルAにはメニュー(PHPスクリプト無し)、テーブルBとテーブルCにはPHPスクリプトを使用した場合 <html> <head> <title>例</title> </head> <body> <table border="0"> <tr> <td>テーブルA</td>//メニュー(入れ子) <td>テーブルB</td>//テーブルB内にPHPスクリプト使用(入れ子) <td>テーブルC</td>//テーブルC内にPHPスクリプト使用(入れ子) </tr> </table> </body> </html> テーブルAとテーブルBとテーブルCが同時に表示されるのではなく、最初にテーブルAを表示したあと、その後、テーブルB,テーブルCを処理後、テーブルB,テーブルCを表示という順序にしたいのですが、CSSでテーブルAに、table-layout:fixed;を使用した(横幅も指定)のですがうまくいきません。もしこの方法でOKでしたら指定の仕方が間違っているのでしょうか?よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 動的なtableの値を取得したい

    いつもお世話になります。 見よう見まねでやっている超初心者です。 下記の様なテーブル(phpで読み込んでいますので実際は動的です。) の回答ボタンをクリックすると テーブル下の<INPUT type="text" name="kotae">に ボタンをクリックされた行のb列の値を入れたいと思っています。 function kaito()をどのように書いたら取得できるか悩んでいます。 初心者なもので具体的な回答でしたら助かります。 ご教授の程どうぞよろしくお願い致します。 <html> <head> <meta content="text/html; charset=utf-8" /> <script> </script> </head> <body> <table width="100" border="1"> <tr> <th width="30" scope="col">a</th> <th width="30" scope="col">b</th> <th width="40" scope="col">c</th> </tr> <tr> <td>1</td> <td>2</td> <td><input type="button" value="回答" onclick="kaito()"/></td> </tr> <tr> <td>5</td><td>3</td> <td><input type="button" value="回答" onclick="kaito()"/></td> </tr> <tr> <td>5</td> <td>4</td> <td><input type="button" value="回答" onclick="kaito()"/></td> </tr> <tr> <td>5</td> <td>5</td> <td><input type="button" value="回答" onclick="kaito()"/></td> </tr> </table> <INPUT type="text" name="kotae" size="12" > </body> </html>

  • テーブル行追加時にJavaScriptのイベントをセットするには?

    JavaScriptを使ってテーブルに行を追加しています。 その時、TRタグの中にJavaScriptのイベントハンドラ(onClickやonMouseOverなど)をセットしたいのですが、方法がわかりません。 TRタグのalignやheightのような属性は、setAttributeを利用して設定できているのですが・・・。 よろしくお願いします。

専門家に質問してみよう