Gwt 浏览器";“缓冲区”;绘制/回流时的鼠标事件

Gwt 浏览器";“缓冲区”;绘制/回流时的鼠标事件,gwt,browser,user-input,paint,reflow,Gwt,Browser,User Input,Paint,Reflow,我正在创建一个GWT应用程序,其中使用CellList和ListDataProvider显示元素列表。我希望在每个单元格中显示的数据仅由两个字符串组成。我创建了一个自定义单元格,它从AbstractCell扩展而来。为了创建自定义单元格,我使用UIBinder并基于HTML创建了UI。每个单元格包含两个字符串和一个按钮。单击该按钮将从绑定列表中删除该元素。根据我的分辨率,大约有20个元素是可见的,所以我将页面大小设置为30,以便在用户想要向下滚动时有一点“缓冲区”。以下是前三个元素的外观:

我正在创建一个GWT应用程序,其中使用
CellList
ListDataProvider
显示元素列表。我希望在每个单元格中显示的数据仅由两个字符串组成。我创建了一个自定义单元格,它从
AbstractCell
扩展而来。为了创建自定义单元格,我使用UIBinder并基于HTML创建了UI。每个单元格包含两个字符串和一个按钮。单击该按钮将从绑定列表中删除该元素。根据我的分辨率,大约有20个元素是可见的,所以我将页面大小设置为30,以便在用户想要向下滚动时有一点“缓冲区”。以下是前三个元素的外观:


在tomcat上运行部署的应用程序时没有问题。但在开发模式下运行时,我在删除元素时注意到以下问题:

  • 我点击第一个元素的“删除元素”按钮
  • 我再次单击第一个元素的“删除元素”按钮(第一个元素仍然可见)
  • 第一个元素将从列表中删除
  • 第二个元素也将从列表中删除
我在部署的版本中也尝试了同样的方法,但是我不可能两次单击第一个元素的“删除元素”按钮,因为它删除得太快了。因此,我将显示的元素数量增加到500,这导致了相同的问题。 我切换到一个较慢的系统(1GHz的AMD G-T40R),同样的情况也发生在我将页面大小设置为50或更多

为了进一步研究这个问题,我在自定义单元格的
onbrowservevent
方法中添加了
NativePreviewHandler
并通过
Scheduler.get().schedulederferred
调度了
ScheduleCommand
,以查看发生了什么。以下是结果(在开发模式下运行,Chrome 27.0.1438.7 dev-m,添加了检查订单的时间戳):

  • 在1363340977109鼠标向下(在第一个元素的“移除元素”按钮上)
  • 在1363340977206鼠标上(在第一个元素的“移除元素”按钮上)
  • 在1363340977225处,单击(第一个元素的“删除元素”按钮)

  • at 1363340981341 onBrowserEvent中的scheduleDeferred

  • 在1363340981366处,鼠标向下移动(与第一次单击的位置相同,但现在在第二个元素的“移除元素”按钮上,因为第一个元素已移除)

  • 在1363340981386鼠标上(在第二个元件的“移除元件”按钮上)
  • 在1363340981394处,单击(在第二个元素的“删除元素”按钮上)

  • 在1363340985184,onBrowserEvent中延迟了日程安排

这里的问题是:第二次点击是否真的因为浏览器忙于渲染/(重新)绘制内容而被“缓冲”了。是否有方法确定渲染何时完成,或在浏览器繁忙时禁用用户输入

我当前的解决方案/解决方法:我在删除元素时禁用按钮。因此,点击被忽略。为了模拟浏览器完成渲染,我在执行
ScheduleCommand
后添加了一定的时间(~50ms)。然后我再次启用所有按钮。目前这是可行的,但如果有一天浏览器将输入缓冲超过50毫秒,问题就会再次出现。

我来了。默认情况下,此事件不可用,仅适用于Firefox。不幸的是,当我尝试它时,它也冻结了我的FF实例,所以我不打算进一步研究它。