JavaScriptでテーブルの各行(tr)の行数を知りたいです。
https://gist.github.com/STAR-ZERO/1948013
このやり方で一応求めることは出来たのですがやはりfor文で回すということもあり、データ件数が増えるとパフォーマンスが悪くなってしまいます。
何かほかにやり方はないでしょうか
よろしくお願いします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
maisumakunさん回答にあるような手法が現実的なのだろうと思いますが、純粋にアルゴリズムの問題として捉えると、文字数Nに対して計算量をO(N)からO(log N)のオーダー近くに落とすことはできると思いました。考え方としては古くからあるもので順サーチではなくバイナリーサーチにするというだけのものです。
ただ、テキスト長が充分短い場合や一行あたりの文字数が非常に少ない場合は効率はだんだん落ちてゆき、元のアルゴリズムの方が却って早いということもあると思います。
javascript
1function getRowCount(elm) { 2 var textR = elm.text(); 3 if (textR.length < 2) 4 return 1; 5 6 var textL = textR.substring(0, 1), 7 hL = heightOf(textL), 8 hR = heightOf(textR); 9 rows = 1 + extRowsOf(hL, textL, hR, textR); 10 11 elm.text(textR); 12 return rows; 13 14 function heightOf(text) { 15 elm.text(text); 16 return elm.height(); 17 } 18 19 function extRowsOf(hL, textL, hR, textR) { 20 if (hL === hR) 21 return 0; 22 var lenL = textL.length, 23 lenR = textR.length; 24 if (lenL + 1 === lenR) 25 return 1; 26 var textM = textR.substring(0, Math.floor((lenL + lenR) / 2)), 27 hM = heightOf(textM); 28 return extRowsOf(hL, textL, hM, textM) + extRowsOf(hM, textM, hR, textR); 29 } 30} 31 32$('#btn').click(function() { 33 alert(getRowCount($('#hoge'))); 34});
投稿2017/11/15 07:54
編集2017/11/15 09:50総合スコア18394
0
蛇足ですが、こんなので矩形領域のサイズを取得して、
element.getBoundingClientRect - Web API インターフェイス | MDN
element.getClientRects - Web API インターフェイス | MDN
1行当たりのheightで割って算出、なんて技も紹介だけしておきます。
投稿2017/11/15 09:56
総合スコア5572
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
getComputedStyle
からlineHeight
を取得すれば「1行の高さ」がわかりますので、全体の高さを1行の高さで割れば行数になると思います(もちろん、マージン、パディング、行内に文字以外が入っていたなどでずれることはあるとは思いますが)。
投稿2017/11/15 04:45
総合スコア145184
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
求めている動作と違うかもしれませんが、table内に含まれるtr要素の数が知りたいだけならdocument.querySelectorAll("table tr").length
で求められます。
投稿2017/11/15 07:24
総合スコア4524
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。