bootstrap.table.js 22.6 KB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946
/**
 * 显示一个表格控件 
 * 依赖于bootstrap的table 
 * 作者:黄平 
 * 日期:2016-04-13
 */
(function($) {
	$.fn.table = function(options, param) {
		var self = this;
		if (typeof (options) == "string") {
			var method = $.fn.table.methods[options];
			if (method){
				return method.call(this, param);
			}
		}
		return this.each(function() {
			var opt = $.extend({}, $.fn.table.defaults, $.fn.table.events, options);
			if (!opt.columns || opt.columns.length == 0) {
				return;
			}
			self.data("table", opt);
			
			_createtTable.call(self);
		});
	};
	/**
	 * 生成(适用于bootstrap)
	 */
	function _createtTable() {
		var jq = this;
		var opt = $(jq).data("table");
		//清空table
		jq.empty();
		jq.addClass("panel");
		//设置panel的样式
		if (opt.panelClass) {
			jq.addClass(opt.panelClass);
		}
		//设置panel标题
		if (opt.title) {
			$("<div>").html(opt.title).addClass("panel-heading").appendTo(jq);
		}
		//设置表格上方标签区域
		$("<div>").css({
			"margin-left": 20,
			"margin-top": 20
		}).attr({
			id: "frontLabel"
		}).appendTo(jq);
		if(opt.label) {
			$("#frontLabel").html(opt.label);
		}
		//设置表上方button
		if (opt.button) {
			$("<button>").addClass("btn btn-xs btn-success").html(opt.button).attr({
				id : "frontButton"
			}).css({
				"margin-right" : 30,
				"margin-top" : 10,
				"margin-bottom" : 10,
				float:"right"
			}).appendTo(jq);
		}
		var body, table, thead, headTR, th,fTh,secondTR;
		body = $("<div>").addClass("panel-body").appendTo(jq).attr("tableRole", "body");
		table = $("<table>").addClass("table").appendTo(body).attr("tableRole", "table");
		if (opt.columnAutoWidth !== true) {
			table.css({
				"table-layout" : "fixed",
				"word-wrap" : "break-word",
				"word-break" : "break-all",
				//"white-space" : "nowrap",
				"text-overflow" : "ellipsis"
			});
		}
		//设置边框
		if (opt.border === true) {
			table.addClass("table-bordered");
		}
		//设置悬停
		if (opt.hover === true) {
			table.addClass("table-hover");
		}
		//设置斑马纹
		if (opt.striped === true) {
			table.addClass("table-striped");
		}
		thead = $("<thead>").appendTo(table);
		headTR = $("<tr>").appendTo(thead);
		secondTR = $("<tr>").appendTo(thead);
		//若存在表头单元格合并的情况则另外处理
		if(opt.mergeHeads){
			_mergeHeadCell(opt,headTR,secondTR)
		}else{
            //设置table的头
			$(opt.columns).each(function(index, item) {
				th = $("<th>").css({
					"text-align" : item.align ? item.align : "left",
					width : item.width ? item.width : "auto"
				}).appendTo(headTR);

				if (item.checkbox === true) {
					$("<input type=\"checkbox\" id=\"bootstrap-table-checkAll\" />").click(function() {
						//点击全选
						if (opt.singleSelect === true) {
							this.checked = false;
							return;
						}
						_clickCheckAll(jq, this.checked);
					}).appendTo(th);
				} else {
					var headSpan = $("<span>").html(item.title);
					th.append(headSpan);
					if (item.sortable === true) {
						//可排序
						var sortSpan = $("<span>").addClass("datagrid-sort");
						th.append(sortSpan);
						th.css("cursor", "pointer");
						th.click(function() {
							//重新加载数据
							var param = {
								sortColumn : item.sortcolumn || item.field
							};
							//修改排序样式
							if (sortSpan.hasClass("datagrid-sort")) {
								param.sortType = "ASC";
							} else if (sortSpan.hasClass("datagrid-sort-asc")) {
								param.sortType = "DESC";
							}  else if (sortSpan.hasClass("datagrid-sort-desc")) {
								param.sortType = "ASC";
							}
							_loadRemote(jq, param, function() {
								if (param.sortType == "ASC") {
									sortSpan.addClass("datagrid-sort-asc");
								} else if (param.sortType == "DESC") {
									sortSpan.addClass("datagrid-sort-desc");
								}
							});

						});
					}
				}
			});
		}
		
		if (opt && opt.url) {
			_loadRemote(jq);
		} else {
			//显示正在加载
			_showLoading(jq);
			//生成tbody
			_createTbody(jq);
			
			//处理onLoadSuccess事件
			if (opt.onLoadSuccess) {
				opt.onLoadSuccess.call(jq, opt.data);
			}
			//分页
			_createPage(jq);
			
			//隐藏正在加载
			_hideLoading(jq);
			
			//设置已经加载完成
			jq.attr("loadStatus", "1");
		}
	}

	function _mergeHeadCell(opt,headTR,secondTR){
		var firstTh,secondTh;
        //1、先处理存在合并的单元格
		$(opt.columns).each(function(index, item) {
			if(item.rowspan || item.colspan){
				firstTh = $("<th>").css({
					"text-align" : "center",
					"text-valign" : "middle",
					width : item.width ? item.width : "auto"
				}).appendTo(headTR);
				//合并行
				if(item.rowspan){
					firstTh.attr("rowspan",item.rowspan);
					firstTh.css({
						"align":'center',
						"valign":'middle'
					});
				}
				//和并列
				if(item.colspan){
					firstTh.attr("colspan",item.colspan);
					firstTh.css({
						"data-align":'center',
						"data-valign":'middle'
					});
				}
				var headSpan = $("<span>").html(item.title);
				firstTh.append(headSpan);
			}

		});
		// 2、处理常规单元格
		$(opt.columns).each(function(index, item) {
			if(!item.rowspan && !item.colspan){
				secondTh = $("<th>").css({
					"text-align" : item.align ? item.align : "left",
					width : item.width ? item.width : "auto"
				}).appendTo(secondTR);
				if (item.checkbox === true) {
					$("<input type=\"checkbox\" id=\"bootstrap-table-checkAll\" />").click(function() {
						//点击全选
						if (opt.singleSelect === true) {
							this.checked = false;
							return;
						}
						_clickCheckAll(jq, this.checked);
					}).appendTo(secondTh);
				} else {
					var headSpan = $("<span>").html(item.title);
					secondTh.append(headSpan);
				}
			}
		});
	}
	
	/**
	 * 从远端加载数据
	 */
	function _loadRemote(jq, param, callback) {
		//显示正在加载
		_showLoading(jq);
		var opt = $(jq).data("table");
		
		//清空排序样式
		jq.find("thead th span.datagrid-sort-asc").removeClass("datagrid-sort-asc").addClass("datagrid-sort");
		jq.find("thead th span.datagrid-sort-desc").removeClass("datagrid-sort-desc").addClass("datagrid-sort");
		
		_removeTbody(jq);
		if (!opt || !opt.url) {
			//隐藏正在加载
			_hideLoading(jq);
			return;
		}
		if (opt.onBeforeLoad) {
			if (opt.onBeforeLoad.call(jq) === false) {
				//隐藏正在加载
				_hideLoading(jq);
				return;
			}
		}
		var lastQueryParam = $.extend({}, opt.queryParams, jq.data("lastQueryParam"), param);
		jq.data("lastQueryParam", lastQueryParam);
		//重新确认当前页码,若指定页码,则优先;不指定,则从页码控件中获取
		var currentPage;
		if(opt.currentPage){
			currentPage = opt.currentPage;
		}else{
			currentPage = param && param.currentPage ? param.currentPage : 0;
		}
		$.ajax($.extend({}, {
			url : opt.url,
			data : JSON.stringify($.extend({}, lastQueryParam, {
				pageSize : (opt.pagination === true ? opt.pageSize : 0),
                currentPage : (opt.pagination === true ? currentPage : 0)
			})),
			type : opt.type,
			dataType : opt.dataType,
			contentType : opt.contentType,
			success : function(json) {
				if (!json) {
					//隐藏正在加载
					_hideLoading(jq);
					return;
				}
				opt.data = json;
				if (opt.loadFilter) {
					opt.data = opt.loadFilter(json);
				}
				//生成tbody
				_createTbody(jq);
				
				//处理onLoadSuccess事件
				if (opt.onLoadSuccess) {
					opt.onLoadSuccess.call(jq, opt.data);
				}
				
				//分页
                _createPage(jq, (opt.pagination === true ? (currentPage) : 0));
				//隐藏正在加载
				_hideLoading(jq);
				
				//设置已经加载完成
				jq.attr("loadStatus", "1");
			},
			error : function() {
				//隐藏正在加载
				_hideLoading(jq);
			},
			complete : function() {
				//执行回调
				if (callback) {
					callback();
				}
			},
			dataType : "json"
		}));
	}


	/**
	 * 设置页码
	 */
	function _setCurrentPage(jq, param) {
		var opt = $(jq).data("table");
		if(param){
			opt.currentPage = param;
		}
	}

	/**
	/**
	 * 取去总条数和行记录
	 */
	function _getTotalAndData(jq) {
		var opt = jq.data("table");
		var d = opt.data;
		var total = 0;
		if ($.type(d) === "object") {
			total = d.total;
			d = d.rows;
		} else {
			total = d ? d.length : 0;
		}
		return {
			rows : d,
			total : total
		};
	}
	
	/**
	 * 显示正在加载的效果
	 */
	function _showLoading(jq) {
		var div = $("<div>");
		var tableOffset = jq.offset();
		var tableWidth = jq.outerWidth(true), tableHeight = jq.outerHeight(true);
		div.append($("<div>").addClass("table-loading").css({
			left : (tableWidth - 124) / 2,
			top : (tableHeight - 124) / 2
		}));
		div.css({
			width : tableWidth,
			height : tableHeight,
			left : tableOffset.left,
			top : tableOffset.top
		});
		div.show();
	}
	
	/**
	 * 隐藏正在加载效果
	 */
	function _hideLoading(jq) {
		$("body").find("div[tableSelector='"+ jq.selector +"']").remove();
	}
	
	/**
	 * 获取body部分
	 */
	function _getBody(jq) {
		return jq.find("div.panel-body[tableRole='body']");
	}
	
	/**
	 * 获取table
	 */
	function _getTable(jq) {
		return jq.find("table.table[tableRole='table']");
	}
	
	/**
	 * 获取tbody
	 */
	function _getTbody(jq) {
		return jq.find("table.table tbody");
	}
	
	/**
	 * 获取表头
	 */
	function _getThead(jq) {
		return jq.find("table.table thead");
	}
	
	/**
	 * 获取分页对象
	 */
	function _getPagination(jq) {
		return jq.find("div[role='pagination']");
	}
	
	/**
	 * 销毁表格tbody
	 */
	function _removeTbody(jq) {
		_getTbody(jq).remove();
	}
	
	/**
	 * 生成分页部分
	 */
    function _createPage(jq, currentPage) {
		var opt = jq.data("table");
		var totalAndRow = _getTotalAndData(jq);
		if (opt.pagination === true) {
			_getPagination(jq).remove();
			var pageDiv = $("<div>").appendTo(_getBody(jq));
			pageDiv.pagination({
				totalCount : totalAndRow.total,
                currentPage : currentPage ? currentPage : 1,
				pageSize : opt.pageSize,
				onSelectPage : function(currentPage, pageSize) {
					//显示正在加载
					_showLoading(jq);
					var lastQueryParam = jq.data("lastQueryParam");
					$.ajax($.extend({}, {
						url : opt.url,
						data : $.extend({}, lastQueryParam, {
							currentPage : currentPage,
							pageSize : pageSize
						}),
						type : opt.type,
						dataType : opt.dataType,
						success : function(json) {
							if (!json) {
								return;
							}
							opt.data = json;
							if (opt.loadFilter) {
								opt.data = opt.loadFilter(json);
							}
							_loadLoaclData(jq);
							
							//隐藏正在加载
							_hideLoading(jq);
						},
						error : function() {
							//隐藏正在加载
							_hideLoading(jq);
						},
						dataType : "json"
					}));
				}
			});
		}
	}
	
	/**
	 * 生成body部分
	 * @param table
	 * @param opt
	 */
	function _createTbody(jq) {
		var opt = jq.data("table");
		// 没有数据渲染,展示"无数据"
		if (!opt.data) {
			var _tbody = $("<tbody>").css({overflow: "auto"}).appendTo(_getTable(jq));
			$(_tbody).html('<tr><td colspan="' + opt.columns.length + '">无数据</td></tr>');
			return;
		}
		var totalAndRow = _getTotalAndData(jq);
		if (!totalAndRow.rows || totalAndRow.rows.length == 0) {
			return;
		}

		var tbody = $("<tbody>").css({
			overflow : "auto"
		}).appendTo(_getTable(jq));

		//若存在需要合并单元格的情况
		//整理出需要合并的单元格
		var obj=[];
		if(opt.mergeRowsField){
			var colField = opt.mergeRowsField;
			var rowContent;
			var rowMergeNum = 1;
			var tempIndex = 0;
			$(totalAndRow.rows).each(function(rowIndex, rowData) {
				var rowContentTemp = rowData[colField];
				if (rowContentTemp == rowContent) {
					rowMergeNum ++;
				}else{
					if(rowIndex != 0){
						obj.push({"index":tempIndex,"row":rowMergeNum});
					}
					rowContent = rowContentTemp;
					tempIndex = rowIndex;
					rowMergeNum = 1;
				}
				if(totalAndRow.rows.length - rowIndex == 1){
					obj.push({"index":tempIndex,"row":rowMergeNum});
				}
			});
		}

		//设置table的主体
		//若存在合并单元格,则被合并的单元格禁止显示
		var stopCellSum = 0;
		var stopCellCount = 1;
		$(totalAndRow.rows).each(function(rowIndex, rowData) {
			if (opt.formatterRow) {
				var formatterRowResult = opt.formatterRow(rowData, rowIndex);
				if (formatterRowResult) {
					tbody.append(formatterRowResult);
					return true;
				}
			}
			var bodyTR = $("<tr>").data("rowData", rowData).appendTo(tbody).css("cursor", "pointer");
			if (opt.idField) {
				bodyTR.attr("table_rowDataId", rowData[opt.idField]);
			}
			bodyTR.click(function() {
				var chk = bodyTR.find("input:checkbox[name='bootstrap-table-checkbox']");
				if (chk) {
					//chk.prop("checked", !chk.prop("checked"));
					//_clickChk.call(chk.get(0), jq, rowIndex, rowData);
					chk.trigger("click");
					//_clickChk.call(chk.get(0), jq, rowIndex, rowData);
				}
			});
			if (opt.onClickRow) {
				bodyTR.click(function() {
					opt.onClickRow.call(jq, rowIndex, rowData);
				});
			}
			//行样式
			if (opt.rowStyler) {
				var rowStyler = opt.rowStyler(rowData, rowIndex);
				if ($.type(rowStyler) === "object") {
					bodyTR.css(rowStyler);
				} else if ($.type(rowStyler) === "string") {
					bodyTR.addClass(rowStyler);
				}
			}
			$(opt.columns).each(function(columnIndex, columnData) {
				if (!columnData.colspan) {
					if (opt.mergeRowsField && opt.mergeRowsField == columnData.field && stopCellCount < stopCellSum) {
						//若存在需要合并单元格的情况 被合并的不需要展示
						stopCellCount++;
						return;
					}
					var bodyTD = $("<td>").css({
						"text-align": columnData.align ? columnData.align : "left"
					}).appendTo(bodyTR);
					//将需要合并的cell设置合并属性
					if(opt.mergeRowsField && opt.mergeRowsField == columnData.field){
						for (var item in obj) {
							if (obj[item].index == rowIndex) {
								bodyTD.attr("rowspan", obj[item].row);
								stopCellSum = obj[item].row;
								stopCellCount = 1;
								bodyTD.css({
									"text-align": 'center',
									"vertical-align": 'middle'
								})
							}
						}
					}

					//列样式
					if (columnData.styler) {
						var styler = columnData.styler(rowData[columnData.field], rowData, rowIndex);
						if ($.type(styler) === "object") {
							bodyTD.css(styler);
						} else if ($.type(styler) === "string") {
							bodyTD.addClass(styler);
						}
					}
					if (columnData.checkbox === true) {
						$("<input type=\"checkbox\" name=\"bootstrap-table-checkbox\" id=\"bootstrap-table-checkbox_"+ rowIndex +"\" />").click(function(event) {
							_clickChk.call(this, jq, rowIndex, rowData);

						}).appendTo(bodyTD);
					} else {
						if (columnData.formatter) {
							var formatter = columnData.formatter(rowData[columnData.field], rowData, rowIndex);
							if ($.type(formatter) === "object") {
								bodyTD.append(formatter);
							} else {
								bodyTD.html(formatter);
							}
						} else {
							bodyTD.html(rowData[columnData.field]);
						}
					}
				}
			});
		});
	}
	
	/**
	 * 获取选中的行数据
	 */
	function _clickChk(jq, rowIndex, rowData) {
		//阻止冒泡
		if (event) {
			event.stopPropagation();
		}

		//点击选择,当不是全部都选中时候,把上面的全选框去掉选中状态
		var opt = jq.data("table");
		var thead = _getThead(jq);
		if (!this.checked) {
			//当有一个没有选中时,去掉全选框
			thead.find("#bootstrap-table-checkAll").prop("checked", false);
			
			if (opt.onUnCheck) {
				opt.onUnCheck.call(jq, rowIndex, rowData);
			}
		} else {
			if (opt.singleSelect === true) {
				//当是只能单选时
				_clickCheckAll(jq, false);
				//this.checked = true;
				this.checked = true;
			} else {
				var chedkeds = _getTbody(jq).find("input:checked[name='bootstrap-table-checkbox']");
				var totalAndRow = _getTotalAndData(jq);
				thead.find("#bootstrap-table-checkAll").prop("checked", chedkeds.length == totalAndRow.rows.length);
			}
			
			if (opt.onCheck) {
				opt.onCheck.call(jq, rowIndex, rowData);
			}
		}
	}
	
	/**
	 * 获取选中的行数据
	 */
	function _getCheckedData(jq) {
		var arr = [];
		var checked = jq.find("input:checked[name='bootstrap-table-checkbox']");
		if (!checked || checked.length == 0) {
			return arr;
		}
		$(checked).each(function(index, item) {
			arr.push($(item).parent().parent().data("rowData"));
		});
		return arr;
	}
	
	/**
	 * 点击全选
	 */
	function _clickCheckAll(jq, checked) {
		var opt = jq.data("table");
		if (checked === true && opt.singleSelect === true) {
			//如果只能单选,那就不处理
			return;
		}
		var rows = _getRows(jq);
		for (var i = 0; i < rows.length; i++) {
			if (checked === true) {
				_checkRow(jq, i);
			} else {
				_unCheckRow(jq, i);
			}
		}
		
		var check = jq.find("input:checkbox[name='bootstrap-table-checkbox']");
		check.prop("checked", checked);
	}
	
	/**
	 * 加载本地数据
	 */
	function _loadLoaclData(jq) {
		var opt = jq.data("table");
		_removeTbody(jq);
		//opt.data = data;
		_createTbody(jq);
		
		//处理onLoadSuccess事件
		if (opt.onLoadSuccess) {
			opt.onLoadSuccess.call(jq, opt.data);
		}
	}
	
	/**
	 * 选中一行
	 */
	function _checkRow(jq, index) {
		var row = $(_getRow(jq, index));
		var chk = row.find("input:checkbox[name='bootstrap-table-checkbox']");
		chk.prop("checked", true);
		_clickChk.call(chk.get(0), jq, index, row.data("rowData"));
	}
	
	/**
	 * 反选中一行
	 */
	function _unCheckRow(jq, index) {
		var row = $(_getRow(jq, index));
		var chk = row.find("input:checkbox[name='bootstrap-table-checkbox']");
		chk.prop("checked", false);
		_clickChk.call(chk.get(0), jq, index, row.data("rowData"));
	}
	
	/**
	 * 获取表格中的每一行对象
	 */
	function _getRows(jq) {
		return jq.find("table tbody tr");
	}
	
	/**
	 * 获取表格中的一行对象
	 */
	function _getRow(jq, index) {
		return _getRows(jq)[index];
	}
	
	/**
	 * 获取表格中的每一行数据
	 */
	function _getData(jq) {
		var rows = _getRows(jq);
		if (rows) {
			var data = [];
			for (var i = 0; i < rows.length; i++) {
				data.push($(rows[i]).data("rowData"));
			}
			return data;
		}
		return [];
	}
	
	function _reload(jq, param) {
		var page = _getPagination(jq).data("pagination");
		_loadRemote(jq, $.extend({}, param, {
			currentPage : page.currentPage
		}));
	}
	
	/**
	 * 获取表格中的一行数据
	 */
	function _getRowData(jq, index) {
		return _getRow(jq, index).data("rowData");
	}
	
	$.fn.table.methods = {
		/**
		 * 获取选中的行数据
		 */
		getChecked : function() {
			return _getCheckedData(this);
		},
		/**
		 * 加载本地数据
		 * @param data
		 */
		loadLoaclData : function(data) {
			var jq = this;
			return jq.each(function() {
				_loadLoaclData(jq);
			});
		},
		/**
		 * 从远程再去请求数据
		 * @param param
		 */
		load : function(param) {
			var jq = this;
			_loadRemote(jq, param);
		},
		/**
		 * 从远端请求数据(并且留在当前页)
		 */
		reload : function(param) {
			var jq = this;
			return this.each(function() {
				_reload(jq, param);
			});
		},
		/**
		 * 获取表格中的每一行数据
		 */
		getRows : function() {
			return _getRows(this);
		},
		/**
		 * 获取表格中的一行对象
		 * @param index
		 */
		getRow : function(index) {
			return _getRow(this, index);
		},
		/**
		 * 获取表格中的每一行数据data
		 */
		getData : function() {
			return _getData(this);
		},
		/**
		 * 获取表格中的一行数据
		 * @param index
		 */
		getRowData : function(index) {
			return _getRowData(this, index);
		},
		/**
		 * 选中一行
		 * @param param
		 */
		checkRow : function(index) {
			var jq = this;
			return jq.each(function() {
				_checkRow(jq, index);
			});
		},
		/**
		 * 反选中一行
		 * @param param
		 */
		unCheckRow : function(index) {
			var jq = this;
			return jq.each(function() {
				_unCheckRow(jq, index);
			});
		},

		/**
		* 设置页码
		* @param param
		*/
		setCurrentPage : function(param) {
			var jq = this;
			_setCurrentPage(jq, param);
		}
	};
	$.fn.table.events = {
		/**
		 * 加载完成执行
		 * @param data
		 */
		onLoadSuccess : function(data) {},
		
		/**
		 * 加载之前执行,如果返回false,则不去远端调用
		 * 
		 */
		onBeforeLoad : function() {},
		
		/**
		 * 当选中复选框时
		 * @param rowIndex
		 * @param rowData
		 */
		onCheck : function(rowIndex, rowData) {},
		/**
		 * 当去掉选中复选框时
		 * @param rowIndex
		 * @param rowData
		 */
		onUnCheck : function(rowIndex, rowData) {},
		/**
		 * 当点击一行时
		 * @param rowIndex
		 * @param rowData
		 */
		onClickRow : function(rowIndex, rowData) {}
		
	};
	$.fn.table.defaults = $.extend({}, $.fn.table.events, {
		columnAutoWidth : false,//列是否自动宽度
		url : "",				//远端调用的url
		queryParams : {},		//调用url传递的参数
		type : "POST",			//提交方式
		dataType : "json",		//返回的类型
		pagination : false,		//是否分页
		pageSize : 10,			//分页时,每页条数
		data : null,			//如果不用url,则可以直接传入data
		striped : false,		//是否显示条纹
		panelClass : "panel-default",	//标题面板 的样式 (primary,success,info,warning,danger)
		title : "",						//表格标题
		label : "",                     //表格上方标签区域
		button : "",                     //表格上方按钮
		hover : true,					//是否悬停显示
		border : true,					//是否显示边框
		columns : [],					//表格列字段
		idField : null,					//表示id值的字段
		singleSelect : false,			//是否单选
		loadFilter : function(data) {	//对返回值进行特殊处理
			return data;
		},
		/**
		 * 对行进行格式化
		 */
		formatterRow : function(rowData, rowIndex) {
			
		},
		
		/**
		 * 对行样式进行处理
		 * 如果返回值是对象,则应用在css属性里面
		 * 如果返回值是string,则应用在class里面
		 * @param rowData
		 * @param rowIndex
		 */
		rowStyler : function(rowData, rowIndex) {
			return null;
		},
		/**
		 * 表格中是否存在表头单元格合并的情况
		 */
		mergeHeads : false,
		/**
		 * 需要合并单元格的列名 合并行
		 */
		mergeRowsField : "",

		/**
		 * 当前页码
		 */
		currentPage : ""
	});
	/**
	 * 其中,columns是一数组,每个数组包含字段
	 * width=null				列宽
	 * title=""					列标题
	 * field=""					列属性
	 * align="left"				对齐
	 * sortable=false			是否可以排序
	 * sortcolumn=[field]		排序字段名称(默认为该字段的field)
	 * checkbox=false,			是否显示复选框
	 * formatter : function(value, rowData, rowIndex) {	//对列进行格式化
			如果返回值是jquery对象,则直接把该对象放在该列
			如果是返回值是string,则直接放在html()里面
	   }
	 * styler : function(value, rowData, rowIndex) {		//对列的样式进行格式化
			如果返回值是对象,则应用在css属性里面
			如果返回值是string,则应用在class里面
	   },
	 */

})(jQuery);