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

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

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

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

Q&A

解決済

5回答

2232閲覧

HTMLテーブルの列単位でページネーションをしたい

Otazoman

総合スコア44

JavaScript

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

0グッド

0クリップ

投稿2019/01/30 02:49

前提・実現したいこと

テーブルを列単位でページネーションしたいと考えているのですが方法ありますでしょうか。調べてみて行単位ではページネーションする方法は多々あるのですが、列単位でページネーションする方法やライブラリというものがどうしても見つかりません。列単位でページネーションするのは無理なのでしょうか。

イメージとしては以下の様な感じです。

1ページ目
||1個目|2個目|3個目|
|:--|:--:|--:|
|社名|A社|B社|C社|
|点数|100点|95点|100点|

2ページ目
||4個目|5個目|6個目|
|:--|:--:|--:|
|社名|D社|E社|F社|
|点数|100点|100点|95点|

3ページ目

7個目8個目
社名G社H社
点数100点100点

HTML

1<table id="compresult" border="1"> 2<thead> 3<tr> 4<td></td> 5<th>1個目</th> 6<th>2個目</th> 7<th>3個目</th> 8<th>4個目</th> 9<th>5個目</th> 10<th>6個目</th> 11<th>7個目</th> 12<th>8個目</th> 13</thead> 14<tbody> 15<tr> 16<td>社名</td> 17<td>A社</td> 18<td>B社</td> 19<td>C社</td> 20<td>D社</td> 21<td>E社</td> 22<td>F社</td> 23<td>G社</td> 24<td>H社</td> 25</tr> 26<td>点数</td> 27<td>100点</td> 28<td>95点</td> 29<td>100点</td> 30<td>100点</td> 31<td>100点</td> 32<td>95点</td> 33<td>100点</td> 34<td>100点</td> 35</tr> 36</tbody> 37</table>

該当のソースコード

テーブル自体は以下の様にJavaScriptで出力しています。

JavaScript

1var rs = '<table id="compresult" border="1">'; 2rs +='<thead><tr><td></td>' 3for(var j=0;j<recCount;j++){ 4 rs +='<th>' 5 + Number(j+1) +"個目" 6 +'</th>'; 7} 8rs +='</tr></thead><tbody>' 9 10rs +='<tr><td>社名</td>' 11for(var i=0;i<recCount;i++){ 12 rs +='<td>' + result.company_name[i] +'</td>'; 13} 14rs +='</tr>'; 15rs +='<tr><td>点数</td>' 16for(var i=0;i<recCount;i++){ 17 rs +='<td>' + result.item_name[i] +'</td>'; 18} 19rs +='</tr>'; 20rs +='</tbody></table>'; 21document.getElementById('resultDisparea').innerHTML = rs;

補足情報(FW/ツールのバージョンなど)

できればライブラリ等読込まずに素のJavaScriptで実現したいのですが
可能でしょうか。つたない説明ですいませんがよろしくお願いいたします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

for(var i=0;i<recCount;i++)i recCountページによって動かせばページングになりますね。

投稿2019/01/30 03:15

kei344

総合スコア69407

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

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

Otazoman

2019/01/30 03:35

すいません、説明が不足していました。reCountで取り込んでいるデータについてはAPIでデータを抽出してきて、それを一旦、変数に保持しています。1ページごとにデータを抜いてこれないのと通信は1回ですまさないといけないという制約があるので、それを踏まえてどうすればいいかをご教示いただけるとありがたいです。
kei344

2019/01/30 03:38 編集

同じことです。 1ページに2件表示するなら2ページ目は i=2;i<4 になるようにすれば良いだけですね。
Otazoman

2019/01/30 08:07

ありがとうございます。開始位置と終了位置を動かしてページネーションするというイメージですね。考え方は理解できたのでそれを元に何とか頑張ってみます。ありがとうございました。
guest

0

miyabi-sun様の回答を拝見して、質問への違和感が解消できたので、コメント的に(コメント欄に書いてスレッドを汚染した経験があるのでこちらに)

多分↓こういうデータ構造をしているべきなんじゃないのでしょうか。これなら、行をページネーションで欲しい結果が得られますよね。
従ってデータ構造から見直してください。

社名点数
A100
B200

別回答で指摘されている、列をページネーションしたらデータの意味がなくなる、は、こういう姿をしているデータを基準に語られているはずで、そもそも行列が転置している質問者様の状況では、「「A社は100点」という情報は対であるべきです。」がうまく響いてない気がします

投稿2019/01/30 03:54

papinianus

総合スコア12705

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

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

0

列単位でページネーションする方法やライブラリというものがどうしても見つかりません。

自然の流れに逆らってるわけなので当然でしょう。
https://kotobank.jp/word/%E3%83%AC%E3%82%B3%E3%83%BC%E3%83%89-9931

データベースを構成する基本単位のひとつで、複数のフィールドが集まって構成される1件分のデータのこと。行、データレコード、論理レコードとも呼ばれる。レコードの集まりがブロックで、ブロックの集まりがファイルである。

「A社は100点」という情報は対であるべきです。
この1セットになっている情報がレコードという概念なので、同じ行で示されるべきです。
点数というくくりでまとめ上げて、100,95,100...としたら、「この行が何を説明したのか意味不明」となるわけです。

これが自然の流れで世のデータベースやExcelの表はこれをベースに設計されたソフトウェアです。
単なる横と縦の2次元テーブルなだけじゃないんです。


列単位でページネーションするのは無理なのでしょうか。

上で説明しましたがライブラリを作る意味はないので、
探してもライブラリは見つかりはしないでしょう。

質問文のコードを関数で包んで実行し直すだけでしょ?
なんで作れないのかさっぱり理解できません。

多分ここで質問を繰り返しているだけだと無駄なので、
JavaScriptの書籍や初心者用サイト等で勉強し直して下さい。
1週間あれば作れるようになるはずです。


できればライブラリ等読込まずに素のJavaScriptで実現したいのですが可能でしょうか。

可能か不可能かで言えば当然可能ですが……

あぁ、rsという変数名で思い出しましたがteratailで他人に作ってもらったものでしたっけ?
プログラマというのはプログラミングをする人を指します。

自分で何も作らずjQueryライブラリを探してるだけの人間や、
他人に作ってもらうばかりの人はプログラマとは呼びませんよ。
自称するなら頑張って実装してください。

投稿2019/01/30 03:39

miyabi-sun

総合スコア21158

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

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

0

皆様ありがとうございました。
61件で16ページの時はきちんと動作して5件で2ページの時は少しおかしな動きをするので調査中ではありますが、ひとまず以下で何とか実現したいページネーションは何とか動きそうです。

JavaScript

1~略~ 2var cd = document.getElementById('pagenation') 3var pnum = 3; 4if(recCount > pnum ){ 5 var nl = Math.ceil(recCount/pnum); 6 var plink=''; 7 if(nl > 1){ 8 for(var i=0;i<nl;i++){ 9 plink +='<a href="#" onclick="displayMaker('+pnum+','+Number(i+1)+','+ recCount + ',' +recnum +');">'+ Number(i+1) + '</a>'+ " " 10 } 11 } 12 rcount = rcount + " " + plink ; 13} 14cd.innerHTML = rcount; 15document.getElementById('resultDisplayArea').innerHTML = rs; 16 17//4列目以降は一旦非表示 18for(var i = pnum; i<recCount;i++){ 19 document.getElementById('headerCol'+Number(i)).style.display = "none"; 20 for(var j=0;j<recnum;j++){ 21 document.getElementById('bodyCol'+Number(i)+"-"+Number(j)).style.display = "none"; 22 } 23} 24 25//ページネーション動作 26function displayMaker(bnum,current,maxCnt,reccnt){ 27 var l = bnum*current; 28 var f = Number(l)-bnum; 29  //一旦すべて非表示 30 for(var i=0;i<maxCnt;i++){ 31 document.getElementById('headerCol'+Number(i)).style.display = "none"; 32 for(var j=0;j<reccnt;j++){ 33 document.getElementById('bodyCol'+Number(j)+"-"+Number(i)).style.display = "none"; 34 } 35 } 36 //必要箇所のみ表示 37 for(var i=f;i<l;i++){ 38 document.getElementById('headerCol'+Number(i)).style.display = ""; 39 for(var j=0;j<reccnt;j++){ 40 document.getElementById('bodyCol'+Number(i)+"-"+Number(j)).style.display = ""; 41 } 42 } 43} 44

投稿2019/01/30 08:16

Otazoman

総合スコア44

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

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

0

jQueryをつかってこんな感じで

javascript

1<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> 2<script> 3$(function(){ 4 var viewperpage=3; 5 var currentpage=0; 6 var results=[ 7 {"company_name":"A社","item_name":"100点"}, 8 {"company_name":"B社","item_name":"95点"}, 9 {"company_name":"C社","item_name":"100点"}, 10 {"company_name":"D社","item_name":"100点"}, 11 {"company_name":"E社","item_name":"100点"}, 12 {"company_name":"F社","item_name":"95点"}, 13 {"company_name":"G社","item_name":"100点"}, 14 {"company_name":"H社","item_name":"100点"}, 15 ]; 16 var lastpage=parseInt((results.length-1)/viewperpage); 17 $('#current').val(currentpage+1).on('change',function(){ 18 currentpage=(parseInt($('#current').val())||1)-1; 19 if(currentpage<0) currentpage=0; 20 if(currentpage>lastpage) currentpage=lastpage; 21 $('#current').val(currentpage+1); 22 var offset=currentpage<lastpage?0:(viewperpage*(lastpage+1)-results.length); 23 var tr=[ 24 $('<tr>').append($('<th></th>')), 25 $('<tr>').append($('<td>社名</td>')), 26 $('<tr>').append($('<td>点数</td>')), 27 ]; 28 Array(viewperpage-offset).fill(null).forEach(function(x,y){ 29 tr[0].append($('<th>'+(y+1+currentpage*viewperpage)+'回目</th>')); 30 tr[1].append($('<td>'+results[y+currentpage*viewperpage].company_name+'</td>')); 31 tr[2].append($('<td>'+results[y+currentpage*viewperpage].item_name+'</td>')); 32 }); 33 $('#compresult').find('thead').empty().append(tr[0]); 34 $('#compresult').find('tbody').empty().append(tr[1],tr[2]); 35 }).trigger('change'); 36 $('#prev').on('click',function(){ 37 if(currentpage>0) $('#current').val(currentpage).trigger('change'); 38 }); 39 $('#next').on('click',function(){ 40 if(currentpage<lastpage) $('#current').val(currentpage+2).trigger('change'); 41 }); 42 43}); 44</script> 45<input type="button" value="&lt;" id="prev"> 46<input type="text" id="current" size="1"> 47<input type="button" value="&gt;" id="next"> 48<table id="compresult" border="1"> 49<thead></thead> 50<tbody></tbody> 51</table>

投稿2019/01/30 05:01

編集2019/01/30 05:18
yambejp

総合スコア114843

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問