2009-06-09 27 views
0

我試圖製作一個TextBox,當某人將鼠標滾輪滑過它時,它將更改值。具體來說,我的目標是當我向上滾動時文本框中的 數字增加,當我向下滾動時減少 。但是,我很難找出 MouseWheelHandler。我簡化了代碼,只是將其值更改爲 「UP」或「DOWN」,但它不起作用。它編譯雖然。我也 嘗試與event.preventDefault(),但似乎沒有任何 的影響。GWT MouseWheelHandler在Firefox中不工作

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"); 
     } 
    } 
}); 

編輯:我只是測試它在鉻和歌劇,它工作得很好。不幸的是,它仍然不支持我的支持瀏覽器(Firefox和IE)。

編輯:決定嘗試一個本地的Javascript方法。我的JavaScript技能很薄弱,所以我仍然需要一些幫助。

回答

0

我在火狐瀏覽器中使用本地方法成功運行該代碼,該方法在文本框觸發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) { 
      [email protected]_lab.client.ValueBox::decreaseValue()(); 
     } else { 
      [email protected]_lab.client.ValueBox::increaseValue()(); 
     } 
     [email protected]_lab.client.ValueBox::fireChange()(); 
    } 

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

不久寫此方法後,我才知道,GWT的最新版本SVN有固定的的MouseWheelEvent的Firefox瀏覽器。不過,我已經寫了這個,我不想下載一個不穩定的版本,所以我會保留這個,直到下一個穩定的GWT版本。

0

我將嘗試用本地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偵聽器的窗口,只要用戶鼠標懸停在元素上?另外我該如何防止窗口滾動?