GWT MouseWheelHandler не работает в Firefox - PullRequest
0 голосов
/ 09 июня 2009

Я пытаюсь создать TextBox, который будет менять значение, когда кто-то прокручивает колесо мыши над ним. В частности, моя цель для число в текстовом поле, чтобы увеличить при прокрутке вверх и уменьшить при я прокручиваю вниз Тем не менее, у меня возникли проблемы с выяснением MouseWheelHandler. Я упростил свой код, чтобы просто изменить значение на «ВВЕРХ» или «ВНИЗ», но это просто не работает. Это компилируется, хотя. Я также пробовал это с помощью event.preventDefault (), но, похоже, не эффект.

private TextBox valueField = new TextBox();
...
...
valueField.addMouseWheelHandler(new MouseWheelHandler() {
   public void onMouseWheel(MouseWheelEvent event) {
      //event.preventDefault();
      if(event.isNorth()) {
         valueField.setText("UP");
      } else {
         valueField.setText("DOWN");
      }
   }
});

Редактировать: Я только что проверил его в Chromium и Opera, и он работал нормально. К сожалению, он все еще не работает в моих поддерживаемых браузерах (Firefox и IE).

Редактировать: Решил попробовать собственный метод Javascript. Мои навыки работы с Javascript слабые, поэтому мне все еще нужна помощь.

Ответы [ 2 ]

0 голосов
/ 12 июня 2009

Я успешно запустил это под Firefox, используя собственный метод, который добавляет слушателя колеса мыши в окно, когда текстовое поле запускает событие mouseover.

protected void onAttach() {
    super.onAttach();
    String fieldId = "box"+Random.nextInt(10000);
    valueField.getElement().setId(fieldId);
    addNativeMouseWheelListener(this, fieldId);
}
...
private native void addNativeMouseWheelListener(ValueBox instance, String id) /*-{
    function mouseOverHandler(e) {
        $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function mouseOutHandler(e) {
        $wnd.removeEventListener("DOMMouseScroll", scrollWheelMove, false);
    }

    function scrollWheelMove(e) {
        e.preventDefault();
        if (e.wheelDelta <= 0 || e.detail > 0 ) {
            instance.@com.proprintsgear.design_lab.client.ValueBox::decreaseValue()();
        } else {
            instance.@com.proprintsgear.design_lab.client.ValueBox::increaseValue()();
        }
        instance.@com.proprintsgear.design_lab.client.ValueBox::fireChange()();
    }

    if($wnd.addEventListener) {
        var box=$doc.getElementById(id);
        box.addEventListener("mouseout",mouseOutHandler,false);
        box.addEventListener("mouseover",mouseOverHandler,false);
    }
}-*/;

Вскоре после написания этого метода я узнал, что последние svn-версии GWT исправили MouseWheelEvent для Firefox. Однако, я уже написал это, и мне не хочется загружать нестабильный выпуск, поэтому я буду хранить его до следующего стабильного выпуска GWT.

0 голосов
/ 11 июня 2009

Я собираюсь попытаться решить эту проблему с помощью встроенного метода Javascript. Я получил это на работу.

private static native void addNativeMouseWheelListener(String id) /*-{
    function scrollWheelMove (e) {
        if ($wnd.event || $wnd.Event) {
            if (!e) e = $wnd.event;
            if (e.wheelDelta <= 0 || e.detail > 0 ) {
                $wnd.alert("DOWN");
            } else {
                $wnd.alert("UP");
            }
        }
    }

    //var box=$doc.getElementById(id);
    $wnd.addEventListener("DOMMouseScroll", scrollWheelMove, false);
}-*/;

Теперь я ищу способ добавить слушатель DOMMouseScroll к самому элементу. Возможно ли это, или я должен просто создать прослушиватель DOMMouseScroll для окна всякий раз, когда пользователь наводит курсор на элемент? Также, как я могу предотвратить прокрутку окна?

...