2011-11-21 31 views
2

我有5個紡紗這幾乎完美的工作,只有一個小故障,我不能克服的。微調是不太正確的顯示號碼,如果微調是空白

什麼是假設發生的是,如果微調是空白的,不管前面的數字是在微調,它會顯示以前的號碼。

相反,它是做什麼的是,已在任一5個紡紗輸入了以前的任何數字,它顯示的是空白微調這個數字。

那麼如何才能得到它,使它顯示從微調對上號,如果微調是空白,而不是顯示來自任何微調的空白微調進入前面的最後一個號碼是多少?

下面是我的微調代碼:

 function Spinner(elem,min, max){ 
this.elem = elem; 
this.elem.value = min; 
this.min = min; 
this.max = max; 
this.timer; 
this.speed = 150; //milliseconds between scroll values 
var selfO = this; 

this.elem.onkeyup = function(){ 
    var regex = /^[0-9]*$/; 
    if(!regex.test(selfO.elem.value)){ 
    selfO.elem.value = selfO.elem.value.substring(0,selfO.elem.value.length-1); 
          return; 
         } 
         selfO.validateValue(); 
        } 

     this.validateValue = function(){ 
     if(Number(selfO.elem.value) > selfO.max) {selfO.elem.value = selfO.max;} 
     if(Number(selfO.elem.value) < selfO.min) {selfO.elem.value = selfO.min;} 
        } 

        this.stopSpinning = function(){ 
         clearTimeout(selfO.timer); 
        } 

        this.spinValue = function(dir){ 
         selfO.elem.value = Number(selfO.elem.value) + dir; 
         selfO.validateValue(); 
         selfO.timer = setTimeout(function(){selfO.spinValue(dir);},selfO.speed); 
        } 

       }; 

      window.onload=function(){ 
         //create the Spinner objects 
         var SpinnerHours = new Spinner(document.getElementById('txtHours'),0,23);     
         var SpinnerMins = new Spinner(document.getElementById('txtMins'),0,59); 
         var SpinnerSecs = new Spinner(document.getElementById('txtSecs'),0,59); 
         var SpinnerWeight = new Spinner(document.getElementById('txtWeight'),0,100); 
         var SpinnerQuestion = new Spinner(document.getElementById('txtQuestion'),0,100); 

         document.getElementById('txtHours').onblur = function(){ this.value = cleanSpin(this.value);} 
         document.getElementById('txtMins').onblur = function(){ this.value = cleanSpin(this.value);} 
         document.getElementById('txtSecs').onblur = function(){ this.value = cleanSpin(this.value);} 
         document.getElementById('txtWeight').onblur = function(){ this.value = cleanSpin(this.value);} 
         document.getElementById('txtQuestion').onblur = function(){ this.value = cleanSpin(this.value);} 

      function cleanSpin(obj) { 
       if(obj > 0) { 
        var str = obj.replace(/^0*/,''); 
        lastSpin = str; 
        return str; 
       } 
       else { 
        return lastSpin; 
       } 
      } 

      var lastSpin = 1; 
+0

Spinner類從哪裏來?這不是標準的JavaScript AFAIK。 – GregL

+0

我會猜測它來自jQuery UI,但我很好奇這行代碼。 cleanSpin(THIS.VALUE); –

+0

我不想用代碼重載,但是如果你想要微調類,那麼現在我已經在包含值的驗證的問題中包含了這個。我認爲這個問題雖然是在我的cleanSpin()函數 – BruceyBandit

回答

1

的問題是,你的lastSpin變量,而事實上,你cleanSpin()功能,是在全球範圍內,因此在所有微調實例共享。

相反,您應該嘗試將cleanSpin方法或其變體添加到Spinner「類」中,以使其成爲本地的Spinner實例。

編輯:下面是完整的Javascript來說明我的意思。我還沒有測試過,因爲我沒有剩下的代碼需要這樣做,但希望你能看到我已經改變了:

function Spinner(elem, min, max) { 
    this.elem = elem; 
    this.elem.value = min; 
    this.min = min; 
    this.max = max; 
    this.timer; 
    this.speed = 150; //milliseconds between scroll values 
    this.lastSpin = 1; // added lastSpin as a property of the Spinner 
    var selfO = this; 

    this.elem.onkeyup = function() { 
     var regex = /^[0-9]*$/; 
     if (!regex.test(selfO.elem.value)) { 
      selfO.elem.value = selfO.elem.value.substring(0, selfO.elem.value.length - 1); 
      return; 
     } 
     selfO.validateValue(); 
    } 

    // I have added the onblur function inside the Spinner "class" 
    this.elem.onblur = function() { 
     if (self0.elem.value > 0) { 
      var str = self0.elem.value.replace(/^0*/, ''); 
      self0.lastSpin = str; 
      self0.elem.value = str; 
     } 
     else { 
      self0.elem.value = lastSpin; 
     } 
    }; 

    this.validateValue = function() { 
     if (Number(selfO.elem.value) > selfO.max) { 
      selfO.elem.value = selfO.max; 
     } 
     if (Number(selfO.elem.value) < selfO.min) { 
      selfO.elem.value = selfO.min; 
     } 
    }; 

    this.stopSpinning = function() { 
     clearTimeout(selfO.timer); 
    }; 

    this.spinValue = function(dir) { 
     selfO.elem.value = Number(selfO.elem.value) + dir; 
     selfO.validateValue(); 
     selfO.timer = setTimeout(function() { 
      selfO.spinValue(dir); 
     }, selfO.speed); 
    }; 

}; 

window.onload = function() { 
    //create the Spinner objects 
    var SpinnerHours = new Spinner(document.getElementById('txtHours'), 0, 23); 
    var SpinnerMins = new Spinner(document.getElementById('txtMins'), 0, 59); 
    var SpinnerSecs = new Spinner(document.getElementById('txtSecs'), 0, 59); 
    var SpinnerWeight = new Spinner(document.getElementById('txtWeight'), 0, 100); 
    var SpinnerQuestion = new Spinner(document.getElementById('txtQuestion'), 0, 100); 
} 
+0

我編輯了你的答案,這是你的意思,例如: BruceyBandit

+0

@ user1050384不完全 - 請參閱我的更新回答。 – GregL

+0

我可以看到你的意思。這段代碼確實刪除了之前工作過的微調器中的數字前面的所有零,但是如果微調器是空白的,那麼這個代碼確實足夠粗糙,並且我點擊一下,它就不會在微調器中顯示任何東西。我會檢查這一點。如果你再看一遍,你可以看看你的代碼,看看爲什麼,我會看看我的文檔,看看我能否弄明白:) – BruceyBandit