1

と を使用して、要素のリストを表示する GWT アプリケーションを作成してCellListListDataProviderます。各セルに表示したいデータは、2 つの文字列のみで構成されています。から拡張するカスタム セルを作成しましたAbstractCell。カスタム セルを作成するには、UIBinder を使用し、HTML に基づいて UI を作成しました。各セルには、2 つの文字列とボタンが含まれています。ボタンをクリックすると、バインドされたリストから要素が削除されます。私の解像度では、約 20 個の要素が表示されるので、ページ サイズを 30 に設定して、ユーザーが下にスクロールしたいときに少し「バッファー」を持たせます。最初の 3 つの要素は次のようになります。

http://imageshack.us/f/201/listox.png/

デプロイされたアプリケーションを tomcat で実行しても問題ありません。しかし、開発モードで実行すると、要素を削除しているときに次の問題に気付きました:

  • 最初の要素の「要素を削除」ボタンをクリックします
  • 最初の要素の [要素の削除] ボタンをもう一度クリックします (最初の要素がまだ表示されている間)。
  • 最初の要素がリストから削除されます
  • 2 番目の要素もリストから削除されます

デプロイされたバージョンで同じことを試みましたが、最初の要素の「要素の削除」ボタンを 2 回クリックすることができませんでした。削除が速すぎたからです。そのため、表示される要素の量を 500 に増やしましたが、同じ問題が発生しました。低速のシステム (1 GHz の AMD G-T40R) に切り替えたところ、ページ サイズを 50 以上に設定しても同じことが起こりました。

この問題をさらに掘り下げるために、カスタム Cellのメソッドにビアを追加しNativePreviewHandlerてスケジュールし、何が起こっているかを確認しました。結果は次のとおりです (開発モード、Chrome 27.0.1438.7 dev-m で実行、順序を確認するためのタイムスタンプを追加):ScheduleCommandScheduler.get().scheduleDeferredonBrowserEvent

  • at 1363340977109 mousedown (最初の要素の「要素の削除」ボタン上)
  • at 1363340977206 mouseup (最初の要素の「要素の削除」ボタン上)
  • 1363340977225 でクリックします (最初の要素の [要素の削除] ボタンをクリックします)。

  • 1363340981341 でスケジュール onBrowserEvent で延期

  • at 1363340981366 mousedown (最初のクリックと同じ位置ですが、最初の要素が削除されたため、2 番目の要素の [要素の削除] ボタン)

  • at 1363340981386 mouseup (2 番目の要素の [要素の削除] ボタン上)
  • 1363340981394 でクリックします (2 番目の要素の [要素の削除] ボタンをクリックします)。

  • 1363340985184 でスケジュール onBrowserEvent で延期

ここでの質問:ブラウザがコンテンツのレンダリング/(再) 描画でビジーであるため、2 回目のクリックが何らかの形で「バッファリング」されるというのは本当ですか。レンダリングがいつ完了したかを判断する方法や、ブラウザがビジー状態のときにユーザー入力を無効にする方法はありますか?

私の現在の解決策/回避策:要素が削除されたときにボタンを無効にします。したがって、クリックは無視されます。ブラウザがレンダリングを終了したことをエミュレートするために、実行後に一定の時間 (~50ms) を追加しましたScheduleCommand。次に、すべてのボタンを再度有効にします。これは今のところ機能しますが、いつかブラウザが入力を 50 ミリ秒以上バッファリングすると、問題が再び発生します。

4

0 に答える 0