Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将侦听器添加到元素_Java_Gwt - Fatal编程技术网

Java 将侦听器添加到元素

Java 将侦听器添加到元素,java,gwt,Java,Gwt,我想将鼠标悬停侦听器添加到SpanElement,我通过以下方式创建了该元素: SpanElement span = Document.get().createSpanElement(); span.setInnerText("my text"); 我在谷歌上找到了如何使用标签包装器,但我想不使用任何包装器。可能吗 谢谢。也可以不使用JSNI 因此,对于您的元素: SpanElement span = Document.get().createSpanElement(); span.setIn

我想将鼠标悬停侦听器添加到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事件都是“公共的”。因此,为了确保您处理了正确的事件,您应该在接收多个事件类型时检查事件类型(这一次是开销-因为我们只接收单击事件的位)。至于sinking->这将初始化元素以参与gwt全局dom事件调度系统-全局处理事件以减少闭包的数量,从而最大限度地减少旧IE浏览器中的内存泄漏。 还有一件事。每个元素只能设置一个事件侦听器-如果设置一个新的侦听器,它将覆盖上一个侦听器。因此,我假设稍后您要将鼠标悬停侦听器添加到您的范围中,而不是清除allready added CLICK listener您可以执行以下操作:

//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;
        }
    }
});
因此,在说了这些之后,您可能会建议使用一个标签小部件包装您的跨度;)

最后一件事是,即使您想进行DOM编程,也不要害怕小部件——将它们看作类似于jquery节点包装器对象的东西。它们不重,但有很大的力量。
您还可以直接将小部件包装到现有DOM元素上,而无需将它们附加到“面板基础结构”上。

也可以不使用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事件都是“公共的”。因此,为了确保您处理了正确的事件,您应该在接收多个事件类型时检查事件类型(这一次是开销-因为我们只接收单击事件的位)。至于sinking->这将初始化元素以参与gwt全局dom事件调度系统-全局处理事件以减少闭包的数量,从而最大限度地减少旧IE浏览器中的内存泄漏。 还有一件事。每个元素只能设置一个事件侦听器-如果设置一个新的侦听器,它将覆盖上一个侦听器。因此,我假设稍后您要将鼠标悬停侦听器添加到您的范围中,而不是清除allready added CLICK listener您可以执行以下操作:

//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;
        }
    }
});
因此,在说了这些之后,您可能会建议使用一个标签小部件包装您的跨度;)

最后一件事是,即使您想进行DOM编程,也不要害怕小部件——将它们看作类似于jquery节点包装器对象的东西。它们不重,但有很大的力量。
您还可以直接将小部件包装到现有DOM元素上,而无需将它们附加到“面板基础结构”(panel infrastructure)。

是的,可以使用JSNI。为什么不使用隐藏JSNI复杂性的包装类?@GuillaumePolet,因为我在其他情况下遇到了这个问题,我想知道GWT如何处理低级事件。是的,使用JSNI是可能的。为什么不使用隐藏JSNI复杂性的包装类?@GuillaumePolet,因为我在其他情况下遇到了这个问题,我想知道GWT如何处理低级别的事件。需要注意的一点是,确保在detach或页面加载时将事件侦听器清空,或者在某些浏览器中造成内存泄漏。这就是为什么GWT不鼓励这种策略。有关更多详细信息,请参阅。@Colin-您是指在使用小部件包装现有DOM元素时,分离上的小部件吗?对于作为标签的“标准”小部件,wrap方法通过
RootPanel.detachOnWindowClose(实例)来处理它
,如果您编写了一个自定义小部件,打算在DOM编程中使用它,那么除了“面板使用构造函数”之外,您还应该提供AnalogOUS静态包装方法,请参见@Colin-如果您直接在元素上工作,我同意在页面卸载时,您应该在所有已注册侦听器的元素上将EventListener设置为null(虽然没有小部件实例,但您没有分离事件(例如,nothing激发“attached:false”))。这似乎有点难看。需要注意的一点是-确保在分离时清空事件侦听器,或者在加载页面时清空事件侦听器,或者在某些浏览器中创建内存泄漏。这就是为什么GWT不鼓励使用此策略的原因。有关详细信息,请参阅。@Colin-您是指在使用小部件包装现有DOM元素时分离上的小部件?有关详细信息,请参阅“标准”小部件作为标签wrap方法通过
RootPanel.detachOnWindowClose(instance);
来解决这个问题,如果您编写了一个您打算在DOM编程中使用的自定义小部件,除了“panel usage constructor”之外,还应该提供类似的静态wrap方法“请参阅@Colin-如果您直接在元素上工作,那么我同意在页面卸载时,您应该将所有已注册侦听器的元素上的EventListener设置为null(虽然没有小部件实例,但您没有分离事件(例如,nothing激发“attached:false”)。这似乎有点难看。