无响应的JavaScript通知
我有一种情况,我从FireFox 3.6+上的GWT网格中的服务器渲染项目。我有大约200个项目,我加载它们在循环:无响应的JavaScript通知
users = myService.getUsers();
for(User user : users){
myPanel.addUser(user); // Pseudocode. Actually i add some labels and text fields...
}
它tooks很长一段时间在这个循环改变DOM
,所以我得到了“无响应脚本”的通知。但我无法重构代码或分页,我需要一次加载1页上的所有200个项目。
有什么办法可以抑制这个通知吗?要通知浏览器我的脚本没有挂起,但要做一些有用的事情?
UPD Ok Ok,这里是我的代码更接近。这是一个来自大项目的代码,我们有很多自定义组件,所以我认为它没有实际价值。
myService.getUsersDetails(searchCriteria, new MyCallback<List<User>>)
{
@Override
protected void response(List<User> result)
{
gridExpanderPresenter.clear();
int i = 0;
for (User user: result)
{
UserDetailsView detailsView = detailsViewProvider.get();
gridExpanderPresenter.setPresenter(UsersPresenter.this);
gridExpanderPresenter.add(detailsView.asWidget()); //Here is DOM manipulation i mentioned
if (i++ % 2 == 1)
{
detailsView.setOdd(); //Setting style here
}
detailsView.setData(user);
}
}
});
而且我认为this可以帮我...
有几个选项:
一批使用
Scheduler.scheduleIncremental
您的更新;一次只能渲染10个用户(不用担心,Scheduler
会在产生之前尽可能多次运行您的代码,因此它实际上一次可以渲染50,100或150个用户,然后继续10ms(是,毫秒)后)切换到
CellTable
;这是一个重大的重构,但它会给你比什么都重要,你可以做基于部件更好的性能(Label
,TextBox
等)
是的,scheduleIncremental()按计划运行,谢谢! – madhead 2012-01-09 09:15:50
你应该安装myPanel
到DOM之前从DOM添加User
S,或者如果它已经连接,并需要更新,删除myPanel
,添加所有用户并重新连接myPanel
。
当连接myPanel时添加200个用户会发生什么情况,您的浏览器必须更新DOM 200次,这非常昂贵(重新计算和重新绘制屏幕)。
你肯定没有骑自行车吗?不要认为PC对200个javascript数组进行处理是个大麻烦......如果你仔细观察你的代码,原来的,而不是伪代码,那将是非常好的。 – devdRew 2012-01-06 14:39:09
该警告应被视为您的脚本需要修改的指示。你应该发布相关的代码,也许有人会看到改进的潜力。 – Pointy 2012-01-06 14:42:16