Неотзывчивое уведомление javascript - PullRequest
1 голос
/ 06 января 2012

У меня ситуация, когда я рендерил элементы с сервера в сетке GWT на FireFox 3.6+. У меня есть приблизительно 200 предметов, и я загружаю их в цикле:

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

Это слишком долго меняет DOM в этом цикле, поэтому я получил уведомление "Unresponsive script". Но я не могу изменить код или сделать нумерацию страниц, мне нужно, чтобы все 200 элементов на 1 странице загружались одновременно.

Есть ли способы подавить это уведомление? Чтобы уведомить браузер, что мой скрипт не зависает, а делает что-то полезное?

UPD Хорошо , вот мой код ближе. Это код из большого проекта, и у нас есть много пользовательских компонентов, поэтому, я думаю, он не имеет реальной ценности.

    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);
            }
        }

    });

И я думаю это может помочь мне ...

Ответы [ 2 ]

6 голосов
/ 06 января 2012

Вы должны добавить User s перед присоединением myPanel к DOM, или, если оно уже подключено и требует обновления, удалите myPanel из DOM, добавьте всех пользователей и подключите myPanel.

Что происходит, когда вы добавляете 200 пользователей при подключенном myPanel, так это то, что ваш браузер должен обновлять DOM 200 раз, что довольно дорого (пересчет и перерисовка экрана).

4 голосов
/ 06 января 2012

Несколько вариантов:

  • пакет ваши обновления с использованием Scheduler.scheduleIncremental;рендеринг только 10 пользователей или около того одновременно (не беспокойтесь, Scheduler будет запускать ваш код столько раз, сколько возможно подряд перед выдачей, так что он может фактически отображать 50, 100 или 150 пользователей одновременно, изатем продолжайте 10 мс (да, миллисекунды) после)

  • переключитесь на CellTable;это серьезный рефакторинг, но он даст вам гораздо лучшую производительность, чем все, что вы могли бы сделать на основе виджетов (Label, TextBox и т. д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...