GWT FocusPanel,制表键和焦点处理程序

时间:2010-06-28 11:15:29

标签: events gwt javascript-events focus cross-browser

我正在实施一个扩展Composite并实施FocusableHasFocusHandlers的自定义小部件。

小部件在面板中包含两个小部件,我将其包装到FocusPanel中,用于初始化小部件。我的构造函数看起来像这样:

public CustomBox() {
    panel = new VerticalPanel();
    ...
    panel.add(caption);
    panel.add(icon);
    ...
    focusPanel = new FocusPanel(panel);
    initWidget(focusPanel);
}

我在焦点小组中委派FocusableHasFocusHandlers的实施,例如:

@Override
public void setFocus(boolean focused) {
    focusPanel.setFocus(focused);
}

@Override
public void setTabIndex(int index) {
    focusPanel.setTabIndex(index);        
}

@Override
public HandlerRegistration addFocusHandler(FocusHandler handler) {
    return focusPanel.addFocusHandler(handler);
}   

然后我可以使用setFocus(true)在我的任何对象中设置焦点,然后setTabIndex()设置标签索引。 Tab键也可以按预期工作,但我的问题是我无法处理焦点事件,因为从未调用onFocus()添加的处理程序的addFocusHandler()方法。

我知道焦点正在改变,因为我跟随对象的焦点,用:focus CSS选择器改变其样式。

为什么焦点处理程序从未被调用?

1 个答案:

答案 0 :(得分:0)

处理焦点事件可能会非常棘手和变化无常。 GWT应该通过在需要时将隐藏的输入字段添加到FocusPanel DIV中来使这一切变得简单。以下是jQuery文档的摘录:

  

焦点事件在获得焦点时发送到元素。该事件隐含地适用于有限的一组元素,例如表单元素(< input>,< select>等)和链接(< a href>)。在最近的浏览器版本中,可以通过显式设置元素的tabindex属性来扩展事件以包括所有元素类型。元素可以通过键盘命令(例如Tab键)或通过鼠标单击元素来获得焦点。

我不知道你的问题的解决方案,但我的猜测是HTML / browser / dom相关的东西搞乱了事件处理。例如,captionicon还是FocusPanel?这可能会影响焦点事件如何冒泡。