2011-11-21 54 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