[index]
[top]
[bottom]
[prev]
[next]

DOMでテーブルを操作する2。

セルを操作する。

HTMLTableCellElementオブジェクトには、親から継承したもの以外に、メソッドはありません。新たに定義されているのは、HTML4で定義されている属性値だけです。

 IDL 
interface HTMLTableCellElement : HTMLElement {
  readonly attribute long            cellIndex;
           attribute DOMString       abbr;
           attribute DOMString       align;
           attribute DOMString       axis;
           attribute DOMString       bgColor;
           attribute DOMString       ch;
           attribute DOMString       chOff;
           attribute long            colSpan;
           attribute DOMString       headers;
           attribute DOMString       height;
           attribute boolean         noWrap;
           attribute long            rowSpan;
           attribute DOMString       scope;
           attribute DOMString       vAlign;
           attribute DOMString       width;
};

次のスクリプトは、targetTableで指定されたテーブルの、targetRowIndexとtargetColIndexで指定されたセルを、rowSpan, colSpanのサイズに拡張します。拡張した結果はみ出してしまうセルは、削除します。

汎用性を持たせる為には、指定の拡張を行った結果、ターゲットのテーブルの、幅や高さをはみ出してしまう可能性や、関連するセルが、既に拡張されている場合も、考慮する必要があるが、これは結構大変かもしれない。

また、theadやtfoot・tbodyといった、行単位のグループを超えて、拡張することはできないので、このあたりも考慮しなければならない。もちろん不可能とは言わないけど・・・・。

 JavaScript 
function cellSpan(targetTable,
                  targetRowIndex,
                  targetColIndex,
                  rowSpan,
                  colSpan) {

    var targetRow = targetTable.rows.item(targetRowIndex);
    var targetCell = targetRow.cells.item(targetColIndex);

    var rowCount = targetTable.rows.length;
    var colCount = targetRow.cells.length;

    /**
     * 結合したセルのサイズが、テーブルをはみ出すような場合は、
     * 結合する幅や高さを調整する。
     */
    if ((targetRowIndex + rowSpan) > rowCount) {
        rowSpan = rowCount - targetRowIndex;
    }
    if ((targetColIndex + colSpan) > colCount) {
        colSpan = colCount - targetColIndex;
    }

    /**
     * 拡張するセルが存在する行から、不要となるcellを削除。
     * ここでは、rowSpan - 1個のセルを、削除する。
     */
    for (var i = 1; i < colSpan; i ++) {
        targetRow.deleteCell(targetColIndex + 1);
    }

    /*
     * 上記以外の行で、はみ出すセルの削除。
     * ここでは、colSpan個のセルを、削除する。
     */
    for (var i = 1; i < rowSpan; i ++) {
        var row = targetTable.rows.item(targetRowIndex + i);
        for (var j = 0; j < colSpan; j ++) {
            row.deleteCell(targetColIndex);
        }
    }

    targetCell.colSpan = colSpan;
    targetCell.rowSpan = rowSpan;
}

実験室、其の弐

セル結合の実験です。テキストフィールドに入力された内容により、下のテーブルのセルを結合します。

テキストフィールドに入力できるのは、数値だけです。「行目」には、0~9の範囲内で、入力してください。「列から」には、0~4の範囲内で、入力してください。入力チェックなどは行っていませんので、ご自身の責任において(笑)お願いします。

すでに結合したセルを、再度結合の対象とすると、表示が崩れます。場合によってはエラーとなります。また、少々バギーが部分もあり、正しく入力しても、思った通りにならない場合もあります。そのような時は、このページを再読込してください。

1行1列1行2列1行3列1行4列1行5列
2行1列2行2列2行3列2行4列2行5列
3行1列3行2列3行3列3行4列3行5列
4行1列4行2列4行3列4行4列4行5列
5行1列5行2列5行3列5行4列5行5列
6行1列6行2列6行3列6行4列6行5列
7行1列7行2列7行3列7行4列7行5列
8行1列8行2列8行3列8行4列8行5列
9行1列9行2列9行3列9行4列9行5列
10行1列10行2列10行3列10行4列10行5列

行目(1-10) 列(1-5)から 列を

スクロールをする。

Webアプリケーションで、大量のデータを画面上に表示するのは、非常に厄介な問題を引き起こす場合があります。次ページ・前ページというやつです。

該当するデータが確実にロックできる環境であれば、特に問題はありませんが(パフォーマンスの問題は残りますが)、表示する該当データが、他のクライアントから削除されたり追加されたり、ましてや表示順を左右する項目を変更される様な場合、「次ページには、どのデータを表示すれば良いんだ?!」ということになります。

データはどこかに一元管理するのが、間違いも発生しにくく、正しい考え方です。そのクライアントが表示したいデータは、全てクライアントが持っているのが良いでしょう、やっぱり。(とてつもない大量データの場合は、また別ですね。数万件のデータを、一度にクライアントに送るのが、正しい考え方とは、とても思えないですから)

次のスクリプトは、指定されたIDのテーブルをスクロールします。例によって、完全な汎用性は持っていません。表示行数や現在の表示位置などを固定で持っているので、複数のテーブルが同じドキュメントに存在する場合に、対応できません。本来であれば、このあたりの情報を、IDをキーとした連想配列などに格納する事が、必要です。

また、必ずtbodyエレメントが必要で、尚且つtbodyエレメントが複数あるテーブルの場合、その先頭のtbodyエレメントのみを対象とします。

多少の改造で「ページアップ」や「ページダウン」、「トップへ」や「ボトムへ」等にも、簡単に対応できると思います。

 JavaScript 
/** テーブルの表示行数 */
var dispRow = 4;
/** 現在の表示先頭行インデックス */
var currentTopIndex = 0;
/** 現在の表示最終行インデックス */
var currentBottomIndex = dispRow - 1;
/**
 * 初期化メソッド。
 * 必ずドキュメントロード時に、コールする必要がある。
 */
function init(targetId) {
    var tBodyRows = getTBodyRows(targetId);
    for (var i = dispRow; i < tBodyRows.length; i ++) {
        tBodyRows.item(i).style.display = 'none';
    }
}
function up(targetId) {
    var tBodyRows = getTBodyRows(targetId);
    if (currentBottomIndex == tBodyRows.length - 1) {
        return;
    }
    tBodyRows.item(currentTopIndex).style.display = 'none';
    currentTopIndex ++;
    currentBottomIndex ++;
    tBodyRows.item(currentBottomIndex).style.display = '';
}
function down(targetId) {
    var tBodyRows = getTBodyRows(targetId);
    if (currentTopIndex == 0) {
        return;
    }
    currentTopIndex --;
    tBodyRows.item(currentTopIndex).style.display = '';
    tBodyRows.item(currentBottomIndex).style.display = 'none';
    currentBottomIndex --;
}
function getTBodyRows(targetId) {
    var targetTbl = document.getElementById(targetId);
    var tBodies = targetTbl.tBodies;
    var tBody = tBodies.item(0);
    return tBody.rows;
}

実験室、其の参

青春の頃(ん十年前)聴いていた、懐かしのメロディリストです。こういうのは、作っていると、ついつい長くなっちゃうんですよね。ということで、テーブルのスクロールです。

下の「UP」「DOWN」をクリックすると、スクロールします。セルの中で改行しないような設定にしたほうが、良いかもしれません。

Webブラウザによっては、少々操作しづらかったり、罫線が残ってしまったりする場合があるようですが、そういうものとあきらめてください(^^;

UP  DOWN

アーティストアルバムお勧めの楽曲

TRIUMPH

ROCK 'N' ROLL MACHINE

1978

24 HOURS A DAY

TRIUMPH

ROCK 'N' ROLL MACHINE

1978

STREET FIGHTER

TRIUMPH

ROCK 'N' ROLL MACHINE

1978

STREET FIGHTER REPRISE

TRIUMPH

ROCK 'N' ROLL MACHINE

1978

BLINDING LIGHT SHOW/MOON CHILD

TRIUMPH

ROCK 'N' ROLL MACHINE

1978

BRINGING IT ON HOME

TRIUMPH

Just a Game

1979

LAY IT ON THE LINE

TRIUMPH

Just a Game

1979

YOUNG ENOUGH TO CRY

TRIUMPH

Just a Game

1979

JUST A GAME

TRIUMPH

Just a Game

1979

HOLD ON

TRIUMPH

Just a Game

1979

SUITCASE BLUES

SCORPIONS

VIRGIN KILLER

1977

幻の肖像

SCORPIONS

VIRGIN KILLER

1977

CATCH YOUR TRAIN

SCORPIONS

VIRGIN KILLER

1977

YELLOW RAVEN

RORY GALLAGHER

CALLING CARD

1976

COUNTRY MILE

RORY GALLAGHER

CALLING CARD

1976

MOONCHILD

RORY GALLAGHER

CALLING CARD

1976

EDGED IN BLUE

RIOT

怒りの廃墟

1977

Desperation

RIOT

怒りの廃墟

1977

幻の叫び

RIOT

怒りの廃墟

1977

Overdrive

Wishbone Ash

百眼の巨人アーガス

1972

時は昔

Wishbone Ash

百眼の巨人アーガス

1972

木の葉と小川

Wishbone Ash

百眼の巨人アーガス

1972

戦士

Deep Purple

IN ROCK

1970

Speed King

Deep Purple

IN ROCK

1970

Child In Time

Deep Purple

MACHINE HEAD

1972

Highway Star

Deep Purple

MACHINE HEAD

1972

Smoke On The Water

Deep Purple

MACHINE HEAD

1972

Lazy

Deep Purple

紫の炎

1974

紫の炎

Deep Purple

紫の炎

1974

MISTREATED

URIAH HEEP

対自核

1971

対自核

URIAH HEEP

対自核

1971

7月の朝

URIAH HEEP

対自核

1971

悲嘆のかげり

URIAH HEEP

悪魔と魔法使い

1972

魔法使い

URIAH HEEP

悪魔と魔法使い

1972

安息の日々

URIAH HEEP

悪魔と魔法使い

1972

連帯

URIAH HEEP

悪魔と魔法使い

1972

呪文

URIAH HEEP

InnocentVictim

1977

FREE N' EASY

URIAH HEEP

InnocentVictim

1977

THE DANCE

URIAH HEEP

InnocentVictim

1977

CHOICES

NAZARETH

人喰い犬

1975

人喰い犬

NAZARETH

人喰い犬

1975

Miss Misery

NAZARETH

人喰い犬

1975

Beggar's Day ~ Rose In Heather

NAZARETH

人喰い犬

1975

Please Don't Judas Me

THIN LIZZY

脱獄

1976

脱獄

THIN LIZZY

脱獄

1976

ヤツラは町へ

THIN LIZZY

脱獄

1976

エメラルド

THIN LIZZY

サギ師ジョニー

1976

甘い言葉に気をつけろ

THIN LIZZY

悪名

1977

悪名

THIN LIZZY

悪名

1977

Dancin'In The Moonlight

THIN LIZZY

BLack Rose

1979

ヤツらはデンジャラス!!

THIN LIZZY

BLack Rose

1979

アリバイ

Judas Priest

運命の翼

1975

THE RIPPER

Judas Priest

運命の翼

1975

DREAMER DECEIVER

Judas Priest

運命の翼

1975

EPITAPH

Judas Priest

運命の翼

1975

ISLAND OF DOMINATION

Judas Priest

背徳の門

1976

背徳の門

Judas Priest

STAINDE CLASS

1978

BETTER BY YOU BETTER THAN ME

Judas Priest

STAINDE CLASS

1978

INVADER

Judas Priest

STAINDE CLASS

1978

BEYOND THE REALMS OF DEATH