2012-01-06 61 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