如何避免JQuery UI手风琴里面的长表从滚动到开始添加新行时开始?
问题描述:
我有一个JQuery UI手风琴中的许多行的表。如何避免JQuery UI手风琴里面的长表从滚动到开始添加新行时开始?
我动态追加表是这样的:
var resJson = JSON.parse(connector.process(JSON.stringify(reqJson)));
for (var i in resJson.entryArrayM) {
// test if entry has already been displayed
if ($("#resultTr_" + resJson.entryArrayM[i].id) == null)
continue;
$("#resultTable > tbody:last").append(listEntry.buildEntryRow(resJson.entryArrayM[i]));
}
首先我检查,如果同一TR ID的行已存在。如果没有,我会追加到表格的最后一行。
它的工作原理。但问题是:每次追加行时,手风琴都会滚动到表格的第一行。由于表格非常长,因此用户不便一次又一次向下滚动查看新添加的行。那么如何避免这种情况呢?
答
首先,只是做一个append
而不是通过附加循环每次:
var resJson = JSON.parse(connector.process(JSON.stringify(reqJson)));
var seen = { };
var rows = [ ];
var trId = null;
for(var i in resJson.entryArrayM) {
// test if entry has already been displayed
var trId = 'resultTr_' + resJson.entryArrayM[i].id;
if($('#' + trId).length != 0
|| seen[trId])
continue;
rows.push(listEntry.buildEntryRow(resJson.entryArrayM[i]));
seen[trId] = true;
}
$("#resultTable > tbody:last").append(rows.join(''));
另外请注意,我纠正你的存在的测试,$(x)
返回一个空的对象时x
不匹配任何东西,不是null
。这不仅效率更高,而且您只需要处理一个滚动位置更改。
解决您的滚动的问题是相当简单:找出元素滚动,存储其scrollTop
你追加之前,并追加后重置其scrollTop
:
var $el = $('#whatever-is-scrolling');
var scrollTop = $el[0].scrollTop;
$("#resultTable > tbody:last").append(rows.join('')); // As above.
$el[0].scrollTop = scrollTop;
可能有轻微的可见闪烁,但希望这将在改变桌子的噪音中消失。您也可以尝试设置table-layout
CSS property of the <table>
to fixed
。这将防止表格试图调整其宽度或列宽,这可能会阻止您看到的滚动行为。缺点是你必须处理你自己的专栏。但是,您可以在您的append
操作之前立即尝试设置table-layout:fixed
以最大限度地减少麻烦。
啊哈,太好了。我在做这个工作。非常感谢! – Song 2011-05-28 23:30:29