我想将鼠标悬停在侦听器上添加到我创建的 SpanElement:
SpanElement span = Document.get().createSpanElement();
span.setInnerText("my text");
我在谷歌中找到了如何使用标签包装器,但我想在没有任何包装器的情况下做到这一点。是否可以?
谢谢你。
没有 JSNI 也是可能的。
所以用你的元素:
SpanElement span = Document.get().createSpanElement();
span.setInnerText("my text");
将事件侦听器直接添加到元素:
Event.sinkEvents(span, Event.ONCLICK);
Event.setEventListener(span, new EventListener() {
@Override
public void onBrowserEvent(Event event) {
if(Event.ONCLICK == event.getTypeInt()) {
//do your on click action
}
}
});
...而且它看起来真的很难看;)正如您所注意到的 - 事件侦听器对于该元素构想的所有 dom 事件都是“通用的”。因此,为了确保您处理正确的事件,您应该在接收多个事件类型时检查事件类型(这次是开销——因为我们只接收了 CLICK 事件的位)。至于下沉 -> 这会初始化元素以参与 gwt 全局 dom 事件调度系统 - 事件被全局处理以减少闭包的数量,从而最大限度地减少旧 IE 浏览器中的内存泄漏。在另一件事上。您只能为每个元素设置一个事件侦听器 - 如果您设置一个新事件侦听器,它会覆盖前一个事件侦听器。因此,我假设稍后您想将 MOUSEOVER 侦听器添加到您的跨度中,而不是清除所有已添加的 CLICK 侦听器,您可能会执行以下操作:
//add mouseover event bit to existing sunk event bits
Event.sinkEvents(span, Event.getEventsSunk(span) | Event.ONMOUSEOVER);
final EventListener oldListener = Event.getEventListener(span);
Event.setEventListener(span, new EventListener() {
@Override
public void onBrowserEvent(Event event) {
if(Event.ONMOUSEOVER == event.getTypeInt()) {
//your mouseover action
}
if(oldListener != null) {
oldListener.onBrowserEvent(event);
}
}
});
或一次添加更多事件:
//add mouseover event bit to existing sunk event bits
Event.sinkEvents(span, Event.ONCLICK | Event.ONMOUSEOVER | Event.ONMOUSEOUT);
Event.setEventListener(span, new EventListener() {
@Override
public void onBrowserEvent(Event event) {
switch(event.getTypeInt()) {
case Event.ONCLICK:
break;
case Event.ONMOUSEOVER:
break;
case Event.ONMOUSEOUT:
break;
}
}
});
所以在说完你可能会使用一个标签小部件来包装你的跨度之后;)
Label.wrap(span).addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
//do your on click action
}
});
最后一件事,即使你想做 DOM 编程,也不要害怕小部件——将它们视为类似于 jquery 节点包装器对象的东西。它们并不重,但提供了很大的力量。您还可以将小部件直接包装在现有的 DOM 元素上,而无需将它们附加到“面板基础结构”。