2012-11-19 85 views
0

我在GWT中创建表格,其中一列包含具有输入的单元格。我希望在输入文字改变时获得信息。在我的单元格中,我重载render()onBrowserEvent()方法。代码如下:GWT中的“更改”浏览器事件

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上一切正常。当我写输入一些东西,标签到其他细胞,我得到在控制台得到以下结果:

keyup keyup keyup keyup keyup keyup keyup change keyup

事件之一是“改变” - 这正是我需要的。可惜的是在Internet Explorer上,我只收到:

keyup keyup keyup keyup keyup keyup keyup

没有改变事件。 有谁能告诉我问题在哪里?有什么方法可以解决它吗?

回答

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包含引号?)你可能想使用SafeHtmlUtils或一个SafeHtmlTemplates(见代码TextInputCell

+0

使用'TextInputCell'我只在Internet Explorer中获得'keyup'和'keydown'事件。在Firefox和铬仍然一切都好。我知道我的解决方案是不安全的 - 我会改变它:) – mchrobok

+0

但是'AbstractInputCell'也处理'blur',并且'change'被模糊处理,所以... –

+0

是的,我同意,因为在Chrome和Firefox中我得到所有事件 - keydown,keyup,change,blur,focus。但IE仍然只产生'keyup'和'keydown'事件 – mchrobok