table row merge plugin
merge table rows
by Seungrae Lee
HTML
<table>
<tr>
<td>
<table id="dataList" border="1" cellspacing="2" cellpadding="5" style="width:100%;">
<tr>
<td class="h1">対象年</td>
<td class="h1">期</td>
<td class="h1">月</td>
<td class="h1">対象月</td>
<td class="h1">表示対象</td>
</tr>
<tr>
<td>2013</td>
<td>下期</td>
<td>10</td>
<td></td>
<td>1</td>
</tr>
<tr>
<td>2013</td>
<td>下期</td>
<td>11</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>2013</td>
<td>下期</td>
<td>12</td>
<td></td>
<td>1</td>
</tr>
<tr>
<td>2013</td>
<td>下期</td>
<td>1</td>
<td></td>
<td>1</td>
</tr>
<tr>
<td>2013</td>
<td>下期</td>
<td>2</td>
<td></td>
<td>1</td>
</tr>
<tr>
<td>2013</td>
<td>下期</td>
<td>3</td>
<td></td>
<td>1</td>
</tr>
<tr>
<td>2014</td>
<td>上期</td>
<td>4</td>
<td colspan="2">
<table border="0" cellspacing="0" cellpadding="0" height="100%" width="100%" class="rowMerge-ignored">
<tr>
<td nowrap>
<table border="0" width="100%">
<tr>
<td align="left">(400文字以内)</td>
<td align="right">入力文字数 : <span id="labelEtcReason">0</span>
</td>
</tr>
</table>
<table height="100%" class="tbl3" width="100%">
<tr>
<td valign="top" height="100%" width="100%">
<textarea name="etcReason" style="width:366px; height:54px;" wrap="soft"></textarea>
</td>
...
JavaScript
/*!
* jQuery merge plugin
* version: 1.1.0-2018.08.07
* Released under the MIT license
*/
/****************************************************************
* usage:
* $(selector).rowMerge({
* rowIndex: 2,
* cellIndex: [1, 2]
* });
* options:
* @rowIndex: start row index(1based index)
* @cellIndex: td indexes to be merged(1based index)
*/
(function(factory) {
if (typeof define === "function" && define.amd) {
// AMD. Register as an anonymous module.
define(["jquery"], factory);
} else {
// Browser globals
factory(jQuery);
} //if~else
}(function($) {
var ignoredClass = ".rowMerge-ignored";
$.extend($.fn, {
rowMerge: function(options) {
return new $.rowMerge(options, this);
}
});
// constructor
$.rowMerge = function(options, target) {
// merge options
this.o = $.extend(true, {}, $.rowMerge.defaults, options);
this.target = target;
this.init();
};
// implementation
$.extend($.rowMerge, {
version: "1.1.1",
defaults: {
rowIndex: 1,
cellIndex: [1]
},
prototype: {
init: function() {
// cell length before merging
this.tdLen = this.length(this.target.find("tr:nth-child(" + this.o.rowIndex + ")"));
this.delArrays = [];
this._scan();
},
_scan: function() {
var self = this,
indexArray = self.o.cellIndex;
$.each(indexArray, function(i, o) {
self._cellMergeChk(o);
});
},
_cellMergeChk: function(cellIndex) {
var self = this,
$target = $(self.target),
options = self.o,
cnt = 1,
compareObj = $target.find("tr:nth-child(" + options.rowIndex + ") td:nth-child(" + cellIndex + ")");
// :gt(0-index)
$target.find("tr:gt(" + (options.rowIndex - 1) +...