2012-05-15 71 views
0

我有檢查,如果用戶在輸入框中寫入位的函數:什麼可能導致這個JavaScript NaN在IE 7中?

var letters = 'ABCÇDEFGHIJKLMNÑOPQRSTUVWXYZabcçdefghijklmnñopqrstuvwxyzàáÀÁéèÈÉíìÍÌïÏóòÓÒúùÚÙüÜ'; 
var numbers = '1234567890'; 
var signs = ',.:;@-\''; 
var mathsigns = '+-=()*/'; 
var custom = '<>#$%&?¿'; 


function alpha(event) { 
    var k; 
    k = document.all ? parseInt(event.keyCode) : parseInt(event.which); 
    return (numbers.indexOf(String.fromCharCode(k)) != -1); 
} 

此功能用下面的函數,即取位並把它發送到一個控制器一起使用,從而節省了數據庫中的數字。但是,只有當數字與原始數字不同時,首先出現在輸入框中。它還更新另一個輸入框,與和關閉具有相同ROW_ID屬性作爲觸發事件的輸入框中的所有特定的輸入:

function initializeUpdateNumberProcentMatrix() { 

    $(".numberfield").live('keypress', alpha); 

    //$(".numberfield").live('keypress', alpha(numbers)); 


     $('.numberfield').live('focus', function() { 
      $(this).attr('oldvalue', $(this).val()); 
     }); 

     $('.numberfield').live('blur', function() { 

      // Dette er den nuværende værdi i tekstboksen 
      var value = $(this).val(); 
      var oldvalue = $(this).attr('oldvalue'); 

      // Reference til tekstboksen 
      var obj = $(this); 

      // Hvis værdien ikke har ændret sig, skal der ikke foretages noget (hvis man tabulerer) 
      if (value == $(this).attr('oldvalue')) { 
       return; 
      } 

      else { 

       var dif = value - $(this).attr('oldvalue'); 
       var newval; 


       $('.procentsumfield').each(function (index) { 
        if ($(this).attr('row-id') == obj.attr('row-id')) { 

         newval = (parseInt($(this).val()) + parseInt(dif)); 

         // Hvis summen overstige 100, skal der ikke foretages nogle ændringer - Textboksens værdi skal tilbagestilles, og sumfeltet skal ikke odateres     
         if (newval > 100) { 
          obj.val(oldvalue); 
          alert("Summen for det pågældende år må ikke overstige 100%"); 
          return; 
         } 
         else { 
          $(this).val(newval); 
          return false; 
         } 
        } 
       }); 

       var number = { Column_ID: $(this).attr('column-id'), 
        Row_ID: $(this).attr('row-id'), 
        Question_ID: $(this).attr('question-id'), 
        Value: $(this).val(), 
        Type: "Procent" 
       }; 

       // Hvis den nye værdi overstiger 100, skal det ikke gemmes 
       if (newval <= 100) { 
        saveNumberMatrix($(this), number, "/SaveSurveyAnswers/SaveProcentMatrix"); 
       } 
      } 
     }); 
    } 

的問題是,有時IE 7給了我楠的「procentsumfield」輸入框,它不保存新值,因爲它不是數字。

什麼可能導致這種情況發生?

由於

+1

在jQuery中['event.which'](http://api.jquery.com/category/events/event-object/)被歸一化(並且應該是int) –

+1

供參考:'文檔。所有的檢查都不好。 – epascarello

+1

建議:不要使用live();它被棄用,使用on(); –

回答

0
var dif = value - $(this).attr('oldvalue'); 

兩個value$(this).attr('oldvalue')都是字符串。 -只適用於整數,因此 string-stringNaN

對這些需要使用parseInt

var value = parseInt($(this).val(), 10); 
var oldvalue = parseInt($(this).attr('oldvalue'), 10); 

請注意,10,這可確保值爲「base 10」。

編輯:如評論中所述,NaN來自$(this).val()爲空('')。您可以檢查該像這樣:

if($.trim($(this).val()) === '') 

或者:

var value = parseInt($(this).val(), 10); 
if(isNaN(value)) 

您設置oldvalue但你永遠不使用它,你應該使用它而不是每次都獲得屬性。

var dif = value - oldvalue; 

而且改變這一行newval = (parseInt($(this).val()) + parseInt(dif));到:

newval = parseInt($(this).val(), 10) + dif; 

dif已經是一個int,不需要parseInt

另一個注意事項:在jQuery event.which是規範化(應該是一個int),所以你不需要「檢查」它。

function alpha(event) { 
    return (numbers.indexOf(String.fromCharCode(event.which)) != -1); 
} 
+0

_「'-'只適用於整數,所以'string-string'是'NaN'。」_並非總是如此。試試'123' - '456'' –

+0

@MattBall:我站好了X_X –

+0

謝謝你的回答。我會做所有的更正。我發現當onblur發生火災,並且有輸入框是空的(沒有數值)時,它們是循環中的NaN。我怎樣才能解決這個問題? – Kenci

2

NaN是病毒/毒。如果值爲NaN那麼(幾乎)任何其他值進入其計算可能是原因。在這種情況下:

  • parseInt($(this).val())可能會返回NaN
  • parseInt(dif)可能會返回NaN,通過
    • valueNaN,或
    • $(this).attr('oldvalue')返回的東西,不能被強制轉換爲若干
    • 可能造成

(邊評論:爲什麼你parseInt()荷蘭國際集團dif?它已經是一個號碼,或NaN。而且,即使它是一個字符串,這是愚蠢的parseInt()它的循環內。)

+0

你說得對。當我遍歷輸入框時,如果它們中的一些是空的,沒有值,它們在解析時變成NaN。 – Kenci

相關問題