2014-01-29 2 views
4

Я сделал вызов AJAX, который просто возвращает номер:Chrome: ParseInt() возвращает NaN

var lastID = 0; 
var loading = true; 

// Get latest message ID 
$.ajax({ 
    url: "libs/getLatestMessageID.ajax.php", 
    dataType: "text", 
    type: "GET", 
    success: function(data) { 
     lastID = data; 
     console.log("Received latest message ID: " + typeof(data) + " \"" + data + "\" " + parseInt(data, 10)); 
    }, 
}); 

Что я получаю от сервера является строкой, например «21», который теперь нужно преобразовать в число, чтобы JS мог вычислить с ним. В Firefox, она отлично работает, выходной строки console.log() является:

Полученное последнее сообщение ID: строка "21" 21

Но Google Chrome делает ParseInt() вернуть это:

Полученное последнее сообщение ID: строка "21" NaN

То, что происходит здесь не так?

+0

Я попробовал его и без добавления базового параметра, ничего не работает. – webdesigner97

+0

Я думаю, что это должны быть данные.d' –

+0

Тот же результат с номером() и data.d: NaN – webdesigner97

ответ

5

Строка имеет префикс непечатаемых недопустимых символов, что приводит к тому, что parseInt() не сможет проанализировать строку как число и для этого возвращает NaN (Not-a-Number).

Как в комментарии вы можете проверить это, убегая строку:

... + escape(data) + ... 

Вы также можете использовать data.length, чтобы увидеть, если строка длины вы ожидаете.

Вам необходимо найти источник для этого (возможно, связанного с кодировкой), чтобы предотвратить префикс этой строки. Если вы не можете найти источник, временным решением было бы удалить строку перед тем, как передать ее в parseInt(), но это не рекомендуется для окончательного решения.

Вы можете использовать, например Regex раздеться из нечисловых символов:
Regex using javascript to return just numbers

(или использовать что-то, как предложено в комментариях)

Но в конце концов, вы хотите найти источник.

Обновление благодаря ссылке @ fero, это указывает на то, что получаемый вами символ происходит от маркера спецификации в исходном файле, чтобы указать порядок байтов.

Вы можете переписать файл без этого маркера или попытаться отключить его на стороне сервера перед отправкой данных. Если ваши данные UTF-8, это не повлияет на данные.

+1

Это хороший ответ. Давайте посмотрим, что я могу найти проблему. Mabye это кодирование связано? Вывод AJAX происходит из файла UTF-8 ... – webdesigner97

+0

@ webdesigner97 он может быть связан с кодировкой. Вы можете проверить, какую кодировку использует ваша страница (или установить явное кодирование на то, что вы используете UTF-8), а также проверить, настроен ли ваш сервер для возврата данных в ту же кодировку. – K3N

+1

Посмотрите на http://www.decodeunicode.org/u+FEFF – fero

1

Попробуйте это:

console.log("Received latest message ID: " + typeof(data) + " \"" + data + "\" " + parseInt(data.match(/\d/g).join(""))); 

На самом деле я фильтрование цифры от data с регулярными выражениями, как я думаю, что есть некоторые нечисловые данные поступают.

0
var data = parseInt(" 21", 10); 
alert(data); 

Это работает для меня в Google Chrome 32.0 и светлячок 27

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