我想将鼠标悬停在SpanElement上,我创建的是SpanElement:
SpanElement span = Document.get().createSpanElement();
span.setInnerText("my text");
我在google中发现如何使用Label-wrapper,但我想在没有任何包装器的情况下这样做。有可能吗?
谢谢。
答案 0 :(得分:7)
没有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浏览器中的内存泄漏。 还有一件事。你可以为每个元素只设置一个事件监听器 - 如果你设置一个新的,它会覆盖前一个。所以我假设somwehere后来你想要在你的跨度中添加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元素上,而无需将它们附加到“面板基础结构”。