在GWT中“更改”浏览器事件

时间:2012-11-19 10:45:26

标签: internet-explorer gwt cross-browser

我在GWT中创建表,其中一列包含具有输入的单元格。我希望在输入中的文本发生变化时获取信息。在我的单元格中,我重载render()onBrowserEvent()方法。这是代码:

public HourPickerCell() {
    super("change", "keyup");
}

@Override
public void render(Context context, String value, SafeHtmlBuilder sb) {
    if (value == null) {
        return;
    }
    sb.appendHtmlConstant("<input class=\"hourPicker\" type=\"text\" value=\"" + value + "\"></input>");        
}


@Override
public void onBrowserEvent(Context context, Element parent, String value, NativeEvent event, ValueUpdater<String> valueUpdater) {
    System.out.println(event.getType());
    super.onBrowserEvent(context, parent, value, event, valueUpdater);

    if (event.getType().equals("change")) {
        EventTarget eventTarget = event.getEventTarget();
        if (!Element.is(eventTarget)) {
            return;
        }
        if (parent.getFirstChildElement().isOrHasChild(Element.as(eventTarget))) {
            InputElement input = (InputElement) parent.getFirstChild();
            valueUpdater.update(input.getValue());
        }
    }       
}

如您所见,我尝试捕捉change事件。在Firefox和Chrome上一切正常。当我在输入中写入内容并将tab键入其他单元格时,我会在控制台中获得以下结果:

keyup keyup keyup keyup keyup keyup keyup change keyup

其中一个事件是“改变” - 这就是我所需要的。不幸的是,我只收到Internet Explorer:

keyup keyup keyup keyup keyup keyup keyup

没有变化事件。 谁能告诉我问题出在哪里?有没有办法解决它?

1 个答案:

答案 0 :(得分:0)

在Internet Explorer中,change事件不会冒泡[1],因此您必须直接在input元素上侦听事件。其他浏览器都实现HTML5行为,其中change事件冒泡[2]。

我不知道正确的修复方法,但您可能最好使用或复制TextInputCell已完成所有艰苦工作。

[1] http://msdn.microsoft.com/en-us/library/ie/ms536912(v=vs.85).aspx
[2] http://dev.w3.org/html5/spec/common-input-element-apis.html#event-input-change


作为旁注,您的render方法不安全(如果value包含引号会怎么样?)您可能想要使用SafeHtmlUtilsSafeHtmlTemplates (参见TextInputCell)的代码