1( 2 function ($) { 3 4 $.fn.tableHeadFixer = function (param) { 5 6 return this.each(function () { 7 table.call(this); 8 }); 9 10 function table() { 11 12 { 13 var defaults = { 14 head: true, 15 foot: false, 16 left: 0, 17 right: 0, 18 'z-index': 0, 19 }; 20 21 var settings = $.extend({}, defaults, param); 22 23 settings.table = this; 24 settings.parent = $(settings.table).parent(); 25 setParent(); 26 27 if (settings.head == true) { 28 fixHead(); 29 } 30 31 if (settings.foot == true) { 32 fixFoot(); 33 } 34 35 if (settings.left > 0) { 36 fixLeft(); 37 } 38 39 if (settings.right > 0) { 40 fixRight(); 41 } 42 43 setCorner(); 44 45 $(settings.parent).trigger('scroll'); 46 47 $(window).resize(function () { 48 $(settings.parent).trigger('scroll'); 49 }); 50 51 /* 52 This function solver z-index problem in corner cell where fix row and column at the same time, 53 set corner cells z-index 1 more then other fixed cells 54 */ 55 function setCorner() { 56 var table = $(settings.table); 57 58 if (settings.head) { 59 if (settings.left > 0) { 60 var tr = table.find('thead tr'); 61 62 tr.each(function (k, row) { 63 solverLeftColspan(row, function (cell) { 64 $(cell).css('z-index', settings['z-index'] + 1); 65 }); 66 }); 67 } 68 69 if (settings.right > 0) { 70 var tr = table.find('thead tr'); 71 72 tr.each(function (k, row) { 73 solveRightColspan(row, function (cell) { 74 $(cell).css('z-index', settings['z-index'] + 1); 75 }); 76 }); 77 } 78 } 79 80 if (settings.foot) { 81 if (settings.left > 0) { 82 var tr = table.find('tfoot tr'); 83 84 tr.each(function (k, row) { 85 solverLeftColspan(row, function (cell) { 86 $(cell).css('z-index', settings['z-index']); 87 }); 88 }); 89 } 90 91 if (settings.right > 0) { 92 var tr = table.find('tfoot tr'); 93 94 tr.each(function (k, row) { 95 solveRightColspan(row, function (cell) { 96 $(cell).css('z-index', settings['z-index']); 97 }); 98 }); 99 } 100 } 101 } 102 103 // Set style of table parent 104 function setParent() { 105 var parent = $(settings.parent); 106 var table = $(settings.table); 107 108 parent.append(table); 109 parent.css({ 110 'overflow-x': 'auto', 111 'overflow-y': 'auto', 112 }); 113 114 parent.scroll(function () { 115 var scrollWidth = parent[0].scrollWidth; 116 var clientWidth = parent[0].clientWidth; 117 var scrollHeight = parent[0].scrollHeight; 118 var clientHeight = parent[0].clientHeight; 119 var top = parent.scrollTop(); 120 var left = parent.scrollLeft(); 121 122 if (settings.head) { 123 this.find('thead tr > *').css('top', top); 124 } 125 126 if (settings.foot) { 127 this.find('tfoot tr > *').css('bottom', scrollHeight - clientHeight - top); 128 } 129 130 if (settings.left > 0) { 131 settings.leftColumns.css('left', left); 132 } 133 134 if (settings.right > 0) { 135 settings.rightColumns.css('right', 136 scrollWidth - clientWidth - left); 137 } 138 }.bind(table)); 139 } 140 141 // Set table head fixed 142 function fixHead() { 143 var thead = $(settings.table).find('thead'); 144 var tr = thead.find('tr'); 145 var cells = thead.find('tr > *'); 146
147 setBackground(cells); 148 cells.css({ 149 'position': 'relative', 150 }); 151 } 152 153 // Set table foot fixed 154 function fixFoot() { 155 var tfoot = $(settings.table).find('tfoot'); 156 var tr = tfoot.find('tr'); 157 var cells = tfoot.find('tr > *'); 158 159 setBackground(cells); 160 cells.css({ 161 'position': 'relative', 162 }); 163 } 164 165 // Set table left column fixed 166 function fixLeft() { 167 var table = $(settings.table); 168 169 // var fixColumn = settings.left; 170 171 settings.leftColumns = $(); 172 173 var tr = table.find('tr'); 174 tr.each(function (k, row) { 175 176 solverLeftColspan(row, function (cell) { 177 settings.leftColumns = settings.leftColumns.add(cell); 178 }); 179 // var inc = 1; 180 181 // for(var i = 1; i <= fixColumn; i = i + inc) { 182 // var nth = inc > 1 ? i - 1 : i; 183 184 // var cell = $(row).find("*:nth-child(" + nth + ")"); 185 // var colspan = cell.prop("colspan"); 186 187 // settings.leftColumns = settings.leftColumns.add(cell); 188 189 // inc = colspan; 190 // } 191 }); 192 193 var column = settings.leftColumns; 194 195 column.each(function (k, cell) { 196 var cell = $(cell); 197 198 setBackground(cell); 199 cell.css({ 200 'position': 'relative', 201 }); 202 }); 203 } 204 205 // Set table right column fixed 206 function fixRight() { 207 var table = $(settings.table); 208 209 var fixColumn = settings.right; 210 211 settings.rightColumns = $(); 212 213 var tr = table.find('tr'); 214 tr.each(function (k, row) { 215 solveRightColspan(row, function (cell) { 216 settings.rightColumns = settings.rightColumns.add(cell); 217 }); 218 }); 219 220 var column = settings.rightColumns; 221 222 column.each(function (k, cell) { 223 var cell = $(cell); 224 225 setBackground(cell); 226 cell.css({ 227 'position': 'relative', 228 }); 229 }); 230 231 } 232 233 // Set fixed cells backgrounds 234 function setBackground(elements) { 235 return false; 236 237 elements.each(function (k, element) { 238 var element = $(element); 239 var parent = $(element).parent(); 240 241 var elementBackground = element.css('background-color'); 242 elementBackground = ( 243 elementBackground == 'transparent' || elementBackground == 244 'rgba(0, 0, 0, 0)' 245 ) ? null : elementBackground; 246 247 var parentBackground = parent.css('background-color'); 248 parentBackground = ( 249 parentBackground == 'transparent' || parentBackground == 250 'rgba(0, 0, 0, 0)' 251 ) ? null : parentBackground; 252
253 var background = parentBackground ? parentBackground : 'white'; 254 background = elementBackground ? elementBackground : background; 255 256 element.css('background-color', background); 257 }); 258 } 259 260 function solverLeftColspan(row, action) { 261 var fixColumn = settings.left; 262 var inc = 1; 263 264 for (var i = 1; i <= fixColumn; i = i + inc) { 265 var nth = inc > 1 ? i - 1 : i; 266 267 var cell = $(row).find('> *:nth-child(' + nth + ')'); 268 var colspan = cell.prop('colspan'); 269 270 if (cell.cellPos().left < fixColumn) { 271 action(cell); 272 } 273 274 inc = colspan; 275 } 276 } 277 278 function solveRightColspan(row, action) { 279 var fixColumn = settings.right; 280 var inc = 1; 281 282 for (var i = 1; i <= fixColumn; i = i + inc) { 283 var nth = inc > 1 ? i - 1 : i; 284 285 var cell = $(row).find('> *:nth-last-child(' + nth + ')'); 286 var colspan = cell.prop('colspan'); 287 288 action(cell); 289 290 inc = colspan; 291 } 292 } 293 } 294 295 } 296 297 }; 298 299 } 300)(jQuery); 301 302/* cellPos jQuery plugin 303 --------------------- 304 Get visual position of cell in HTML table (or its block like thead). 305 Return value is object with "top" and "left" properties set to row and column index of top-left cell corner. 306 Example of use: 307 $("#myTable tbody td").each(function(){ 308 $(this).text( $(this).cellPos().top +", "+ $(this).cellPos().left ); 309 }); 310 */ 311( 312 function ($) { 313 /* scan individual table and set "cellPos" data in the form { left: x-coord, top: y-coord } */ 314 function scanTable($table) { 315 var m = []; 316 $table.children('tr').each(function (y, row) { 317 $(row).children('td, th').each(function (x, cell) { 318 var $cell = $(cell), 319 cspan = $cell.attr('colspan') | 0, 320 rspan = $cell.attr('rowspan') | 0, 321 tx, ty; 322 cspan = cspan ? cspan : 1; 323 rspan = rspan ? rspan : 1; 324 for (; m[y] && m[y][x]; ++x) { 325 326 } //skip already occupied cells in current row 327 for (tx = x; tx < x + cspan; ++tx) { //mark matrix elements occupied by current cell with true 328 for (ty = y; ty < y + rspan; ++ty) { 329 if (!m[ty]) { //fill missing rows 330 m[ty] = []; 331 } 332 m[ty][tx] = true; 333 } 334 } 335 var pos = {top: y, left: x}; 336 $cell.data('cellPos', pos); 337 }); 338 }); 339 } 340 341 /* plugin */ 342 $.fn.cellPos = function (rescan) { 343 var $cell = this.first(), 344 pos = $cell.data('cellPos'); 345 if (!pos || rescan) { 346 var $table = $cell.closest('table, thead, tbody, tfoot'); 347 scanTable($table); 348 } 349 pos = $cell.data('cellPos'); 350 return pos; 351 }; 352 } 353)(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.