Проблема с преобразованием типов Javascript
Доброго времени суток, Булчане!
Пилю тут сайт (использую php, mysql, jquery, ajax), и нужно через аякс-запрос принять ответ от сервера (сервер в зависимости от параметро запроса посылает в ответ командой echo определённую цифру (от 0 до 3, если быть совсем точным), ну т.е. echo "2"; и т.п.), и в зависимости от этой цифры вывести определённое сообщение в <div> с помощью innerHTML. Вообщем суть проблемы - гугл хром отказывается преобазовывать принятый ответ в любые типы в ява-скрипте. Ответ принимается прекрасно и его можно вывести даже в любой элемент. Но его тип преобразовать невозможно в число, и как строка он тоже не обрабатывается. Я не пойму никак что это за тип такой. В Опере (а я работаю только в ней и ни в чём больше, но сайт увы не для меня одного) меня всё пучком работает и преобразуется как надо (с помощью parseInt() вообще замечательно). Тот же parseInt() в хроме выдаёт NaN. Уже попробовал всё что нашёл в тырнете (преобразовывал даже в строку путём кода var st = new String(...), а потом в число), всё равно не пашет. toString() тоже не помогает. Даже банальное умножение этого дела на 1 (да и на любое число) в опере выдаёт правильный результат, а в хроме - NaN. ЧЯДНТ? Объясните глупому пожалуйста. апд забыл код, который некорректно работает (все варианты приводить не буду): Код:
var resp = req.responseText; Следующий код работает как надо в хроме: Код:
var resp = 123; //если '123', то тоже работает правильно. Значит проблема именно в типе принятого ответа. Или в браузере, хотя это уже врятли :) |
Ответ: Проблема с преобразованием типов Javascript
Мэйби там где-нито лишний пробел, или какой нито мусор вначале\конце строки хром приаттачивает? В конце концов, можно тупо switch замутить, в лоб, если вариантов немного.
|
Ответ: Проблема с преобразованием типов Javascript
responseText - и так строка в любом случае.
Делать new String - не нужно. Затем ты строку умножаешь на 2. Что ты ожидаешь получить умножив строку на 2? Код:
var res = "2"; Далее преобразую в число, и вывожу тип переменной, саму переменную и затем умножение. |
Ответ: Проблема с преобразованием типов Javascript
Цитата:
Да не в том проблема. Если работать с переменными, которые я сам назначаю жёстко в скрипте - всё преобразуется. Проблема именно с принятым ответом от сервера. А умножал я просто так, что бы проверить. По идее же при умножении ведь перевод в число делается 100%. А вот typeOf полезная функция, попробую, узнаю что такое там приходит. Спасибо. |
Ответ: Проблема с преобразованием типов Javascript
Цитата:
Ты где-то реально напортачил. Если у тебя проблема с другим кодом, так почему ты его не выложишь? |
Ответ: Проблема с преобразованием типов Javascript
проблема не с другим кодом, а именно в том месте что я выложил. Принятый от сервера ответ не преобразуется в число, чего я и хочу добиться. Да и проблемы бы я не заметил никогда, если бы с гугл хрома не попытался проверить. В Опере ведь всё идеально работает.
Сейчас попробовал через typeof узнать тип ответа - вполне себе уверенный string. Странно, не пойму почему тогда преобразование не происходит. И не может преобразовать именно принятый от сервера ответ, потому что если руками создать переменную типа string - всё преобразуется как надо. Так, нашёл в чём проблема - хром (ну или его скриптовый движок точнее) приделывает 2 пробела в начале полученного ответа. Странно. Дайте мне ответ на вопрос: как преобразовать ответ от сервера в число? Способы из гугла возвращают NaN, все. Код:
var resp = parseInt(req.responseText); |
Ответ: Проблема с преобразованием типов Javascript
Собственно говоря решил проблему.
Опытным путём узнав что хром добавляет лишние пробелы в сообщение - я просто их обрезал и дальше преобразовал в число через parseInt: Код:
String.prototype.trim = function(str) { return str.replace(/^\s+|\s+$/g, ""); } |
Ответ: Проблема с преобразованием типов Javascript
Ну начну с того что возвращать просто число - никто так не делает.
Обычно возвращают JSON что в разы удобнее. Во вторых переписывать стандартную функцию trim - я бы не делал этого вообще. Это ужасный говнокод, и если ты юзаешь где-то ещё trim'ы, а обычно народ юзает, то у тебя на trim'ы будет уходить в раз 10 больше ресурсов чем на стандартный. Плюс писать так: PHP код:
Так что пиши так: PHP код:
Если шлёшь от сервера данные, и хочешь чтобы они были максимально идентичны, шли с нужным Content-Type который не будет модифицироваться броузерами, например: PHP код:
А вообще, я тебе порекомендую делать как все - шли JSON от сервера, так даже будет проще и удобнее слать сложные ответы. PHP код:
PHP код:
|
Ответ: Проблема с преобразованием типов Javascript
Спасибо большое! С JSON не работал ещё, но сейчас думаю пришла пора изучать данный вопрос. А то что сейчас у меня есть - сделано для отмазки, лишь бы работало. Плохо, да, нельзя так делать. Не отрррицаю (c) А.Р. Бородач :-) Про стандартную функцию trim не знал, каюсь. Набил в гугле "javascript убрать пробелы" и воспользовался первым попавшимся результатом. Потом бы всё равно конечно исправил, но да, глупо с моей стороны. Просто учусь делать активные сайты (пока что делаю копию сайта моего клана с юкоза). Собственно это всё что я тут спрашивал у меня в форме входа используется (4 варианта ответа сервера возможных: 0-входим, 1-ненайден логин, 2-неверный пароль, 3-почему-то не удалось войти), и в зависимости от ответа нужное действие (например 0 отправляет на скрипт входа после некоторого времени). Пока что вот разбираюсь с входом и сессиями пользователей. Вопросов вагон и мааааленькая тележка, а время на из изучение, увы, отсутствует :( А ещё форум собрался писать сам. Жесть короче, губозакатыватель нужно купить :-) |
Ответ: Проблема с преобразованием типов Javascript
Цитата:
Но вот запросы в гугл делать на русском - я настоятельно не рекомендую, т.к. 80% ответов есть на StackOverflow - а там по русски не болтают. Также форум я бы свой не писал, это слишком гемор. Лучше возьми какой phpBB и поставь, настрой, и можешь его изменять. Конечно писать свой форум - опыт, но думаю лучше писать что-то полезнее и опыт тоже будет. А для того чего есть уже решения - используй. |
Ответ: Проблема с преобразованием типов Javascript
Я так и не понял, откуда у автора появлялись лишние пробелы при получении ответа от сервера? Это же бред.
|
Ответ: Проблема с преобразованием типов Javascript
Дак вот я тоже думаю что бред, но гугл хром успешно к ответу приделывает 2-3 пробела. Сам. Ничего не говоря. Просто вот так принимает ответ и всё. А в Опере я такой проблемы не наблюдал. Возможно, какая то особенность движка хрома, или ещё чего. не знаю вообщем. Я бы и не подумал что там чтото лишнее придеывается, если бы ответ не запихнул в alert("msg:"+req.responseText);. Должна была получиться слитная строка наподобие msg:1, в опере так и получилось, а в хроме получилось msg: 1.
Ну сейчас я через JSON сдеал, как Максим посоветовал. Работает точно на опере и на хроме правильно, всё передаётся и принимается верно. |
Ответ: Проблема с преобразованием типов Javascript
А ещё такой момент, глянь свой php файл, и убедись что сразу на первой строке стоит <?php и затем нету ?> вообще в конце. Тогда может и не будет пробелов, но это хотя решает скорее проблему с пробелами на конце.
Но если <?php не на первой строке - то и на начале. Но как ты уже заметил JSON с этим сам справляется. |
Ответ: Проблема с преобразованием типов Javascript
Цитата:
Код:
<?php Или я неправильно понял? у меня файл выглядит следующим образом: Код:
<?php |
Ответ: Проблема с преобразованием типов Javascript
Цитата:
Если это полностью PHP файл, то закрывать тег не нужно - так избешишь пробелов и новой строки на конце строки. Потому что /n обычно не выводиться, но он присутствует почти во всех ответах от сервера. Следственно сравнение ответа с сервера с простой строкой порой выдаёт false, визуально они идентичны, но /n - не отображается при выводе или пробелы после строки, поэтому они разные. |
Часовой пояс GMT +4, время: 12:11. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot