Вопрос по java – Добавить слушателя в SpanElement

1

Я хочу добавить мышь над слушателем в SpanElement, который я создал:

<code>SpanElement span = Document.get().createSpanElement();
span.setInnerText("my text");
</code>

Я нашел в Google, как это сделать с помощью Label-wrapper, но я хочу сделать это без каких-либо упаковщиков. Является ли это возможным

Спасибо

Да, это возможно с помощью JSNI. Почему бы вам не использовать класс обёртывания, который скрывает сложность JSNI? Guillaume Polet
@ GuillaumePolet Потому что я столкнулся с этой проблемой в других случаях, и я хотел бы знать, как GWT работает с событиями на низком уровне. Elijah

Ваш Ответ

1   ответ
7

Так со своим элементом:

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 - события обрабатываются глобально, чтобы уменьшить количество замыканий, чтобы минимизировать утечки памяти в старых браузерах 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, не подключая их к «инфраструктуре панели».

Одно замечание, которое следует сделать - убедитесь, что вы отключили прослушиватели событий при отсоединении, или когда страница загружается, или вы создаете утечки памяти в некоторых браузерах. Вот почему эта стратегия не поощряется в GWT. Видеть Code.google.com / р / Google-веб-инструментарий / вики / ... Больше подробностей Colin Alworth
Большое спасибо Elijah
@ Colin - вы имеете в виду виджеты на detach, когда оборачиваете существующий элемент DOM с Widget? Для «стандартных» виджетов, таких как Label, метод wrap заботится об этом с помощьюRootPanel.detachOnWindowClose(instance);, Если вы пишете пользовательский виджет, который вы собираетесь использовать в программировании DOM, вы должны предоставить аналог статического метода переноса, кроме «конструктора использования панели». См. Stackoverflow.com / а / 10142574/1010868 Tomasz Gawel
@ Colin - если вы работаете непосредственно с Element, я согласен с тем, что вы должны установить нулевое значениеEventListener для всех элементов, у которых зарегистрированы прослушиватели, когда страница выгружается (пока нет экземпляра Widget, у вас нет события отсоединения (например, ничего не срабатывает): ложный")). Это немного уродливо. Tomasz Gawel

Похожие вопросы