所以我正在尝试使用flexigrid插件。除了看起来你必须手动设置列宽之外,看起来它的效果会很好。否则,列标题与正文列不匹配。
是否有任何方法可以自动匹配这些内容,同时仍然允许列宽度由列中内容的长度定义(正常的表行为)。
答案 0 :(得分:9)
我也有这个问题。这是我的解决方案,效果很好。在第678行附近的flexigrid.js中,更改此行。
$(tdDiv).css({textAlign:pth.align,width: $('div:first',pth)[0].style.width});
到这个
$(tdDiv).css({textAlign:pth.align,width: $('div:first',pth).width() + "px"});
你们已经定下来了。
答案 1 :(得分:9)
我的解决方案比其他人建议的要简单得多。
在调用flexigrid函数之前,请添加:
$("#yourtable th").each(function() {
$(this).attr("width", $(this).width());
});
这会将列标题的宽度设置为与其中的文本一样宽(与使用css或标记手动设置每个标题宽度相反),并使表格主体列的宽度相同。
答案 2 :(得分:4)
我已经让这个工作(至少部分)。我在上一次迭代中遇到的问题(这也是tvanfosson实现的一个问题)是,一旦你调整了标题大小,那么“拖动”栏就不会与新的列宽对齐。
我目前的实现如下,适用于Firefox 3.5和Chrome。不幸的是,在IE(所有版本)中抛出了一些异常令人不安的例外。我将在星期一进一步调试:
$(".flexigrid").each(function() {
var grid = $(this);
var headers = grid.find(".hDiv thead th");
var row = grid.find(".bDiv tbody tr:first");
var drags = grid.find("div.cDrag div");
if (row.length >= 1) {
var cells = row.find("td");
var offsetAccumulator = 0;
headers.each(function(i) {
var headerWidth = $(this).width();
var bodyWidth = cells.eq(i).width();
var realWidth = bodyWidth > headerWidth ? bodyWidth : headerWidth;
$(this).width(realWidth);
cells.eq(i).width(realWidth);
var drag = drags.eq(i);
var dragPos = drag.position();
var offset = (realWidth - headerWidth);
var newPos = dragPos.left + offset + offsetAccumulator;
offsetAccumulator += offset;
drag.css("left", newPos);
});
}
});
答案 3 :(得分:3)
我今天也在研究这个问题。我提出的内容包括添加一个onSuccess处理程序,并确定每个列在标题和正文之间的最大大小,然后将两者的宽度设置为该列的最大值。
grid.flexigrid({
...other setup...
onSuccess: function() {
format();
});
}
});
function format() {
var gridContainer = this.Grid.closest('.flexigrid');
var headers = gridContainer.find('div.hDiv table tr:first th:not(:hidden)');
var drags = gridContainer.find('div.cDrag div');
var offset = 0;
var firstDataRow = this.Grid.find('tr:first td:not(:hidden)');
var columnWidths = new Array( firstDataRow.length );
this.Grid.find( 'tr' ).each( function() {
$(this).find('td:not(:hidden)').each( function(i) {
var colWidth = $(this).outerWidth();
if (!columnWidths[i] || columnWidths[i] < colWidth) {
columnWidths[i] = colWidth;
}
});
});
for (var i = 0; i < columnWidths.length; ++i) {
var bodyWidth = columnWidths[i];
var header = headers.eq(i);
var headerWidth = header.outerWidth();
var realWidth = bodyWidth > headerWidth ? bodyWidth : headerWidth;
firstDataRow.eq(i).css('width',realWidth);
header.css('width',realWidth);
drags.eq(i).css('left', offset + realWidth );
offset += realWidth;
}
}
答案 4 :(得分:1)
感谢。根据第678行的帖子,我的解决方案如下:
$(tdDiv).css({textAlign:pth.align,width: $('div:first',pth).width()-10 + "px"});
由于某种原因,标题字体大于详细字体...希望这会有所帮助。
答案 5 :(得分:1)
根据你自己的回答,我添加了min-width设置,以便在flexigrid宽度设置得太窄或者flexigrid调整大小时,不会以不同的方式挤压列,仅在chrome中进行测试:
$(this).width(realWidth);
cells.eq(i).width(realWidth);
// these two lines added
$(this).css('min-width', realWidth);
cells.eq(i).css('min-width',realWidth);
只是执行此中断列调整大小,因为它修改了th和td内div的宽度,但可以通过“dragEnd”函数中的flexigrid中的一些额外行修复:
. . .
// LINE 211
$('th:visible div:eq(' + n + ')', this.hDiv).css('width', nw);
// ADD THIS AFTER LINE 211
$('th:visible div:eq(' + n + ')', this.hDiv).parent().css('min-width', nw);
$('th:visible div:eq(' + n + ')', this.hDiv).parent().css('width', nw);
. . .
// LINE 214
$('td:visible div:eq(' + n + ')', this).css('width', nw);
// ADD THIS AFTER LINE 214
$('td:visible div:eq(' + n + ')', this).parent().css('width', nw);
$('td:visible div:eq(' + n + ')', this).parent().css('min-width', nw);
答案 6 :(得分:1)
对我来说类似的问题。有一个包含3个选项卡的页面,每个选项卡都有一个flexigrid。只有一个选项卡出现问题,其中标题单元格比它下面的数据单元格更短。这也使得那个之后的所有标题单元的排列都没有。
..我通过使用Chrome的CTRL + SHIFT + J功能检查渲染元素并检查<div class="hDiv"
元素内部... ...最终找到<th abbr="MyColumnName"
字段... ... width: <nnn>px
部分甚至不存在!
回去检查我在哪里定义colModel并注意到只有那一列......而不是width: <MyWidthValueHere>,
我无意中输入了Width: <MyWidthValueHere>,
(首字母大写与全部小写)。这是一个微妙的差异,当我最初仔细检查并比较/对比那些有问题的标签时,我的眼睛没有抓住它。
答案 7 :(得分:0)
我遇到了同样的事情,发现我的包含列标题和表格单元格的div的宽度都有宽度= 0.所以我不得不等待一段时间直到整个html表格构建完毕,然后我不得不运行“格式”方法。
接下来的事情是我在开始时将HTML表构建在一个不可见的div中。所以我不得不在代码中省略not(:hidden)
选择器。
我们走了:
$.fn.flexAddData = function(data) { // function to add data to grid
...
};
// my own method to justify the column headers with the body
$.fn.flexFormat = function() {
return this.each(function() {
var gridContainer = $('.flexigrid');
var headers = gridContainer.find('.hDiv table tr:first th');
var firstDataRow = gridContainer.find('.bDiv table tr:first td');
var offSet = 10;
// for each element in headers
// compare width with firstDataRow elemts
// the greater one sets the width of the lower one
$.each(headers, function(i) {
var thWidth = $(this).find('div').outerWidth();
var tdWidth = $(firstDataRow[i]).find('div').outerWidth();
thWidth > tdWidth ? $(firstDataRow[i]).find('div').width(thWidth - offSet) : $(this).find('div').width(tdWidth - offSet);
});
});
}; // end format
方法的调用如下:
setTimeout(function() {
$('.flexigrid').flexFormat();
}
, 10
);
希望有另一个问题的解决方案;-) 此致,Christoph
答案 8 :(得分:0)
在其他地方找到了这个:
想出来 - 对于有类似问题的人:我已经分配了它 到
<div id="mygrid">
时,我将其分配到<table id="mygrid">
一切都很棒!
答案 9 :(得分:0)
我知道这对某些人来说会很奇怪,但我遇到了同样的问题,一旦我重新安排了我的布局(整个页面,而不是网格本身),一切都很好。
我有一个3柱流体布局。我将网格移动到页面的最顶部,紧跟身体标签后,它排成一行!哇......
答案 10 :(得分:0)
这个对我有用:
onSuccess : function(){
$('#flex1 > tbody').wrap('<table cellpadding="0" cellspacing="0" />');
},
将其添加到flexgrid构造选项中。 flex1是你的flexgrid div id。
摩西。
答案 11 :(得分:0)
此代码在我的项目中正常工作。它与其他答案类似。
$("#my_table").flexigrid({
...
onSuccess: function(){
columnWidth();
$(window).resize(function(){
columnWidth();
});
}
});
function columnWidth(){
var num_col = 0;
//Work with the columns width of the first row of body
$("#row1 td").each(function(td){
//row's column's width greater than header's column's width
if($(this).width() > $("th[axis='col"+num_col+"']").width()){
$("th[axis='col"+num_col+"']").width($(this).width());
$("th[axis='col"+num_col+"']").css({"min-width":$(this).width()});
}
//header's column's width greater than row's column's width
else if($("th[axis='col"+num_col+"']").width() > $(this).width()){
$("td[abbr='"+$(this).prop('abbr')+"']").width($("th[axis='col"+num_col+"']").width());
$("td[abbr='"+$(this).prop('abbr')+"']").css({"min-width":$("th[axis='col"+num_col+"']").width()});
}
++num_col;
});
}
我希望这已经解决了你的问题。