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

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

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

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

2回答

518閲覧

jQueryで要素の中身を二つに区切りたい

yukie1101

総合スコア11

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2023/03/14 03:44

実現したいこと

jQueryを使用して、表示した<section></section>を二つの<section></section>に分割したい

前提

DBから取得してきたデータを元に、グラフや表などを表示させるようなプログラムを作ったのですが、
印刷するときに中途半端なところで途切れてしまうのが嫌なので、途中で改ページを入れたいと思っています。

DBに格納されているデータを使って、一旦そのままのデータでHTMLを出力し、

<section></section>で区切って改ページのためのCSSを当てているのですが、 一部のデータでページをはみ出してしまうケースが発生したため、jQueryで<section></section>内部の要素の高さを読み込み、 一定値以上になったら</section><section>を挿入して強制的に改ページを入れようとしました。

しかし、実際に動作させてみると</section><section>ではなく<section></section>が入ってしまうだけで、うまく改ページができません。
指定したHTMLをそのまま挿入させ、一つの<section></section>を二つに区切るには、どうすれば良いのでしょうか。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

HTML(出力直後)

1<section class="print_page"> 2 <p class="print_header">ヘッダー</p> 3 <h1 class="content_block">見出し</h1> 4 <h2 class="content_block">小見出し</h2> 5 <div class="content_block"><canvas>chart.jsで出力したグラフ</canvas></div> 6 <table class="content_block">コメントの一覧1</table> 7 <table class="content_block">コメントの一覧2</table> 8 <table class="content_block">コメントの一覧3</table> 9 <table class="content_block">コメントの一覧4</table> 10 <table class="content_block">コメントの一覧5</table> 11 <p class="print_footer">フッター</p> 12</section>

javascript

1$(function() { 2 $('.print_page').each(function() { 3 var contents_height = 0; 4 $(this).children().each(function() { 5 var this_height = $(this).outerHeight(); 6 if (this_height + contents_height >= 900) { 7 $(this).after('<p class="print_footer">フッター</p></section><section class="print_page"><p class="print_header">ヘッダー</p>'); 8 contents_height = 0; 9 } else { 10 contents_height += this_height; 11 } 12 }); 13 }); 14});

HTML(期待する結果)

1<section class="print_page"> 2 <p class="print_header">ヘッダー</p> 3 <h1 class="content_block">見出し</h1> 4 <h2 class="content_block">小見出し</h2> 5 <div class="content_block"><canvas>chart.jsで出力したグラフ</canvas></div> 6 <table class="content_block">コメントの一覧1</table> 7 <table class="content_block">コメントの一覧2</table> 8 <table class="content_block">コメントの一覧3</table> 9 <p class="print_footer">フッター</p> 10</section> 11<section class="print_page"> 12 <p class="print_header">ヘッダー</p> 13 <table class="content_block">コメントの一覧4</table> 14 <table class="content_block">コメントの一覧5</table> 15 <p class="print_footer">フッター</p> 16</section>

HTML(実際の結果)

1<section class="print_page"> 2 <p class="print_header">ヘッダー</p> 3 <h1 class="content_block">見出し</h1> 4 <h2 class="content_block">小見出し</h2> 5 <div class="content_block"><canvas>chart.jsで出力したグラフ</canvas></div> 6 <table class="content_block">コメントの一覧1</table> 7 <table class="content_block">コメントの一覧2</table> 8 <table class="content_block">コメントの一覧3</table> 9 <p class="print_footer">フッター</p> 10 <section> 11 <p class="print_header">ヘッダー</p> 12 </section> 13 <table class="content_block">コメントの一覧4</table> 14 <table class="content_block">コメントの一覧5</table> 15 <p class="print_footer">フッター</p> 16</section>

試したこと

・HTMLを挿入する箇所をafter → appendにしてみる
→挿入される箇所が変わっただけで、期待した状態にはならない

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

・jQuery3.4.1

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

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

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

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

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

yambejp

2023/03/14 04:01 編集

両方のsectionにヘッダが存在して見出しが存在しないのはどう判断すればよいのでしょうか? なにをどう言う根拠で振り分けるかきちんと仕様を決めたほうがよいかと
guest

回答2

0

条件があいまいなので、とりあえず3個と2個にわけときます

javascript

1<script> 2window.addEventListener('DOMContentLoaded', ()=>{ 3 const s1=document.querySelector('.print_page'); 4 const s2=s1.cloneNode(); 5 document.querySelectorAll('table').forEach((x,y)=>x.setAttribute('data-index',y+1)); 6 s1.querySelectorAll('.print_page > *').forEach(x=>{ 7 if(x.matches('.print_header,.print_footer')){ 8 s2.appendChild(x.cloneNode(true)); 9 } 10 if(x.dataset.index>=4){ 11 s2.appendChild(x); 12 } 13 }); 14 s1.after(s2); 15}); 16</script> 17 18<section class="print_page"> 19<p class="print_header">ヘッダー</p> 20<h1 class="content_block">見出し</h1> 21<h2 class="content_block">小見出し</h2> 22<div class="content_block"><canvas>chart.jsで出力したグラフ</canvas></div> 23<table class="content_block"><tr><td>コメントの一覧1</td></tr></table> 24<table class="content_block"><tr><td>コメントの一覧2</td></tr></table> 25<table class="content_block"><tr><td>コメントの一覧3</td></tr></table> 26<table class="content_block"><tr><td>コメントの一覧4</td></tr></table> 27<table class="content_block"><tr><td>コメントの一覧5</td></tr></table> 28<p class="print_footer">フッター</p> 29</section>

投稿2023/03/14 04:23

yambejp

総合スコア114829

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

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

0

タグは開きタグから閉じタグまでで1セットで、jQueryの操作で「閉じタグ+開きタグ」のようなものを追加することはできません。

改ページが目的でしたら、<section>自体を区切るのではなく、<section>の内側に区切り用の要素を追加する、という方がやりやすいと考えます。

投稿2023/03/14 03:52

編集2023/03/14 03:53
maisumakun

総合スコア145183

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

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

yukie1101

2023/03/14 04:07

回答ありがとうございます! > タグは開きタグから閉じタグまでで1セットで、jQueryの操作で「閉じタグ+開きタグ」のようなものを追加することはできません。 この話が衝撃でした…outerHTMLとか色々試したんですが、うまくできなかったのはそういう理由だったのですね。 「閉じタグ+開きタグ」を挿入したかった一番の理由は、ヘッダーとフッターを各ページに挿入したい、両者ともCSSでposition:absolute;を設定している、という理由が大きかったのですが、おっしゃるような区切り用要素を追加した場合、このあたりがうまく動かない気がしています。 何か良い回避方法、もしご存じでしたら教えていただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問