2011-11-21 20 views
5

我在基於dojo的應用程序中使用了一些dijit.form.NumberSpinner wigets,它們全部都連接到onChange操作。如何禁用dijit.form.NumberSpinner小部件上的mousewheel事件?

一個問題,當一個人有很多的NumberSpinner面積S發生:用戶在頁面上滾動時,不慎與意外值填補NumberSpinner領域,同時與鼠標滾輪在整個地區,滾動。

是否可以在dijit.form.NumberSpinner wigets上禁用mousewheel事件?

回答

6

如果你永遠不需要它,如果你有機會到道場來源,並能夠做自己的版本,註釋的dijit /表格/在這條線_Spinner.js:

postCreate: function(){ 
    // [...] 
    // this.connect(this.domNode, !has("mozilla") ? "onmousewheel" : 'DOMMouseScroll', "_mouseWheeled"); 
    // [...] 
} 

另外,您可以設置intermediateChanges屬性爲true的窗口小部件,並做這樣的事情:

在你的HTML:

<input id="spinner1" name="someNumber" data-dojo-type="dijit.form.NumberSpinner" data-dojo-props="value:'1000',smallDelta:'10',constraints:{min:9,max:1550,places:0}, intermediateChanges:'true'"/> 

在你的JavaScript塊:

dojo.ready(function(){ 
    var spinner = dijit.byId("spinner1"); 
    var currentValue = spinner.get('value'); 
    dojo.connect(spinner, "onChange", function(value){ 
     currentValue = value; 
    }); 
    dojo.connect(spinner.domNode, (!dojo.isMozilla ? "onmousewheel" : "DOMMouseScroll"), function(e){ 
     spinner.set('value',currentValue); 
    }); 

}); 
+0

如您所描述的那樣自定義源代碼,併爲我自己製作完美版本,thx。 ;-) – proximus

+0

不客氣。我很高興它幫助... – Philippe

1

一個快速和骯髒的方式有鼠標滾輪只能工作在小部件有重點是在dijit/form/_Spinner.js添加if (!this.focused) return;_mouseWheeled頂部。

_mouseWheeled: function(/*Event*/ evt){ 
    // summary: 
    //  Mouse wheel listener where supported 
    if (!this.focused) return; 
    ... 

雖然適當的方法是擴展小部件。

// Disable _mouseWheeled when not in focus. 
require(
    [ 
     "dojo/_base/lang" 
     , "dojo/_base/event" 
     , "dijit/form/_Spinner" 
    ] 
    , function(
     lang 
     , event 
     , _Spinner 
    ){ 
     lang.extend(_Spinner, { 
      _mouseWheeled: function(/*Event*/ evt){ 
       // summary: 
       //  Mouse wheel listener where supported 

       if (!this.focused) return; 

       event.stop(evt); 
       // FIXME: Safari bubbles 

       // be nice to DOH and scroll as much as the event says to 
       var wheelDelta = evt.wheelDelta/120; 
       if(Math.floor(wheelDelta) != wheelDelta){ 
        // If not an int multiple of 120, then its touchpad scrolling. 
        // This can change very fast so just assume 1 wheel click to make it more manageable. 
        wheelDelta = evt.wheelDelta > 0 ? 1 : -1; 
       } 
       var scrollAmount = evt.detail ? (evt.detail * -1) : wheelDelta; 
       if(scrollAmount !== 0){ 
        var node = this[(scrollAmount > 0 ? "upArrowNode" : "downArrowNode")]; 

        this._arrowPressed(node, scrollAmount, this.smallDelta); 

        if(!this._wheelTimer){ 
         clearTimeout(this._wheelTimer); 
        } 
        this._wheelTimer = setTimeout(lang.hitch(this,"_arrowReleased",node), 50); 
       } 
      } 
     }); 
    } 
);