2017-02-07 1 views
0

У меня возникла проблема с javascript, которую я использую как часть страницы результатов поиска, надеюсь, кто-то может помочь. У меня есть функция, которая проверяет, что переменная 'currentAmount' меньше, чем переменная 'total'. Если currentAmount меньше общего, тогда сделайте что-нибудь, иначе ничего не сделайте.Проблема с Javascript <оператор возвращает false, когда условие определенно верно

var currentAmount = document.getElementById('currentAmountHidField').value; 
    var total = '@Html.Raw(Json.Encode(Model.ResultCount))'; 
    var tempScrollTop = $(window).scrollTop(); 

    function loadMore() { 
     alert("current amount" + currentAmount); 
     alert("total" + total); 
     var listView = $("#propertyList").data("kendoListView"); 

     if (currentAmount < total) { 
      alert("function is being run"); 
      currentAmount = +currentAmount + 12; 
      document.getElementById('currentAmountHidField').value = currentAmount; 
      if (currentAmount >= total) { 
       $('#loadMoreButton').hide(); 
      } 
     } 
     else { 
      alert("function is not being run"); 
     } 

     listView.dataSource.pageSize(currentAmount); 
     listView.refresh(); 
     tempScrollTop = $(window).scrollTop(); 
    } 

В вышеприведенном currentAmount всегда первоначально будет 12. По большей части, это работает совершенно нормально, но для одного экземпляра поиска, где общая = 108, то Javascript обрабатывающего положение еще из функция. то есть предупреждение, в котором говорится, что «функция не выполняется». Я не могу понять, почему.

Обратите внимание, что там есть предупреждения для тестирования. Появится сообщение «currentAmount12», затем «total108», после чего «функция не запускается». Это не имеет никакого смысла? Я даже попытался сделать что-то еще с двумя цифрами (например, вычесть 12 из 108), чтобы проверить, обрабатываются ли они как числа, которые они есть. И, как я уже сказал, это работает для любой другой комбинации чисел, которые я смог проверить.

Это похоже на javascript, по одному критерию поиска, читает 12 как более 108. Интересно, что когда я хардкор значения 12 в первой строке функции loadMore, он будет работать как соответственно, но, очевидно, это нехорошо ,

Любая помощь вообще была бы весьма признательна. Почему javascript считает, что 12 больше 108?

Благодаря

+0

* «Проблема с Javascript <оператор возвращения ложным, когда условие, безусловно, верно» * Шаг 1: Отпусти убеждении, что условие правда. Это не так. Если бы это было так, оператор возвращал бы «true», а не «false». ['select' не нарушен] (https://pragprog.com/the-pragmatic-programmer/extracts/tips). –

+0

Запишите свои переменные и их тип непосредственно перед тестом: 'console.log (typeof total, total);'.Вы поймете, почему результат не тот, который, по вашему мнению, должен быть (обратите внимание, что строка не является числом). –

+0

Убедитесь, что вы сравниваете числа, а не строки. Вы можете сделать это разными способами, например: 'var total = Number ('@ Html.raw ...');' –

ответ

2

currentAmount и total являются строками, поэтому они сравниваются лексикографически, не численно. '12' больше, чем '108'.

Используйте parseInt(), чтобы преобразовать входное значение в число, и оставьте вне цитаты около total, поэтому это будет число.

var currentAmount = parseInt(document.getElementById('currentAmountHidField').value, 10); 
var total = @Html.Raw(Json.Encode(Model.ResultCount)); 

Вы, очевидно, знал, что это была проблема, когда Вы писали:

currentAmount = +currentAmount + 12; 

с + перед тем currentAmount для преобразования его в ряд (так что вы получите дополнение insteadof конкатенации). Я думаю, вы не знали, что это также влияет на сравнения.

+0

Вы находитесь на Бармаре. Я просто предположил, что их обрабатывают как числа, поскольку у меня не было никаких проблем с его работой, пока 12 не были против 109. Я вижу, что теперь это также сломалось бы на 100 -> 119, но те никогда не приходили в тест. Плохое тестирование, приветствие за помощь! – Johnathan

1

Все значения, которые вы получаете из элементов управления Form, являются строками, и это то, что содержит ваш currentAmount. Тогда внезапно это должно иметь смысл, например, «12» < «5», потому что «1» меньше «5».

Решение: используйте parseInt() или parseFloat(), чтобы получить фактические цифры в ваших переменных, а не строки, которые похожи на числа-но-арент.

0

любезно разобрать переменные типа String для всех желаемых типов: parseFloat/ParseInt

function loadMore() { 

currentAmount = parseInt(currentAmount); 
total = parseInt(currentAmount); 
... 


} 
Смежные вопросы