Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Веб-программирование > JavaScript / HTML

JavaScript / HTML Создание динамической разметки страниц

Ответ
 
Опции темы
Старый 22.02.2013, 11:19   #1
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Проблема с преобразованием типов 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;
alert(resp);

var response = new String(resp);
response = response*2;
alert(response);
Результат: первое сообщение цифра с сервера (правильная), второе сообщение - NaN.

Следующий код работает как надо в хроме:

var resp = 123; //если '123', то тоже работает правильно.
alert(resp);
var response = new String(resp);
response = response*2;
alert(response);
Результат: сообщение 123 и сообщение 246.
Значит проблема именно в типе принятого ответа. Или в браузере, хотя это уже врятли
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 13:33   #2
Reizel
Задрот
 
Аватар для Reizel
 
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений
(для 863 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Мэйби там где-нито лишний пробел, или какой нито мусор вначале\конце строки хром приаттачивает? В конце концов, можно тупо switch замутить, в лоб, если вариантов немного.
__________________
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 15:08   #3
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Проблема с преобразованием типов Javascript

responseText - и так строка в любом случае.
Делать new String - не нужно.

Затем ты строку умножаешь на 2. Что ты ожидаешь получить умножив строку на 2?

var res = "2";
console.log(typeof(res));
console.log(res);

var number = parseInt(res);
console.log(typeof(number));
console.log(number);
console.log(number * 2);
Вот тут я беру строку с символом "2", вывожу сперва тип переменной затем саму переменную.
Далее преобразую в число, и вывожу тип переменной, саму переменную и затем умножение.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (22.02.2013)
Старый 22.02.2013, 15:51   #4
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Сообщение от MoKa Посмотреть сообщение
responseText - и так строка в любом случае.
Делать new String - не нужно.

Затем ты строку умножаешь на 2. Что ты ожидаешь получить умножив строку на 2?

var res = "2";
console.log(typeof(res));
console.log(res);

var number = parseInt(res);
console.log(typeof(number));
console.log(number);
console.log(number * 2);
Вот тут я беру строку с символом "2", вывожу сперва тип переменной затем саму переменную.
Далее преобразую в число, и вывожу тип переменной, саму переменную и затем умножение.

Да не в том проблема. Если работать с переменными, которые я сам назначаю жёстко в скрипте - всё преобразуется. Проблема именно с принятым ответом от сервера. А умножал я просто так, что бы проверить. По идее же при умножении ведь перевод в число делается 100%.

А вот typeOf полезная функция, попробую, узнаю что такое там приходит. Спасибо.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 16:20   #5
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Сообщение от St_AnGer Посмотреть сообщение
Да не в том проблема. Если работать с переменными, которые я сам назначаю жёстко в скрипте - всё преобразуется. Проблема именно с принятым ответом от сервера. А умножал я просто так, что бы проверить. По идее же при умножении ведь перевод в число делается 100%.

А вот typeOf полезная функция, попробую, узнаю что такое там приходит. Спасибо.
responseText - всегда будет строкой, в любом случае.
Ты где-то реально напортачил.

Если у тебя проблема с другим кодом, так почему ты его не выложишь?
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 19:00   #6
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Проблема с преобразованием типов Javascript

проблема не с другим кодом, а именно в том месте что я выложил. Принятый от сервера ответ не преобразуется в число, чего я и хочу добиться. Да и проблемы бы я не заметил никогда, если бы с гугл хрома не попытался проверить. В Опере ведь всё идеально работает.

Сейчас попробовал через typeof узнать тип ответа - вполне себе уверенный string. Странно, не пойму почему тогда преобразование не происходит. И не может преобразовать именно принятый от сервера ответ, потому что если руками создать переменную типа string - всё преобразуется как надо.

Так, нашёл в чём проблема - хром (ну или его скриптовый движок точнее) приделывает 2 пробела в начале полученного ответа. Странно.

Дайте мне ответ на вопрос: как преобразовать ответ от сервера в число? Способы из гугла возвращают NaN, все.

var resp = parseInt(req.responseText);
		            
switch (resp)
{
case 0:
case 1:
case 2:
case 3:
}
преобразование нужно для определения действия. Если брать case "0", case "1" и т.д., то результата всё равно нет, условия не срабатывают.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 19:37   #7
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Собственно говоря решил проблему.

Опытным путём узнав что хром добавляет лишние пробелы в сообщение - я просто их обрезал и дальше преобразовал в число через parseInt:
String.prototype.trim = function(str) { return str.replace(/^\s+|\s+$/g, ""); }		            
var resp = new String().trim(req.responseText);

switch (parseInt(resp))
{
...
}
Как то так. Может не красиво, но работает как часы. И в данном случае как раз подходит. Спасибо тем кто помогал и навёл на мысль!
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 21:14   #8
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Ну начну с того что возвращать просто число - никто так не делает.
Обычно возвращают JSON что в разы удобнее.

Во вторых переписывать стандартную функцию trim - я бы не делал этого вообще. Это ужасный говнокод, и если ты юзаешь где-то ещё trim'ы, а обычно народ юзает, то у тебя на trim'ы будет уходить в раз 10 больше ресурсов чем на стандартный.

Плюс писать так:
var resp = new String().trim(req.responseText); 
Это гиперговнокондство, т.к. ты уже имеешь прототип функцию для String'а.
Так что пиши так:
var resp req.responseText.trim(); 
Далее, да, ты никогда не должен полагаться на идентичность обработки ответов в броузерах на столь детальном уровне. Пустые пробелы или наличие /n или /r в конце сообщения. Также есть проблемы когда возвращается application/json, и в броузере стоит специальный аддон который json запросы красиво отображает - это дело вообще поломает твой запрос.
Если шлёшь от сервера данные, и хочешь чтобы они были максимально идентичны, шли с нужным Content-Type который не будет модифицироваться броузерами, например:
Content-Typetext/plain 
Такой запрос не должен быть обработан от сервера.

А вообще, я тебе порекомендую делать как все - шли JSON от сервера, так даже будет проще и удобнее слать сложные ответы.
header('Content-type: application/json');
$data = array();
$data['number'] = 4;
echo 
json_encode($data); 
И на клиенте так:
var data JSON.parse(req.responseText);
switch(
data.number) {
  ... 
Так ты сможешь слать любой приемлемой сложности данные, и без проблем парсить их в JSON.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (22.02.2013)
Старый 22.02.2013, 23:04   #9
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Сообщение от MoKa Посмотреть сообщение
Ну начну с того что возвращать просто число - никто так не делает.
Обычно возвращают JSON что в разы удобнее.

Во вторых переписывать стандартную функцию trim - я бы не делал этого вообще. Это ужасный говнокод, и если ты юзаешь где-то ещё trim'ы, а обычно народ юзает, то у тебя на trim'ы будет уходить в раз 10 больше ресурсов чем на стандартный.

Плюс писать так:
var resp = new String().trim(req.responseText); 
Это гиперговнокондство, т.к. ты уже имеешь прототип функцию для String'а.
Так что пиши так:
var resp req.responseText.trim(); 
Далее, да, ты никогда не должен полагаться на идентичность обработки ответов в броузерах на столь детальном уровне. Пустые пробелы или наличие /n или /r в конце сообщения. Также есть проблемы когда возвращается application/json, и в броузере стоит специальный аддон который json запросы красиво отображает - это дело вообще поломает твой запрос.
Если шлёшь от сервера данные, и хочешь чтобы они были максимально идентичны, шли с нужным Content-Type который не будет модифицироваться броузерами, например:
Content-Typetext/plain 
Такой запрос не должен быть обработан от сервера.

А вообще, я тебе порекомендую делать как все - шли JSON от сервера, так даже будет проще и удобнее слать сложные ответы.
header('Content-type: application/json');
$data = array();
$data['number'] = 4;
echo 
json_encode($data); 
И на клиенте так:
var data JSON.parse(req.responseText);
switch(
data.number) {
  ... 
Так ты сможешь слать любой приемлемой сложности данные, и без проблем парсить их в JSON.


Спасибо большое! С JSON не работал ещё, но сейчас думаю пришла пора изучать данный вопрос.
А то что сейчас у меня есть - сделано для отмазки, лишь бы работало. Плохо, да, нельзя так делать.
Не отрррицаю (c) А.Р. Бородач

Про стандартную функцию trim не знал, каюсь. Набил в гугле "javascript убрать пробелы" и воспользовался первым попавшимся результатом. Потом бы всё равно конечно исправил, но да, глупо с моей стороны.

Просто учусь делать активные сайты (пока что делаю копию сайта моего клана с юкоза).
Собственно это всё что я тут спрашивал у меня в форме входа используется (4 варианта ответа сервера возможных: 0-входим, 1-ненайден логин, 2-неверный пароль, 3-почему-то не удалось войти), и в зависимости от ответа нужное действие (например 0 отправляет на скрипт входа после некоторого времени). Пока что вот разбираюсь с входом и сессиями пользователей. Вопросов вагон и мааааленькая тележка, а время на из изучение, увы, отсутствует А ещё форум собрался писать сам. Жесть короче, губозакатыватель нужно купить
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 22.02.2013, 23:09   #10
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Сообщение от St_AnGer Посмотреть сообщение

Спасибо большое! С JSON не работал ещё, но сейчас думаю пришла пора изучать данный вопрос.
А то что сейчас у меня есть - сделано для отмазки, лишь бы работало. Плохо, да, нельзя так делать.
Не отрррицаю (c) А.Р. Бородач

Про стандартную функцию trim не знал, каюсь. Набил в гугле "javascript убрать пробелы" и воспользовался первым попавшимся результатом. Потом бы всё равно конечно исправил, но да, глупо с моей стороны.

Просто учусь делать активные сайты (пока что делаю копию сайта моего клана с юкоза).
Собственно это всё что я тут спрашивал у меня в форме входа используется (4 варианта ответа сервера возможных: 0-входим, 1-ненайден логин, 2-неверный пароль, 3-почему-то не удалось войти), и в зависимости от ответа нужное действие (например 0 отправляет на скрипт входа после некоторого времени). Пока что вот разбираюсь с входом и сессиями пользователей. Вопросов вагон и мааааленькая тележка, а время на из изучение, увы, отсутствует А ещё форум собрался писать сам. Жесть короче, губозакатыватель нужно купить
Ну конечно, спрашивай тут, чем можем поможем.

Но вот запросы в гугл делать на русском - я настоятельно не рекомендую, т.к. 80% ответов есть на StackOverflow - а там по русски не болтают.

Также форум я бы свой не писал, это слишком гемор. Лучше возьми какой phpBB и поставь, настрой, и можешь его изменять.
Конечно писать свой форум - опыт, но думаю лучше писать что-то полезнее и опыт тоже будет. А для того чего есть уже решения - используй.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
St_AnGer (22.02.2013)
Старый 23.02.2013, 05:01   #11
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Я так и не понял, откуда у автора появлялись лишние пробелы при получении ответа от сервера? Это же бред.
(Offline)
 
Ответить с цитированием
Старый 23.02.2013, 13:34   #12
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Дак вот я тоже думаю что бред, но гугл хром успешно к ответу приделывает 2-3 пробела. Сам. Ничего не говоря. Просто вот так принимает ответ и всё. А в Опере я такой проблемы не наблюдал. Возможно, какая то особенность движка хрома, или ещё чего. не знаю вообщем. Я бы и не подумал что там чтото лишнее придеывается, если бы ответ не запихнул в alert("msg:"+req.responseText);. Должна была получиться слитная строка наподобие msg:1, в опере так и получилось, а в хроме получилось msg: 1.

Ну сейчас я через JSON сдеал, как Максим посоветовал. Работает точно на опере и на хроме правильно, всё передаётся и принимается верно.
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 24.02.2013, 16:08   #13
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Проблема с преобразованием типов Javascript

А ещё такой момент, глянь свой php файл, и убедись что сразу на первой строке стоит <?php и затем нету ?> вообще в конце. Тогда может и не будет пробелов, но это хотя решает скорее проблему с пробелами на конце.
Но если <?php не на первой строке - то и на начале.
Но как ты уже заметил JSON с этим сам справляется.
(Offline)
 
Ответить с цитированием
Старый 24.02.2013, 20:14   #14
St_AnGer
Элита
 
Аватар для St_AnGer
 
Регистрация: 21.01.2010
Адрес: Россия, Рязанская область, г.Михайлов
Сообщений: 2,067
Написано 1,185 полезных сообщений
(для 2,828 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Сообщение от MoKa Посмотреть сообщение
А ещё такой момент, глянь свой php файл, и убедись что сразу на первой строке стоит <?php и затем нету ?> вообще в конце...
Что то как то я не въехал, честно. Т.е. файл должен выглядеть так:
<?php
...
содержимое файла
...
?
Или я неправильно понял?

у меня файл выглядит следующим образом:
<?php
...
содержимое файла
...
?>
__________________
Main PC:
Intel Core i5 4260U 1.44 GHz + LPDDR3 1x4096 1600 MHz + Intel HD Graphics 5000.

Asus Ёжик T101-MT:
Intel Atom N-570 1.66 Ghz + DDR2 2x1024 800 Mhz + Intel GMA 3150 128 Mb DDR2


Скачать Doom 2D: Remake v0.3.8a
(Offline)
 
Ответить с цитированием
Старый 24.02.2013, 21:26   #15
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Проблема с преобразованием типов Javascript

Сообщение от St_AnGer Посмотреть сообщение
Что то как то я не въехал, честно. Т.е. файл должен выглядеть так:
<?php
...
содержимое файла
...
?
Или я неправильно понял?

у меня файл выглядит следующим образом:
<?php
...
содержимое файла
...
?>
Верно, то что ты в первом варианте привел.
Если это полностью PHP файл, то закрывать тег не нужно - так избешишь пробелов и новой строки на конце строки.
Потому что /n обычно не выводиться, но он присутствует почти во всех ответах от сервера.
Следственно сравнение ответа с сервера с простой строкой порой выдаёт false, визуально они идентичны, но /n - не отображается при выводе или пробелы после строки, поэтому они разные.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Randomize (18.09.2018), St_AnGer (24.02.2013)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 08:21.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com