没有响应的javascript通知

时间:2012-01-06 14:25:57

标签: javascript firefox gwt

我有一种情况,我在FireFox 3.6+上的GWT网格中从服务器渲染项目。我有大约200个项目,我将它们加载到循环中:

users = myService.getUsers();
for(User user : users){
    myPanel.addUser(user); // Pseudocode. Actually i add some labels and text fields...
}

在此循环中更改DOM需要很长时间,因此我收到了“无响应脚本”通知。但我不能重构代码或分页,我需要一次加载1页上的所有200个项目。

有没有办法取消此通知?要通知浏览器我的脚本没有挂起,但做了一些有用的事情吗?

UPD 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可以帮助我......

2 个答案:

答案 0 :(得分:6)

您应该在将User附加到DOM之前添加myPanel,或者如果它已经附加并且需要更新,请从DOM中删除myPanel,添加所有用户并重新附加{ {1}}。

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

答案 1 :(得分:4)

有几个选择:

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

  • 切换到CellTable;这是一次重大的重构,但它会比基于小部件(LabelTextBox等)的其他任何内容提供更好的性能。