js大数据量如何实现页面的局部渲染(不是局部刷新)--解决方法

之前我在http://zhidao.baidu.com/question/140423644.html提问,有人回答了,但是不是我想要的结果,我没有说清楚我的意思.就是一... 之前我在http://zhidao.baidu.com/question/140423644.html提问,有人回答了,但是不是我想要的结果,我没有说清楚我的意思.

就是一个页面要显示10000行数据,不考虑前面的性能问题,假如就要显示出来(而且在一页里面,不再分页了),我要慢慢的显示(不然全部显示必然崩溃...),如何做到??

现在我无意间看到这个jquery插件,应该就是我想要的.infinite-scroll..
具体情况你们继续百度吧.我也不太清楚.
展开
 我来答
datong88
2011-08-30 · TA获得超过806个赞
知道小有建树答主
回答量:300
采纳率:100%
帮助的人:357万
展开全部
把看到的区域当画布,创建足够能展现界面的Dom就够了。
比如一个屏幕的高度一般是800像素左右,假设一条记录占用的高度是20像素,我们只用创建40个对象即可。
接下来就是对这40个对象进行数据填充,通过滚动条调整填充数据的起始下标。
10W条记录,IE下有些卡
<style type="text/css">
.panel{
overflow:scroll;
width:200px;
height:80%;
}
.panel .scroll{
}
.item{
width:500px;
height:20px;
}
.odd{
background-color:#ccc;
}
.items{
overflow:hidden;
position:absolute;
}
.red{
color:red;
}
.green{
color:green;
}
</style>
<script>
window.console = window.console || { log: function() {} };

function absolutePoint(element) {
var result = [element.offsetLeft, element.offsetTop];
element = element.offsetParent;
while (element) {
result[0] += element.offsetLeft;
result[1] += element.offsetTop;
element = element.offsetParent;
}
return result;
}
function ListView(options){
options = options || {};

var self = this,
$C = function(tagName) { return document.createElement(tagName); }, // 创建节点
p,
height,
item_height, // 项高
view_count, // 可见项条数
parent = options.parent || document.body, // 容器
height, // 面板历史高度
div_panel = $C("div"),
div_scroll = $C("div"),
div_items = $C("div"),
div_items_list = [$C("div")],
freed = [div_panel, div_scroll, div_items]; // 可释放的对象

div_panel.className = "panel";
parent.appendChild(div_panel);

div_items.className = "items";
document.body.appendChild(div_items);

div_scroll.className = "scroll";
div_panel.appendChild(div_scroll);

div_panel.onscroll = function() {
doChange();
}
div_panel.onresize = function() {
doChange();
}

div_items_list[0].className = "item";
div_items.appendChild(div_items_list[0]);

div_scroll.style.width = div_items_list[0].clientWidth + "px";
item_height = div_items_list[0].clientHeight;

p = absolutePoint(div_panel);
with(div_items.style) {
left = p[0] + "px";
top = p[1] + "px";
width = div_panel.clientWidth;
height = div_panel.clientHeight;
}
/**
* 界面改变
*/
function doChange() {
if (!item_height) return;
var i, div;
if (height != div_panel.clientHeight) {
height = div_panel.clientHeight;
view_count = parseInt(height / item_height);
for (i = div_items_list.length; i < view_count; i++) {
div = $C("div");
div.className = "item" + (i % 2 == 0 ? "" : " odd");
div_items.appendChild(div);
div_items_list.push(div);
}
for (i = 0; i < div_items_list.length; i++) {
div_items_list[i].style.display = i < view_count ? "" : "none";
}
div_scroll.style.height = div_panel.clientHeight + options.count - view_count + "px";
console.log(["view_count", view_count]);
}
div_items.scrollLeft = div_panel.scrollLeft;
if (!options.ondrawitem) return;
i = Math.min(view_count, div_items_list.length);
while(i--) {
// 重新绘制
options.ondrawitem(i + div_panel.scrollTop, div_items_list[i]);
}
}

doChange();
this.doChange = doChange;
/**
* 释放Dom对象
*/
this.dispose = function() {
var i = freed.length;
while(i--) {
freed[i].parentNode.removeChild(freed[i]);
}
i = freed.length;
while(i--) {
div_items_list[i].parentNode.removeChild(div_items_list[i]);
}
}
}
function format(template, json) {
if (!json) return template;
return template && template.replace(/\$\{(.+?)\}/g, function() {
return json[arguments[1]];
})
}
window.onload = function() {
var i = 100000, data = new Array(i);
while(i--) {
data[i] = { index: i, random: Math.random(), key: (+new Date()).toString(36) };
}
var listview = new ListView({
count: data.length,
ondrawitem: function(i, div) {
div.innerHTML = format(" <em>${index} </em>  <span class=\"red\">${random} </span>  <span class=\"green\">${key} </span>", data[i]);
}
});
};
</script>
匿名用户
2011-08-29
展开全部
你可以采用类似图片延时加载的方法,采用js客户端分页(客户端是一次保存1w条数据),一次只加载100条数据,不过我觉的你这个一次显示1w数据,怎么会有这样的需求?,一次怎么也看不了那么多数据。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式