2012-01-06 62 views
1

我有一种情况,我从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可以帮我...

+0

你肯定没有骑自行车吗?不要认为PC对200个javascript数组进行处理是个大麻烦......如果你仔细观察你的代码,原来的,而不是伪代码,那将是非常好的。 – devdRew 2012-01-06 14:39:09

+0

该警告应被视为您的脚本需要修改的指示。你应该发布相关的代码,也许有人会看到改进的潜力。 – Pointy 2012-01-06 14:42:16

回答

4

有几个选项:

  • 一批使用Scheduler.scheduleIncremental您的更新;一次只能渲染10个用户(不用担心,Scheduler会在产生之前尽可能多次运行您的代码,因此它实际上一次可以渲染50,100或150个用户,然后继续10ms(是,毫秒)后)

  • 切换到CellTable;这是一个重大的重构,但它会给你比什么都重要,你可以做基于部件更好的性能(LabelTextBox等)

+0

是的,scheduleIncremental()按计划运行,谢谢! – madhead 2012-01-09 09:15:50

6

你应该安装myPanel到DOM之前从DOM添加User S,或者如果它已经连接,并需要更新,删除myPanel,添加所有用户并重新连接myPanel

当连接myPanel时添加200个用户会发生什么情况,您的浏览器必须更新DOM 200次,这非常昂贵(重新计算和重新绘制屏幕)。

+2

这里是[一个例子](http://stackoverflow.com/questions/6942829/custom-jquery-filter-needs-optimization/6942905#6942905)这样的“离线”DOM处理 – 2012-01-06 14:45:21

+0

好点,+1。 – milan 2012-01-06 14:46:37

+0

是的,拆卸面板看起来像一个很好的解决方法(它表现良好),但它可视化“冻结”了屏幕,这不是我的客户希望看到的情况。他们认为,应用程序是挂起的,如果它不呈现水平。 – madhead 2012-01-09 15:17:25