2012-05-15 3 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 дает мне NaN в «procentsumfield», и он не сохраняет новое значение, потому что это не число.

Что может быть причиной этого?

Благодаря

+1

В JQuery [ 'event.which'] (http://api.jquery.com/category/events/event-object/) нормирована (и должно быть целое) –

+1

FYI:' документ. все 'проверка - плохой. – epascarello

+1

Рекомендация: не использовать live(); он устарел, использует on(); –

ответ

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

Оба value и $(this).attr('oldvalue') являются строками. - работает только на ints, поэтому string-string is NaN .

Вы должны использовать parseInt.

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

Обратите внимание на ,10, это гарантирует, что значения «база 10».

EDIT: Как указано в комментариях, 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 это уже ИНТ, нет необходимости в parseInt.

Другое примечание: В jQuery event.which нормализуется (и должен быть int), поэтому вам не нужно «проверять» его.

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

_ "' -' работает только на int, поэтому 'string-string' является' NaN'. "_ Не всегда верно. Попробуйте '' 123 '-' 456'' –

+0

@MattBall: Я стою исправлен X_X –

+0

Благодарим за ответ. Я сделаю все исправления. Я узнал, что когда onblur срабатывает, и есть поля ввода, которые пусты (нет значения), они являются NaN в цикле. Как я могу это исправить? – Kenci

2

NaN вирусный/яд. Если значение равно NaN, тогда (в значительной степени) причиной могут быть любые другие значения, которые вошли в его расчет. В этом случае:

  • parseInt($(this).val()) может быть возвращение NaN
  • parseInt(dif) может быть возвращение NaN, потенциально вызванного
    • value быть NaN или
    • $(this).attr('oldvalue') возвращение что-то, что не может быть принужден к ряду
  • и т.п.

(Side комментарий: почему вы parseInt() ING dif? Это уже номер, или NaN. Кроме того, даже если бы она была строка, это глупо parseInt() его внутри цикла.)

+0

Вы правы. Когда я петлю над полями ввода, и если некоторые из них пусты, нет значения, они становятся NaN при анализе. – Kenci